This commit is contained in:
Felipe M 2021-12-01 18:33:44 +00:00
commit 88df80ac54
445 changed files with 15901 additions and 0 deletions

0
.nojekyll Normal file
View File

1
CNAME Normal file
View File

@ -0,0 +1 @@
fmartingr.com

62
about/index.html Normal file
View File

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>About | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="about">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a href="/blog/">/blog</a>
<a class="text-bold" href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<h2>About</h2>
<div>
<p>Hi! I'm Felipe, and I am a developer. Whatever that is.</p>
<p>I have been playing with code for a while now, but I also enjoy geeking around with computers, algorithms and other stuff; the less I know about it, the better!
Learning new things every day is my way of life.</p>
<p>I think that developers are like artists, writers and composers... we all make art. But we don't use strokes and colors, words or notes, we make it through code. And I really love it.</p>
<p>If you want to get in touch feel free to drop me a line.</p>
<ul>
<li><a target="_blank" href="mailto:me@fmartingr.com">me@fmartingr.com</a></li>
<li><a target="_blank" href="https://www.linkedin.com/in/fmartingr/">linkedin.com/fmartingr</a></li>
<li><a target="_blank" rel="me" href="https://twitter.com/fmartingr">twitter.com/fmartingr</a></li>
<li><a target="_blank" rel="me" href="https://fosstodon.org/@fmartingr">fmartingr@fosstodon.org</a></li>
<li><a target="_blank" href="https://t.me/fmartingr">telegram.me/fmartingr</a></li>
<li><a target="_blank" href="https://github.com/fmartingr">github.com/fmartingr</a></li>
<li><a target="_blank" href="https://code.fmartingr.dev/fmartingr">code.fmartingr.dev/fmartingr</a>, personal git server</li>
</ul>
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Amazon S3 bucket public read policy | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2012/11/23/amazon-s3-bucket-public-read-policy/">Amazon S3 bucket public read policy</a></h1>
<div class="info">
Published on November 23, 2012
</div>
<div class="content">
<p>After migrating the blog to a PaaS service I had a proble that the disk space
was volatile and I had to store the images and binary files on another server
or CDN. After thinking for a while I decied to give a try to amazon S3.</p>
<p>Created a bucket that I'm going to use as CDN for now on, but geeking around I
saw that the permissions are modified by file, not by folder/bucket. Searching
aroung the docs I found the policies, that are JSON strings wich include
properties for the entire bucket.</p>
<p>For making a read-only public bucket you need this:</p>
<div class="hll"><pre><span></span><span class="p">{</span>
<span class="s2">&quot;Version&quot;</span><span class="o">:</span> <span class="s2">&quot;2008-10-17&quot;</span><span class="p">,</span>
<span class="s2">&quot;Statement&quot;</span><span class="o">:</span> <span class="p">[{</span>
<span class="s2">&quot;Sid&quot;</span><span class="o">:</span> <span class="s2">&quot;AllowPublicRead&quot;</span><span class="p">,</span>
<span class="s2">&quot;Effect&quot;</span><span class="o">:</span> <span class="s2">&quot;Allow&quot;</span><span class="p">,</span>
<span class="s2">&quot;Principal&quot;</span><span class="o">:</span> <span class="p">{</span>
<span class="s2">&quot;AWS&quot;</span><span class="o">:</span> <span class="s2">&quot;*&quot;</span>
<span class="p">},</span>
<span class="s2">&quot;Action&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;s3:GetObject&quot;</span><span class="p">],</span>
<span class="s2">&quot;Resource&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;arn:aws:s3:::/*&quot;</span><span class="p">]</span>
<span class="p">}]</span>
<span class="p">}</span>
</pre></div>
<p>Replace &lt;bucket name&gt; for yours and apply changes. With this the entire
bucket will be publicy accesible, but if you want to be more restrictive, you
may specify a subfolder:</p>
<div class="hll"><pre><span></span><span class="s2">&quot;Resource&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;arn:aws:s3:::&lt;bucket&gt;/&lt;path&gt;/*&quot;</span><span class="p">]</span>
</pre></div>
<p>Hope this helps.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HowTo: OS X screenshots without shadows | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2012/12/20/howto-os-x-screenshots-without-shadows/">HowTo: OS X screenshots without shadows</a></h1>
<div class="info">
Published on December 20, 2012
</div>
<div class="content">
<p>The beautiful shadows that OS X brings to screenshots are good in some ways or
depending the purpose of the screenshot itself. But for other things are a
pain in the ass.</p>
<p>After some research I've found multiple ways to get rid of that shadows</p>
<h2 id="1-the-default-setting">1) The default setting</h2><p>Since the terminal command allows you to deactivate the shadow I assumed that
there could be some <code>defaults</code> option for the same purpose. And it is!</p>
<p>With this two commands you can use the normal keybinds to do <em>shadowless</em>
screenshots:</p>
<div class="hll"><pre><span></span>defaults write com.apple.screencapture disable-shadow -bool true killall SystemUIServer`
</pre></div>
<p>To revert to the original status:</p>
<div class="hll"><pre><span></span>defaults write com.apple.screencapture disable-shadow -bool false killall SystemUIServer
</pre></div>
<h2 id="2-the-grab-utility">2) The Grab utility</h2><p>Open the Grab.app: <code>Applications &gt; Utilities &gt; Grab</code>, and under the <code>Capture</code>
menu you will find the <code>Window</code> option.</p>
<p>You can also use the <code>SHIFT</code>+<code>CMD</code>+<code>W</code> keybind -while Grab.app is focused-.</p>
<h2 id="3-the-terminal-way">3) The terminal way</h2><p>OS X provides us with the <code>screencapture</code> command, so we can hack around and
build our own scripts. A simple one that allows interactive capture without
shadow:</p>
<div class="hll"><pre><span></span>screencapture -i -o filename.png
</pre></div>
<p>A more complete one that saves the screenshot on the desktop with the datetime
as filename:</p>
<div class="hll"><pre><span></span>screencapture -i -o ~/Desktop/screenshot_`date +%Y%m%d_%H%M%S`.png
</pre></div>
<p>These are some ways I found. You can play around and make your own bash or
Automator scripts and improve it to your needs.</p>
<p>Hope this helps!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My SublimeText 2 workspace | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2012/12/21/my-sublimetext-2-workspace/">My SublimeText 2 workspace</a></h1>
<div class="info">
Published on December 21, 2012
</div>
<div class="content">
<h2 id="package-control">Package Control</h2><p>Essential. Install this and forget about downloading files, updating, … Choose
to use or not every other plugin, but this one is mandatory. Just install it.</p>
<h2 id="soda-theme">Soda theme</h2><p>The best theme I've seen for SublimeText. It's really clean and elegant. Don't
forget to use it's custom colors too!</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/SodaTheme.png" alt="&#34;Soda
theme&#34;"></p>
<h2 id="sublimelinter">SublimeLinter</h2><p>Highlight potential errors using <em>lint</em> programs so you can keep your code
clean.</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/SublimeLinter.png" alt="&#34;Example of
SublimeLinter&#34;"></p>
<h2 id="sublimecode-intel">SublimeCode Intel</h2><p>Helps with autocomplete, allows <em>jump-to</em> and displays information of the
highlighted function on the status bar.</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/SublimeCodeIntel.png" alt="&#34;Example of SublimeCode
Intel&#34;"></p>
<h2 id="sublimerope-python-only">SublimeRope [<strong>Python only!</strong>]</h2><p>Add a lot of IDE-like features to python developers thanks to the rope
library.</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/SublimeRope.png" alt="&#34;Example of
SublimeRope&#34;"></p>
<h2 id="git-gitgutter">Git &amp; GitGutter</h2><p>The first one is a tool to integrate git commands onto the command palette,
the second one inserts an icon in the gutter area whether a line has been
modified, added or removed.</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/GitGutter.png" alt="&#34;Example of
GitGutter&#34;"></p>
<h2 id="sidebarenchancements">SideBarEnchancements</h2><p>Add tons of functions to the sidebar contextual menu!</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/SidebarEnhancements.png" alt="&#34;SidebarEnhancements contextual
menu&#34;"></p>
<h2 id="advancednewfile">AdvancedNewFile</h2><p>This is the best. Create a new file just with a key combination, no popups, no
nothing. Just press <code>CMD</code>+<code>ALT</code>+<code>N</code>, write the full path -relative to your
project path- of the file you want to create and press enter.</p>
<p><img src="/blog/2012/12/21/my-sublimetext-2-workspace/AdvancedNewFile.png" alt="&#34;Example of
AdvancedNewFile&#34;"></p>
<p>I use some other plugins, but this is my top. Do you use other really good
plugins not listed here? Tell me!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,141 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Weekly project status: Dropping projects is hard | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/01/12/weekly-project-status-dropping-projects-hard/">Weekly project status: Dropping projects is hard</a></h1>
<div class="info">
Published on January 12, 2013
</div>
<div class="content">
<p><img src="/blog/2013/01/12/weekly-project-status-dropping-projects-hard/weekly-project-status-banner.jpg" alt=""></p>
<p>Since I wrote <a href="http://fmartingr.com/blog/2012/12/31/2013/">the last post of
2012</a> I have been wondering if I
could finish -or at least, work- on all the projects or experiments I wanted
to. The answer was easy: <strong>no</strong>. I just don't have enough time for all the
stuff I want to do, so I have made some decisions about my projects.</p>
<h2 id="project-herobrine-dropped">Project <em>herobrine</em> <strong><em>…dropped!</em></strong></h2><p><img src="/blog/2013/01/12/weekly-project-status-dropping-projects-hard/minecraft-database.png" alt="&#34;Early draft of Project
Herobrine&#34;"></p>
<p>The first time I did something about this project was like 2010, as some of
you have guessed by the name of the project, its minecraft related. It was
intended to be a <em>wowhead-like</em> minecraft database but not only on PC.</p>
<p>Some features I wanted:</p>
<ul>
<li>Developed with django, returning json objects to the client.</li>
<li>Client MVC based with BackboneJS</li>
<li>Responsive design -so you can check with your tablet while play on your computer-</li>
<li>"no refresh" -backbone-</li>
<li>WebGL/Canvas block rendering</li>
<li>JS Redstone circuit maker</li>
<li>JS Dye maker</li>
<li>Homepage with random background featuring user's screenshots (above)</li>
<li>Interactive crafting/brewing/…</li>
</ul>
<p>Finally I have to say goodbye to this <em>jewel</em> -and it's really hard because I
love minecraft and I wanted this to happen- because of various reasons:
<a href="http://minecraftwiki.net/">minecraftwiki</a> already contains a lot of
information -and it's really crowded-, the barrier of contents -I have to type
in all the minecraft items, blocks, biomes, etc- and that this wasn't really a
technical challenge -actually, some things are, but most of it are just
database relations and stuff-.</p>
<p>I want to prepare a future post with all the work I made on this project.
There's not much code but a lot of drafts and ideas that could help someone.</p>
<h2 id="project-serenity-dropped">Project <em>Serenity</em> <strong><em>…dropped!</em></strong></h2><p>This was intended to be a way to simplify my jenkins business. Since I need a
lot of tasks like: compile, minify, copy, deploy, upload, test… I wanted an
app so I just define everything I need on a <em>YAML</em> file and call the app with
<code>serenity &lt;task&gt;</code>.</p>
<p>I have some drafts built, a base YAML file, and some features planned like
integrated tasks, custom tasks in the YAML file, configuration…</p>
<p>Haven't coded for this one yet, but fortunately I heard about
<a href="http://gruntjs.com/">grunt</a> who may be something very close at what I wanted
this one to be.</p>
<h2 id="zombiepress-github-http//github-com/fmartingr/zombiepress/">ZombiePress (<a href="http://github.com/fmartingr/zombiepress/">github</a>)</h2><p><strong><em>…dropped!</em></strong></p>
<p>It's obvious. I was making my own blog software but since now I'm a proud
octopress user this is no longer needed. I will keep the repo online just for
making me feel nostalgic in the future.</p>
<h2 id="bluebird-dropped">BlueBird <strong><em>…dropped!</em></strong></h2><p>For all the iPad users… remember when Twitter changed the UI of the app? Did
you remember the old one? I do. The new interface is <strong>total crap</strong>, the other
was simply brilliant, and for me it was near the best one for an iOS app. I
was hoping to get a clone working in javascript, but my knowledge of touch
screens is not that good, I need to study more on the matter and then<strong>maybe</strong>
I will try again, but I'm pretty sure some javascript guru will do something
before that happens.</p>
<h2 id="project-amaranth">Project <em>Amaranth</em></h2><p>The bigger brother. Recently I started a Vampire: Dark Age game with some
friends and it remembered me to when I played rolegames over IRC. I started
thinking that a online interface for roleplaying will be nice to have, because
you can also use it in a live session to whisper, draw, etc. The brainstorm
started quick enough for me to consider making it.</p>
<h2 id="project-rtc">Project <em>RTC</em></h2><p>Just born! -yesterday :P-. I want to make some kind of webRTC site to have
conversations without the need of register, just create a conversation, get a
link and you are set. It's more an experiment than a project itself.</p>
<h2 id="uvepe8-github-http//github-com/fmartingr/uvepe8/">Uvepe8 (<a href="http://github.com/fmartingr/uvepe8/">github</a>)</h2><p>I'm very proud -in a useful way- of this one and of course I'm maintaining it.</p>
<p>For the ones who don't know, its sort of <em>video-to-html5-canvas</em>, a mix
between apple's and sublime text's, but mines support transparency -I needed
it-.</p>
<p>There are some features I want to implement shown on the README file and a
full code review.</p>
<h2 id="dharma-github-http//github-com/fmartingr/dharma/">Dharma (<a href="http://github.com/fmartingr/dharma/">github</a>)</h2><p>An application to check for 404 links on websites, a lot of things could be
added to this, but for now is for playing around with threading, gevent and
that kind of things.</p>
<p>I have some <em>other things</em> in mind I want to try, but that deserves another
post -which is already in the works-.</p>
<p>Stay tuned for more updates, and as always, anything you want to say: comment,
tweet, mail or shout at me!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tweeria: The MMORPG people without time can play | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/">Tweeria: The MMORPG people without time can play</a></h1>
<div class="info">
Published on January 14, 2013
</div>
<div class="content">
<p><img src="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/header.png" alt="&#34;Tweeria
summary&#34;"></p>
<p>Many of us -or maybe not, but let's assume that- have played at least one
<em>MMORPG</em> game in our life and we know that it could be <em>very</em> time consuming.
Level up, going to instances, getting better year… and if you was <em>hardcore</em>
enough: scheduled raids.</p>
<p>As we grow up we notice that the time for this kind of things fade away, but
you still want to party with friends and get some<em>purples</em>. Until I found
<strong>Tweeria</strong>, that <strong>brilliant idea</strong> of using your twitter posts to interact
with your <em>alter-ego</em> on a MMORPG world.</p>
<p><img src="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/profile.png" alt="&#34;My
profile&#34;"></p>
<p>It shares some of the features of common MMORPGs but the good part is that
<strong>we don't need to do anything else that <em>tweet</em></strong>for many of them, so your
character makes an action for every tweet you post -I think it's not every
tweet, just a few in a period of time, haven't checked it-. You can defeat
<em>NPCs</em>, loot an item, going onto a dungeon alone… you can even save -or kill
:P- your friends if you mention or <em>retweet</em> them in your tweets.</p>
<p><img src="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/events.png" alt="&#34;Upcoming and in-progress
raids&#34;"></p>
<p>However, there are some things that needs user interaction: the raids. You can
have up to five scheduled raids at the same time but you need to join for it
manually. However, it's fast and easy: you just need to get into the events
page and join the event you want. For gear swapping, selling items and buying
spells you need to interact on the site too. According to the posts you can
craft items and spells but that part of the game does not work for me, so I
don't know how it works.</p>
<p><img src="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/stats.png" alt="&#34;Some tweeria stats
windows&#34;"></p>
<p>Another thing you can do to interact with your character is using spells. For
that, you need to buy on the market first, and when you have them equipped,
you can cast one by tweeting <code>!&lt;spell shortcut&gt;</code> on a given tweet, the game
will use it<em>automagically</em>.</p>
<p>Oh, did I mention that also have <strong>achievements</strong>?</p>
<p><img src="/blog/2013/01/14/tweeria-mmorpg-people-without-time-can-play/map.png" alt="&#34;The beautiful
map&#34;"></p>
<p>As I've said, it surprised me how the most basic idea can be developed into a
very enjoyable game. Unlike <em>ogame</em>, <em>travian</em>, and its brothers, you don't
need to check the site every minute.
But to be honest… I tweet more often since I play <em>Tweeria</em>.</p>
<p>If you want to check it out <a href="http://tweeria.com/registration?fmartingr">follow this link and join the world of
tweeria</a>. You'll help me getting an
achievement! :D</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Manga Recommendation: Kamisama no Iutoori (Fujimura Akeji) | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/01/20/manga-recommendation-kamisama-no-iutoori-fujimura-akeji/">Manga Recommendation: Kamisama no Iutoori (Fujimura Akeji)</a></h1>
<div class="info">
Published on January 20, 2013
</div>
<div class="content">
<p><img src="/blog/2013/01/20/manga-recommendation-kamisama-no-iutoori-fujimura-akeji/kamisama-no-
iutoori.jpg" alt="&#34;Kamisama no Iutoori \(FUJIMURA
Akeji\)&#34;"></p>
<h3 id="summary">Summary</h3><p>Takahata Shun's day at high school begins just as normal and boring as ever,
but it doesn't end that way. After his teacher's head explodes, he and his
classmates find themselves forced to play children's games, such as Daruma ga
Koronda (a game like Red Light/Green Light), with deadly stakes. With no idea
who is behind this mysterious deadly game session, and no way of knowing when
it will finally end, the only thing Shun and other students can do is keep
trying to win…</p>
<p><strong>Volumes</strong>: 5
<strong>Chapters</strong>: 21 (finished)
<strong>Genre</strong>: Action, Horror, School, Shonen, Supernatural
<strong>Story</strong>: Muneyuki Kaneshiro
<strong>Art</strong>: Akeji Fujimura</p>
<p>Thanks to <a href="http://twitter.com/rsanchezbalo">@rsanchezbalo</a> for his
recommendation!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Manga recommendation: Psyren | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/02/23/manga-recommendation-psyren/">Manga recommendation: Psyren</a></h1>
<div class="info">
Published on February 23, 2013
</div>
<div class="content">
<p><img src="/blog/2013/02/23/manga-recommendation-psyren/psyren-cover.png" alt="&#34;Psyren&#34;"></p>
<h3 id="summary">Summary</h3><p>Psyren follows the adventures of Ageha Yoshina, a high school student who is
chosen by Nemesis Q as a participant in the Psyren games. The games take place
in a world known initially as Psyren, which is revealed to be the real world a
decade in the future. Ageha and his friends attempt to alter the future and
save the world from becoming Psyren.</p>
<p><strong>Volumes</strong>: 16
<strong>Chapters</strong>: 145 (finished)
<strong>Genre</strong>: Action, Adventure, Game, Romance, Sci-Fi, Shounen, Super Power, Supernatural, Psychological
<strong>Story/Art</strong>: Tokashi Iwashiro</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View File

@ -0,0 +1,357 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Where to buy Warcraft books ordered by storyline | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/02/23/where-buy-warcraft-books-ordered-storyline/">Where to buy Warcraft books ordered by storyline</a></h1>
<div class="info">
Published on February 23, 2013
</div>
<div class="content">
<p>I've reunited a list with all the warcraft books sorted by the storyline of
the lore. Some of 'em occur at the same time so if you see the same book twice
that's the reason.</p>
<p>More info on <a href="http://www.wowwiki.com/Story_guide">WowWiki</a>.</p>
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Book name</th>
<th>Amazon COM</th>
<th>Amazon UK</th>
<th>Kindle</th>
<th>BookDepository</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pre-game timeline events</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>The war of the ancients Trilogy</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>- The Well of Eternity</td>
<td><a href="http://www.amazon.com/The-Well-Eternity-WarCraft-Ancients/dp/0743471199/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Well-Eternity-Bk-Ancients/dp/0743471199/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Ancients-Well-Eternity-ebook/dp/B000FC1LP6/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Well-Eternity-Bk-1-Richard-Knaak/9780743471190">BookDepository</a></td>
</tr>
<tr>
<td>- The Demon Soul</td>
<td><a href="http://www.amazon.com/Demon-Soul-Warcraft-Ancients-Book/dp/0743471202/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Demon-Soul-Bk-Ancients/dp/0743471202/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Ancients-Demon-Soul-ebook/dp/B000QBYENC/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Demon-Soul-Bk-2-Richard-Knaak/9780743471206">BookDepository</a></td>
</tr>
<tr>
<td>- The Sundering</td>
<td><a href="http://www.amazon.com/Sundering-Warcraft-Ancients-Trilogy-Book/dp/0743471210/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/gp/product/0743471210/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Sundering-Bk-War-Ancients/dp/0743471210/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Sundering-Bk-3-Richard-Knaak/9780743471213">BookDepository</a></td>
</tr>
<tr>
<td>War of the Shifting Sands [<em>Short story</em>]</td>
<td><a href="http://us.battle.net/wow/en/game/lore/short-story/shifting-sands/1">Battle.net</a></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Rise of the Horde</td>
<td><a href="http://www.amazon.com/World-Warcraft-Rise-Horde-No/dp/0743471385/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Rise-Horde-No-World-Warcraft/dp/0743471385/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Rise-Horde-ebook/dp/B000QCTN50/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Rise-Horde-Rise-Horde-No-4-Christie-Golden/9780743471381">BookDepository</a></td>
</tr>
<tr>
<td>Unbroken [<em>Short story</em>]</td>
<td><a href="http://us.battle.net/wow/en/game/lore/short-story/unbroken/1">Battle.net</a></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><strong>Warcraft: Orcs and Humans</strong></td>
<td><em>The first war</em></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Last Guardian</td>
<td><a href="http://www.amazon.com/Last-Guardian-Warcraft-Book-No-3/dp/0671041517/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Last-Guardian-No-3/dp/0671041517/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/The-Warcraft-Last-Guardian-ebook/dp/B000FC0QTS/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Last-Guardian-No3-Jeff-Grubb/9780671041519">BookDepository</a></td>
</tr>
<tr>
<td><strong>Warcraft II</strong></td>
<td><em>The second war</em></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Tides of Darkness</td>
<td><a href="http://www.amazon.com/Tide-Darkness-Warcraft-Aaron-Rosenberg/dp/1416539905/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Tides-Darkness-World-Warcraft-Rosenberg/dp/1416539905/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Tides-Darkness-ebook/dp/B000UZQJIC/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Tides-Darkness-Aaron-Rosenberg/9781416539902">BookDepository</a></td>
</tr>
<tr>
<td>Beyond the Dark Portal</td>
<td><a href="http://www.amazon.com/Beyond-Dark-Portal-World-Warcraft/dp/1416550860/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Beyond-Dark-Portal-World-Warcraft/dp/1416550860/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Beyond-Portal-ebook/dp/B0013TX8YC/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Beyond-Dark-Portal-Aaron-Rosenberg/9781416550860">BookDepository</a></td>
</tr>
<tr>
<td><strong>Post-Warcraft II</strong> &amp; <strong>Pre-Warcraft III</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Day of the Dragon</td>
<td><a href="http://www.amazon.com/Day-Dragon-WarCraft-Book-No-1/dp/0671041525/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Day-Dragon-No-1/dp/0671041525/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Day-Dragon-No-1-ebook/dp/B000FBJHTY/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Day-Dragon-No1-Richard-Knaak/9780671041526">BookDepository</a></td>
</tr>
<tr>
<td>Lord of the Clans</td>
<td><a href="http://www.amazon.com/Lord-Clans-Warcraft-Book-2/dp/0743426908/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Lord-Clans-No/dp/0743426908/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Lord-Clans-2-ebook/dp/B000FC0RC4/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Lord-Clans-No-2-Christie-Golden/9780743426909">BookDepository</a></td>
</tr>
<tr>
<td>Of Blood and Honor</td>
<td><a href="http://www.amazon.com/Warcraft-Blood-Honor-ebook/dp/B000FC0WII/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Blood-Honor-ebook/dp/B003ZDOVGI/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Of-Blood-Honor-ebook/dp/B000FC0WII/">Kindle</a></td>
<td>&ndash;</td>
</tr>
<tr>
<td>Road to Damnation [<em>Short story</em>]</td>
<td><a href="http://us.battle.net/wow/en/game/lore/short-story/damnation/1">Battle.net</a></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><strong>Warcraft III: Reign of Chaos</strong></td>
<td><em>The third war</em></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Arthas: Rise of the Lich King</td>
<td><a href="http://www.amazon.com/World-Warcraft-Arthas-Rise-Lich/dp/143915760X/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Arthas-Rise-Lich-World-Warcraft/dp/143915760X/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-of-Warcraft-Arthas-ebook/dp/B001NLL6LM/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/World-Warcraft-Arthas-Christie-Golden/9781416550778">BookDepository</a></td>
</tr>
<tr>
<td><strong>Warcraft III: The Frozen Throne</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>The war of the ancients Trilogy</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>- The Well of Eternity</td>
<td><a href="http://www.amazon.com/The-Well-Eternity-WarCraft-Ancients/dp/0743471199/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Well-Eternity-Bk-Ancients/dp/0743471199/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Ancients-Well-Eternity-ebook/dp/B000FC1LP6/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Well-Eternity-Bk-1-Richard-Knaak/9780743471190">BookDepository</a></td>
</tr>
<tr>
<td>- The Demon Soul</td>
<td><a href="http://www.amazon.com/Demon-Soul-Warcraft-Ancients-Book/dp/0743471202/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Demon-Soul-Bk-Ancients/dp/0743471202/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/Warcraft-Ancients-Demon-Soul-ebook/dp/B000QBYENC/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Demon-Soul-Bk-2-Richard-Knaak/9780743471206">BookDepository</a></td>
</tr>
<tr>
<td>- The Sundering</td>
<td><a href="http://www.amazon.com/Sundering-Warcraft-Ancients-Trilogy-Book/dp/0743471210/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/gp/product/0743471210/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.co.uk/Warcraft-Sundering-Bk-War-Ancients/dp/0743471210/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Sundering-Bk-3-Richard-Knaak/9780743471213">BookDepository</a></td>
</tr>
<tr>
<td>Cycle of Hatred</td>
<td><a href="http://www.amazon.com/Cycle-Hatred-World-Warcraft-Bk/dp/0743471369/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Cycle-Hatred-World-Warcraft-Paperback/dp/0743471369/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Cycle-Hatred-ebook/dp/B000GCFXKY/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Warcraft-Cycle-Hatred-Bk-4-Keith-DeCandido/9780743471367">BookDepository</a></td>
</tr>
<tr>
<td><strong>World of Warcraft</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>War of the Shifting Sands [<em>Short story</em>]</td>
<td><a href="http://us.battle.net/wow/en/game/lore/short-story/shifting-sands/1">Battle.net</a></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><strong>WoW: The Burning Crusade</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Night of the Dragon</td>
<td><a href="http://www.amazon.com/World-Warcraft-Dragon-Richard-Knaak/dp/0743471377/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Night-Dragon-World-Warcraft-Richard/dp/0743471377/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Night-Dragon-ebook/dp/B001FA0I2Y/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Night-Dragon-Richard-Knaak/9780743471374">BookDepository</a></td>
</tr>
<tr>
<td><strong>WoW: Wrath of the Lich King</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Stormrage</td>
<td><a href="http://www.amazon.com/World-Warcraft-Stormrage-Richard-Knaak/dp/1439189463/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Stormrage-World-Warcraft-Richard-Knaak/dp/1439189463/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-of-Warcraft-Stormrage-ebook/dp/B0037714S0/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Stormrage-Richard-Knaak/9781439189467">BookDepository</a></td>
</tr>
<tr>
<td>The Shattering: Prelude to Cataclysm</td>
<td><a href="http://www.amazon.com/World-Warcraft-Shattering-Prelude-Cataclysm/dp/1416550747/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/World-Warcraft-Shattering-Prelude-Cataclysm/dp/1416550747/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-The-Shattering-ebook/dp/B003L785VK/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Shattering-Christie-Golden/9781439172742">BookDepository</a></td>
</tr>
<tr>
<td><strong>WoW: Cataclysm</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Wolfheart</td>
<td><a href="http://www.amazon.com/World-Warcraft-Wolfheart-Richard-Knaak/dp/1451605765/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Wolfheart-World-Warcraft-Cataclysm-Richard/dp/1451605765/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-of-Warcraft-Wolfheart-ebook/dp/B004T4KXLE/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Wolfheart-Richard-Knaak/9781451605761">BookDepository</a></td>
</tr>
<tr>
<td>Thrall: Twilight of the Aspects</td>
<td><a href="http://www.amazon.com/World-Warcraft-Twilight-Aspects-Gallery/dp/B005X4985G/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Thrall-Twilight-Aspects-Warcraft-Cataclysm/dp/143919663X/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Twilight-Aspects-ebook/dp/B004G8QNGC/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Thrall-Christie-Golden/9781416550884">BookDepository</a></td>
</tr>
<tr>
<td>Jaina Proudmore: Tides of War</td>
<td><a href="http://www.amazon.com/World-Warcraft-Jaina-Proudmoore-Tides/dp/1416550763/">Amazon.com</a></td>
<td><a href="http://www.amazon.co.uk/Jaina-Proudmore-Tides-Warcraft-Pandaria/dp/1416550763/">Amazon.co.uk</a></td>
<td><a href="http://www.amazon.com/World-Warcraft-Jaina-Proudmoore-ebook/dp/B0061NXDO0/">Kindle</a></td>
<td><a href="http://www.bookdepository.co.uk/Jaina-Proudmore-Tides-War-Christie-Golden/9781416550761">BookDepository</a></td>
</tr>
<tr>
<td><strong>WoW: Mists of Pandaria</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&ndash;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View File

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Fringe series finale: My oppinion | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/02/24/fringe-series-finale-my-oppinion/">Fringe series finale: My oppinion</a></h1>
<div class="info">
Published on February 24, 2013
</div>
<div class="content">
<p><img src="/blog/2013/02/24/fringe-series-finale-my-oppinion/fringe.png" alt=""></p>
<blockquote><p>Attention: This entry contains huge spoilers about the series finale of
Fringe. Also, lots of negative opinions, if you like the series or don't
understand how sarcasm works, leave.</p>
</blockquote>
<p>I've spent the last weeks watching the show from where I dropped it -the third
season- and I can say that the final season is the worst of all. I don't know
if the show was losing audicence, if they only wanted to finish it, because I
don't know another reason to kill the show this way.</p>
<p>From now on I'm talking only about the fifth season, as should be the more
important and the one all of you -and myself- have fresh.</p>
<ul>
<li><p>The most stupid thing I remember: The tapes with the plan to get rid of the observers.
Walter had a plan to defeat the observers, a plan that he never tell anyone
until is destroyed from his mind by an observer. But, hey! He must have
recorded the plan or something. I mean, he is a very smart one. He did. He
recorded that he have a plan on a tape, but for knowing what it is you have to
swim accross a sea of <em>amber</em> to find another eight tapes with the details. OH
HOW SMART IS THAT! Just a stupid reason to keep characters busy. Without this
the entire fifth season is done in two-three chapters.</p>
</li>
<li><p>The observers powers.
So, I can read minds and predict -in some way- the future. How can SOMEONE
DEFEAT YOU IF YOU CAN PREDICT WHAT ARE THEY GOING TO DO. And more, you SAW in
Walter's mind what the plan was. The observers boss is just… asshole.</p>
</li>
<li><p>The plan.
Tons of VHS tapes with a specific plan of how to build a machine to generate a
wormhole, but in the last moment, hey! But the observers generate wormholes
for their supplies, let's use that! Let's put humanity's hope on a last moment
change! :D</p>
</li>
<li><p>Olivia's powers.
You used your last <em>cortexiphan</em> -or however it's written- on revive yourself
from a headshot (LOL), then you get injected fours times, each for every
dimension swap you have to do. Despite the fact that just this sucks, there's
more: William Bell needed a lot of time just to unleash her powers, and now,
is not that she have the powers <em>active</em>, but also she knows how to swap
dimensions on her own will. Fascinating. Also, from this point Olivia don't
need fear to use her powers.</p>
</li>
<li><p>The observers chip.
Peter removes a chip from a observer and the observer die. Removes it from
himself and nothing happen. And I'm not talking about how deep the chip was
jumping insinde the brain when Walter did the tests… just WTF, die already.</p>
</li>
<li><p>Gun's agains the observers.
This is just a little thing: in <em>our</em> universe, Bell design some improved guns
-that apparently only the rebels have 21 years in the future…- that shoots
faster to deal with the observers. When Olivia travels to the alternative
universe, they don't have that guns but can kill observers without a problem.</p>
</li>
<li><p>Time travel:
Apparently there's only one shot for a single one to time-travel: September
takes it. But when he's killed nothing prevents Walter for time traveling.</p>
</li>
<li><p>Olivia vs. Observer Boss.
Apparently the energy needed to move a truck with the cortexiphan powers is
the electricity of the entire New York. That's efficient use of energy.</p>
</li>
</ul>
<p>There's more things, I'm sure, but I don't remember just now. Besides, there's
more than enough here.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Manga recommendation: Enigma | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/02/27/manga-recommendation-enigma/">Manga recommendation: Enigma</a></h1>
<div class="info">
Published on February 27, 2013
</div>
<div class="content">
<p><img src="/blog/2013/02/27/manga-recommendation-enigma/enigma-cover.jpg" alt="&#34;Enigma&#34;"></p>
<h3 id="summary">Summary</h3><p>Haiba Sumio is a student at a Tokyo High School with an interesting ability…
He occasionally falls asleep and wakes up with premonitions of the future
written out on his "Dream Diary". With this ability, Sumio helps out people in
trouble before anything bad happens, until one day when his peaceful life
completely changes.</p>
<p><strong>Volumes</strong>: 7
<strong>Chapters</strong>: 56 (finished)
<strong>Genre</strong>: Adventure, Mystery, School, Shounen, Supernatural
<strong>Story/Art</strong>: Sakaki, Kenji</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Server going slow after IPTables configuration? Try this | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/02/27/server-going-slow-after-iptables-configuration-try/">Server going slow after IPTables configuration? Try this</a></h1>
<div class="info">
Published on February 27, 2013
</div>
<div class="content">
<p>Recently I've started the migration of my company's servers to a new provider.
After checking that the OS installed on the -now- old servers was Ubuntu 8.04
(holy shit), I decided to make a fresh install of CentOS 6.3, cleaning up all
the servers contents and setting up everything from scratch.</p>
<p>After setting my iptables rules (INPUT whitelisted, OUTPUT accept all) I
noticed a big delay on every connection made to my server. After checking a
lot of things, these two solved the issue:</p>
<h2 id="enable-unilimited-traffic-on-your-loopback-interface">Enable unilimited traffic on your loopback interface</h2><div class="hll"><pre><span></span>iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
</pre></div>
<h2 id="enable-traffic-for-connections-started-by-your-server">Enable traffic for connections started by your server</h2><div class="hll"><pre><span></span>iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
</pre></div>
<p>Hope this solves your issue as it did with mine.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Zombiepress is here | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/06/24/zombiepress-is-here/">Zombiepress is here</a></h1>
<div class="info">
Published on June 24, 2013
</div>
<div class="content">
<p>It finally happened. I got tired of octopress and decided to finish what I
started: my own blogging CMS.</p>
<p>It's a really modest thing built with django. I've added some thing to make it
easy to use (in my oppinion):</p>
<ul>
<li>settings.py main preferences (required for running the app) are set on environment variables instead of environment dependant settings files or the not so cool local_settings.py.</li>
<li>A a key-&gt;value preferences config in the admin (<a href="https://github.com/fmartingr/zombiepress/blob/master/zombiepress/apps/config/models.py#L5">a simple django model with 3 fields</a>) for settings that may be needed to modify in a live environment and would be a shame if it were on the <em>settings.py</em> file. In example, I use it to <a href="https://github.com/fmartingr/zombiepress-fmartingr-theme/blob/master/blog/rss.jinja2#L4-L6">set some RSS preferences</a> and the <a href="https://github.com/fmartingr/zombiepress-fmartingr-theme/blob/master/blog/entry.jinja2#L62-L65">Disqus shortname for the blog comments</a>. To disable blog comments I just need to uncheck the "pass to template" option on the required variable.</li>
<li>Theming: Not an absolute state of the art, but it's function works: a themes folder and a variable to select one on the settings.py, I just need to create the basic theme.</li>
<li><strong>(experimental)</strong> Multilanguage support. A friend asked for a easy to use CMS with multilingual support, so I want to give it a shot. Since I never used django with managed multilingual content, it may be easy or it may be not. The code is there, someone has to try it.</li>
</ul>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>django-stampu: Static sites with django | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/07/01/django-stampu-static-sites-with-django/">django-stampu: Static sites with django</a></h1>
<div class="info">
Published on July 01, 2013
</div>
<div class="content">
<p><img src="/blog/2013/07/01/django-stampu-static-sites-with-django/django-stampu.png" alt=""></p>
<blockquote><p>After finishing zombiepress a friend of mine wanted to use it but asked for
some kind of conversion to static since he uploads its current blog to github.
That's how this project was born.</p>
</blockquote>
<p>Django as a static site? Of course, it's possible, only if your project it's
using a simple backend infrastructure, it doesn't let users modify the
database, and also doesn't have contact forms or that kind of stuff. The
conversion of a blog into static content was really easy, in about 30 minutes
I had an alpha working -which is the 0.1.2 version uploaded in github/pypi-.</p>
<p>django-stampu is basically a crawler. Some people led me to solutions much
more complicated. (Ex. Running a command and let the computer work.) And I
didn't like that. I wanted a conversion of the site as I see it when running
the <code>runserver</code> command, for that purpose you have to follow all the internal
links of the site and save the items as *.html if the content-type matches. It
also saves the static files in the site, but I need to look further into that,
because it can't save files needed by css files yet, it only checks for
src/href attributes on all tags in html files.</p>
<p>Want to try it?</p>
<ol>
<li>Install django-stampu: <code>pip install django-stampu</code></li>
<li>Add it to your <code>INSTALLED_APPS</code></li>
<li>Execute the command: <code>python manage.py stamp</code></li>
<li>Check the <code>_static</code> folder.</li>
</ol>
<p>Easy, right? That's what I want to hear!</p>
<p>Keep in mind that this is a proof of concept, I need to improve lots of things
and add some configuration variables for people that want to customize their
sites.</p>
<p>If you want to contribute in any way, you can <a href="https://github.com/fmartingr/django-stampu">check the source code at
github</a>.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,226 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Extracting data from obfuscated java code | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/07/04/extracting-data-from-obfuscated-java-code/">Extracting data from obfuscated java code</a></h1>
<div class="info">
Published on July 04, 2013
</div>
<div class="content">
<p><img src="/blog/2013/07/04/extracting-data-from-obfuscated-java-code/header.png" alt=""></p>
<p>For those who don't know, I started a site a while ago minecraft related (yes,
<a href="/blog/2013/1/12/weekly-project-status-dropping-projects-
hard/">the one I dropped</a>). If you don't know what minecraft is (really?!), you can check <a href="http://minecraft.net/">the
official site</a>, since this game can be a little
difficult to explain.</p>
<p>The project (which is online at
<a href="http://www.minecraftcodex.com">minecraftcodex.com</a>) is just a database of
items, blocks, entities, etc. related to the game, but as in any other site of
this kind, entering all this information can lead to an absolute <em>boredom</em>. So
I thought... what if I can extract some of the data from the game
<em>classfiles</em>? That would be awesome! <em>Spoiler alert</em> I did it.</p>
<blockquote><p>Think this as my personal approach to all steps below: it doesn't mean that they're the best solutions.</p>
</blockquote>
<h2 id="unpackaging-the-jarfile-and-decompiling-the-classes">Unpackaging the jarfile and decompiling the classes</h2><p>First of all, you have a <em>minecraft.jar</em> file that it's just a packaged set of
java compiled files, you can just <code>tar -xf</code> or <code>unzip</code> it into a folder:</p>
<div class="hll"><pre><span></span>unzip -qq minecraft.jar -d ./jarfile
</pre></div>
<p>With this we now have a folder called _jarfile__ _filled with all the jar
contents. We now need to use a tool to decompile all the compiled files into
.java files, because the data we're looking for it's hard-coded into the
source. For this purpose we're going to use <a href="http://varaneckas.com/jad/">JAD</a>,
a java decompiler. With a single line of <em>bash</em> we can look for all the .class
files and decompile them into .java source code:</p>
<div class="hll"><pre><span></span>ls ./jarfile/*.class | xargs -n1 jad -sjava -dclasses &amp;&gt; /dev/null
</pre></div>
<p>All the class files have been converted and for ease of use, we've moved them
into a separate directory. But there's a lot of files! And also, when we open
one...</p>
<div class="hll"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">aea</span> <span class="kd">extends</span> <span class="n">aeb</span>
<span class="p">{</span>
<span class="kd">public</span> <span class="nf">aea</span><span class="p">()</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">a</span><span class="p">(</span><span class="kt">long</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="kt">int</span> <span class="n">j</span><span class="p">,</span> <span class="kt">byte</span> <span class="n">abyte0</span><span class="o">[]</span><span class="p">,</span> <span class="kt">double</span> <span class="n">d</span><span class="p">,</span>
<span class="kt">double</span> <span class="n">d1</span><span class="p">,</span> <span class="kt">double</span> <span class="n">d2</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">a</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">abyte0</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">d1</span><span class="p">,</span> <span class="n">d2</span><span class="p">,</span> <span class="mf">1.0F</span> <span class="o">+</span> <span class="n">b</span><span class="p">.</span><span class="na">nextFloat</span><span class="p">()</span> <span class="o">*</span> <span class="mf">6F</span><span class="p">,</span> <span class="mf">0.0F</span><span class="p">,</span> <span class="mf">0.0F</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.5D</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</pre></div>
<p>Look at that beautiful obfuscated piece of code! This is getting more
interesting at every step: almost 1.600 java files with obfuscated source
code.</p>
<h2 id="searching-for-the-data">Searching for the data</h2><p>I took the following approach: Since I know what I'm looking for (blocks,
items, etc) and I also know that the information is hard-coded into the
source, there must be some kind of string I can use to search all the files
and get only the ones that contains the pieces of information I look for. For
this test, I used the string "diamond":</p>
<div class="hll"><pre><span></span>$ grep diamond ./classes/*
./classes/bfp.java: &quot;cloth&quot;, &quot;chain&quot;, &quot;iron&quot;, &quot;diamond&quot;, &quot;gold&quot;
./classes/bge.java: &quot;cloth&quot;, &quot;chain&quot;, &quot;iron&quot;, &quot;diamond&quot;, &quot;gold&quot;
./classes/kd.java: w = (new kc(17, &quot;diamonds&quot;, -1, 5, xn.p, k)).c();
./classes/rf.java: null, &quot;mob/horse/armor_metal.png&quot;, &quot;mob/horse/armor_gold.png&quot;, &quot;mob/horse/armor_diamond.png&quot;
./classes/xn.java: p = (new xn(8)).b(&quot;diamond&quot;).a(wh.l);
./classes/xn.java: cg = (new xn(163)).b(&quot;horsearmordiamond&quot;).d(1).a(wh.f);
</pre></div>
<p>As you can see, with a simple word we've filtered down to five files (from
1.521 in this test). Is proof that we can get some information from the source
code and we now to filter even more, looking around some files I selected
another keyword: <em>flintAndSteel</em>, works great here, but in a real example you
will need to use more than one keyword to look for data.</p>
<div class="hll"><pre><span></span>$ grep flintAndSteel ./classes/*
./classes/xn.java: public static xn k = (new xh(3)).b(&quot;flintAndSteel&quot;);
</pre></div>
<p>Only one file now, we're going to assume that all the items are listed there
and proceed to extract the information.</p>
<h2 id="parsing-the-items">Parsing the items</h2><p>This was the more complicated thing to do. I started doing some regular
expressions to matchs the values I wanted to extract, but soon that became
inneficient due to:</p>
<ul>
<li>The obfuscated code varies with every released version/snapshot -or it should.</li>
<li>The use of OOP difficulted method searching with RegEx matching, since the names could change from version to version, making the tool unusable on updates.</li>
<li>The need to modify the RegEx if something in the code changes, or if we want to extract some other value.</li>
</ul>
<p>After some tests, I decided to <em>convert</em> the java code into python. For that,
I used simple find and match to get the lines that had the definitions I
wanted, something line this:</p>
<div class="hll"><pre><span></span><span class="c1">// As a first simple filter, we only use a code line if a double quote is found on it.</span>
<span class="c1">// Then, regex: /new (?P&lt;code&gt;[a-z]{2}\((?P&lt;id&gt;[1-9]{1,3}).*\&quot;(?P&lt;name&gt;\w+)\&quot;\))/</span>
<span class="c1">// ...</span>
<span class="n">T</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="n">xm</span><span class="p">(</span><span class="mi">38</span><span class="p">,</span> <span class="n">xo</span><span class="p">.</span><span class="na">e</span><span class="p">)).</span><span class="na">b</span><span class="p">(</span><span class="s">&quot;hoeGold&quot;</span><span class="p">);</span>
<span class="n">U</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="n">yi</span><span class="p">(</span><span class="mi">39</span><span class="p">,</span> <span class="n">aqh</span><span class="p">.</span><span class="na">aD</span><span class="p">.</span><span class="na">cE</span><span class="p">,</span> <span class="n">aqh</span><span class="p">.</span><span class="na">aE</span><span class="p">.</span><span class="na">cE</span><span class="p">)).</span><span class="na">b</span><span class="p">(</span><span class="s">&quot;seeds&quot;</span><span class="p">);</span>
<span class="n">V</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="n">xn</span><span class="p">(</span><span class="mi">40</span><span class="p">)).</span><span class="na">b</span><span class="p">(</span><span class="s">&quot;wheat&quot;</span><span class="p">).</span><span class="na">a</span><span class="p">(</span><span class="n">wh</span><span class="p">.</span><span class="na">l</span><span class="p">);</span>
<span class="n">X</span> <span class="o">=</span> <span class="p">(</span><span class="n">vr</span><span class="p">)(</span><span class="k">new</span> <span class="n">vr</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="n">vt</span><span class="p">.</span><span class="na">a</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)).</span><span class="na">b</span><span class="p">(</span><span class="s">&quot;helmetCloth&quot;</span><span class="p">);</span>
<span class="n">Y</span> <span class="o">=</span> <span class="p">(</span><span class="n">vr</span><span class="p">)(</span><span class="k">new</span> <span class="n">vr</span><span class="p">(</span><span class="mi">43</span><span class="p">,</span> <span class="n">vt</span><span class="p">.</span><span class="na">a</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)).</span><span class="na">b</span><span class="p">(</span><span class="s">&quot;chestplateCloth&quot;</span><span class="p">);</span>
<span class="c1">// ...</span>
</pre></div>
<p>Since that java code is not python evaluable, just convert it:</p>
<ul>
<li>Remove unmatched parenthesis and double definitions</li>
<li>Remove semicolons</li>
<li>Remove variable definitios</li>
<li>Converted arguments to string. This can be improved a lot, leaving decimals, converting floats to python notation, detecting words for string conversion, etc. Since for now I am not using any of the extra parameters this works for me.</li>
<li>Be careful with reserved python names! (<code>and</code>, <code>all</code>, <code>abs</code>, ...)</li>
</ul>
<div class="hll"><pre><span></span><span class="o">//</span> <span class="n">Java</span><span class="p">:</span> <span class="n">U</span> <span class="o">=</span> <span class="p">(</span><span class="n">new</span> <span class="n">yi</span><span class="p">(</span><span class="mi">39</span><span class="p">,</span> <span class="n">aqh</span><span class="o">.</span><span class="n">aD</span><span class="o">.</span><span class="n">cE</span><span class="p">,</span> <span class="n">aqh</span><span class="o">.</span><span class="n">aE</span><span class="o">.</span><span class="n">cE</span><span class="p">))</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">&quot;seeds&quot;</span><span class="p">);</span>
<span class="n">yi</span><span class="p">(</span><span class="s2">&quot;39&quot;</span><span class="p">,</span> <span class="s2">&quot;aqh.ad.cE&quot;</span><span class="p">,</span> <span class="s2">&quot;aqh.aE.cE&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">&quot;seeds&quot;</span><span class="p">)</span>
<span class="o">//</span> <span class="n">Java</span><span class="p">:</span> <span class="n">bm</span> <span class="o">=</span> <span class="p">(</span><span class="n">new</span> <span class="n">xi</span><span class="p">(</span><span class="mi">109</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">0.3</span><span class="n">F</span><span class="p">,</span> <span class="n">true</span><span class="p">))</span><span class="o">.</span><span class="n">a</span><span class="p">(</span><span class="n">mv</span><span class="o">.</span><span class="n">s</span><span class="o">.</span><span class="n">H</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.3</span><span class="n">F</span><span class="p">)</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">&quot;chickenRaw&quot;</span><span class="p">);</span>
<span class="n">xi</span><span class="p">(</span><span class="s2">&quot;109&quot;</span><span class="p">,</span> <span class="s2">&quot;2&quot;</span><span class="p">,</span> <span class="s2">&quot;0.3F&quot;</span><span class="p">,</span> <span class="s2">&quot;true&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">a</span><span class="p">(</span><span class="s2">&quot;mv.s.H&quot;</span><span class="p">,</span> <span class="s2">&quot;30&quot;</span><span class="p">,</span> <span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="s2">&quot;0.3F&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">&quot;chickenRaw&quot;</span><span class="p">)</span>
</pre></div>
<p>Now I defined an object to match with the java code definitions when
evaluating:</p>
<div class="hll"><pre><span></span><span class="k">class</span> <span class="nc">GameItem</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">game_id</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">game_id</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;Item(</span><span class="si">%d</span><span class="s2">: &#39;</span><span class="si">%s</span><span class="s2">&#39;)&gt;&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span>
<span class="s2">&quot;Sets the name&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span>
</pre></div>
<p>As you can see, this class have a global "catch-all" method, since we don't
know the obsfuscated java names, that function will handle every call. In that
concrete class, we now that an object method with only one string parameter is
the one that define the item's name, and we do so in our model.</p>
<p>Now, we will evaluate a line of code that will raise and exception saying that
the class name <em>&lt;insert obfuscated class name here&gt;</em> is not defined.
With that, we will declare that name as an instance of the GameItem class, so
re-evaluating the code again will return a GameItem object:</p>
<div class="hll"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="c1"># Tries to evaluate the piece of code that we converted</span>
<span class="n">obj</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="s1">&#39;code&#39;</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">NameError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
<span class="c1"># Class name do not exist! We need to define it.</span>
<span class="c1"># Extract class name from the error message</span>
<span class="c1"># Defined somewhere else: class_error_regex = re.compile(&#39;name \&#39;(?P&lt;name&gt;\w+)\&#39; is not defined&#39;)</span>
<span class="n">class_name</span> <span class="o">=</span> <span class="n">class_error_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">error</span><span class="o">.</span><span class="fm">__str__</span><span class="p">())</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
<span class="c1"># Define class name as instance of GameItem</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="vm">__name__</span><span class="p">],</span> <span class="n">class_name</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">class_name</span><span class="p">,</span> <span class="p">(</span><span class="n">GameItem</span><span class="p">,),</span> <span class="p">{}))</span>
<span class="c1"># Evaluate again to get the object</span>
<span class="n">obj</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="s1">&#39;code&#39;</span><span class="p">])</span>
</pre></div>
<p>And with this, getting data from source code was possible and really helpful.</p>
<p>A lot of things could be improved from this to get even more information from
the classes, since after spending lot's of time looking for certain patterns
on the code I can say what some/most of the parameters mean, and that means
more automation on new releases!</p>
<h2 id="real-use-case">Real use case</h2><p>Apart from getting the base data for the site (all the data shown on minecraft
codex is directly mined from the source code), I made up a tool that shows
changes from the last comparision -if any. This way I can easily discover what
the awesome mojang team added to the game every snapshot they release:</p>
<p><img src="/blog/2013/07/04/extracting-data-from-obfuscated-java-code/diff.png" alt=""></p>
<p>This is the main tool I use for minecraft codex, is currently bound to the
site itself but I'm refactoring it to made it standalone and publish it on
github.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to install and configure the yubikey-pam module on archlinux | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/07/09/how-install-and-configure-yubikey-pam-module-archlinux/">How to install and configure the yubikey-pam module on archlinux</a></h1>
<div class="info">
Published on July 09, 2013
</div>
<div class="content">
<p><img src="/blog/2013/07/09/how-install-and-configure-yubikey-pam-module-archlinux/yubico.jpg" alt=""></p>
<p>Not so long ago I've been gifted with a Yubikey. It's a two-auth hardware
solution with multiple auth methods (OTP, Challenge-response, OATH-HOTP and
static password). It easily scaled to one of my favourite and most useful
gadgets.</p>
<p>I've been a google authenticator user for a while, but the yubikey is just
much easier to work with: when configured, you only need to tap a button on
the usb stick to generate your key. You can use this in many ways, but in this
post I'm focusing on ssh authentication and how to install the yubico-pam
module into an Arch installation.</p>
<h2 id="installing-the-required-packages">Installing the required packages</h2><p>Thanks to the awesome arch community we already have the needed packages on
the AUR, these are: <a href="https://aur.archlinux.org/packages/yubico-pam-git/">yubico-pam-
git</a>, <a href="https://aur.archlinux.org/packages/yubico-c-client-git/">yubico-c-client-
git</a>, <a href="https://aur.archlinux.org/packages/yubikey-
personalization-git/">yubikey-
personalization-git</a> and
<a href="https://aur.archlinux.org/packages/libyubikey/">libyubikey</a>. Keep in mind
that you <em>may</em> need to install more packages depending on your system
installation.</p>
<p>You can install that with your favourite AUR helper or using <code>makepkg</code>:</p>
<div class="hll"><pre><span></span>$ curl -O https://aur.archlinux.org/packages/li/libyubikey/libyubikey.tar.gz
$ tar xvzf libyubikey.tar.gz
$ cd libyubikey
$ makepkg PKGBUILD
# ...
$ sudo pacman -U libyubikey-1.10-2-x86_64.pkg.tar.xz
</pre></div>
<p>Repeat that step for all the packages, in order: <em>libyubikey</em>, <em>yubico-c-
client</em>, <em>yubikey-personalization</em> and <em>yubico-pam</em>. If you have trouble
installing from the AUR <a href="https://wiki.archlinux.org/index.php/AUR#Installing_packages">refer to the appropiate wiki
page</a>.</p>
<h2 id="configure-the-pam-module">Configure the PAM module</h2><p>Edit <code>/etc/pam.d/sshd</code> and add on top on the rest of the auth modules:</p>
<div class="hll"><pre><span></span>auth sufficient pam_yubico.so id=XXXX key=XXXX
</pre></div>
<p>You can obtain an ID/key conbination by registering your yubikey <a href="https://upgrade.yubico.com/getapikey/">at this
page</a>.</p>
<h2 id="authorization-methods">Authorization methods</h2><h3 id="individual-authorization-mapping">Individual authorization mapping</h3><p>If your server have multiple users this is the easiest method to let them
configure their yubikeys. You just need to create the file
<code>$HOME/.yubico/authorized_yubikeys</code> with the following contents:</p>
<div class="hll"><pre><span></span>&lt;username&gt;:&lt;Yubikey token ID 1&gt;[:&lt;Yubikey token ID 2][:...]
</pre></div>
<p>The yubikey token identifier can be obtained by removing the last 32
characters of any OTP value, and you can add more than one ID to the file.</p>
<p>Restart your ssh server to apply the changes.</p>
<h3 id="central-authorization-mapping">Central authorization mapping</h3><p>Create a file on <code>/etc/yubikey_mappings</code> that will contain all your users and
their respective yubikey token identifiers, like this:</p>
<div class="hll"><pre><span></span>&lt;first username&gt;:&lt;Yubikey token ID 1&gt;[:&lt;Yubikey token ID 2][:...]
&lt;second username&gt;:&lt;Yubikey token ID 3&gt;[:&lt;Yubikey token ID 4][:...]
</pre></div>
<p>For this to work, you need to specify this file to the pam module <code>authfile</code>
parameter:</p>
<div class="hll"><pre><span></span>auth sufficient pam_yubico.so id=XXXX key=XXXX authfile=/etc/yubikey_mappings
</pre></div>
<p>After that estart your ssh server to apply the changes.</p>
<h2 id="logging-in">Logging in</h2><p>The next time you're asked for a password on you ssh login you can use a
yubikey OTP instead of your current password -if you have any-.</p>
<p>This method works pretty well with authorized ssh keys as well, since you will
log-in automatically from a computer with a configured ssh key but an OTP -or
password- will be required for logging in from anywhere else.</p>
<p><strong>Yubico-pam module |</strong> <a href="https://github.com/Yubico/yubico-pam">Github</a>
<strong>Yubico |</strong> <a href="http://www.yubico.com/">Home page</a></p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

View File

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Warcraft 3 on MAC with wineskin | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/08/10/warcraft-3-mac-wineskin/">Warcraft 3 on MAC with wineskin</a></h1>
<div class="info">
Published on August 10, 2013
</div>
<div class="content">
<p>A few days ago, I bought Warcraft III. I never finished it before, since I
didn't own the game, and lately I had this inner urge to play a game on the
Warcraft series. Since going back to World of Warcraft isn't an option, I
decided to rollback to the part of the Warcraft lore that is unknown to me.</p>
<p>Sadly after buying the game I discovered that they dropped support for the
game when Apple did the conversion of their hardware from powerpc to intel.
There was no way of running the mac version of the game on newer hardware, and
I even contacted Blizzard support about the matter, but the answer was the one
I feared: I had to use wine. This reminded me of the old days when I was a
linux user and this was needed in order to play anything on linux.</p>
<p><img src="/blog/2013/08/10/warcraft-3-mac-wineskin/wineskin.png" alt=""></p>
<h2 id="installing-the-needed-software">Installing the needed software</h2><p>First of all, you will need to download
<a href="http://wineskin.urgesoftware.com/tiki-
index.php?page=Wineskin%2C+Play+your+favorite+Windows+games+on+Mac+OS+X+without+needing+Microsoft+Windows">Wineskin</a>,
as we're going to use this to "emulate" our windows environment. Also,
download the windows warcraft downloaders from your battle.net account.</p>
<p>Execute it and download the last engine (clicking on the plus symbol) and also
update the wrapper.</p>
<p>You should see your wineskin window similar to the one on the left.</p>
<p>Now you need to create a clean wrapper for your Warcraft III installation.</p>
<h2 id="creating-the-wrapper">Creating the wrapper</h2><p>Just click on the "Create New Blank Wrapper" button and give it a name. I will
go with "Warcraft III.app". It will ask you to install some mono/gecko
libraries needed for the wrapper. Just go with it and wait until all the
process finishes.</p>
<p>You will be prompted if you want to open the containing folder, do it since
now we need to configure our wrapper.</p>
<p>Now, right click the app you created and select "Show package contents".</p>
<p>Execute Wineskin.app, and select "Install software", on the next panel select
"Select setup executable" and go to the path of your warcraft 3 downloader,
that will prompt the installation menu when it finishes.</p>
<p>Install your warcraft as you would in a windows machine, and when you exit the
installer wineskin will ask for the main executable file, select "Warcraft
III.exe". After that, repeat the process with the Frozen Throne executable.</p>
<h2 id="configuration">Configuration</h2><p>We need to tweak some things before we can play, here's what I did:</p>
<ul>
<li>Go to set screen options and set windowed. Since I have a 16:9 screen and the game runs at 4:3, everything is streched. Maybe there's a 16:9 patch around the net.</li>
<li>I customized the icon with <a href="http://icons.iconarchive.com/icons/3xhumed/mega-games-pack-36/256/Warcraft-3-Reign-of-Chaos-5-icon.png">this one</a>. You need to convert it to ICNS for using it with wineskin (you can use <a href="http://iconverticons.com/online/">this online tool</a>). Copy it into the package and select on the advanced options in the wineskin executable.</li>
<li>If you want to play with the frozen throne expansion, change the Windows EXE on the advanced settings panel to "Frozen Throne.exe".</li>
<li>Since wine can't play the cinematics, you can safely remove/rename the movies folder under the warcraft installation folder. (Default: <code>drive_c/Program Files/Warcraft III</code>)</li>
<li>Delete the game installers if you stored them into the wineskin package to keep the .app file size to a minimum.</li>
</ul>
<h2 id="enjoy">Enjoy!</h2><p><img src="/blog/2013/08/10/warcraft-3-mac-wineskin/game.png" alt=""></p>
<p>It's done! Store the Warcraft III.app somewhere if you don't want to repeat
the process if you delete the game.</p>
<h3 id="updates">Updates:</h3><ul>
<li>Using the -opengl EXE flag will get you a smoother framerate. (thanks to <strong>Sylvain Prevost</strong> in the comments)</li>
<li>Suggested engine: WS9Wine1.7.2. (by <strong>Sylvain Prevost</strong> in the comments)</li>
</ul>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,233 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Reading data from iOS backups: Manifest.mbdb | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/11/29/reading-data-ios-backups-manifestmbdb/">Reading data from iOS backups: Manifest.mbdb</a></h1>
<div class="info">
Published on November 29, 2013
</div>
<div class="content">
<p>Recently, I&#39;ve been working on a tool to extract data from iOS backups, and one of the files that a backup have is the Manifest.mbdb (or mbdx for old versions).</p><p>The Manifest.mbdb is a binary file that contains records for the hashed files that the backup includes, the hashed files can be anything that a certain application requires or saved, from a image thumbnail to a sqlite3 database file.</p><p>Reading the file can be tricky, since the record itself have a variable length, so you can just split the file based on a delimiter, you need to read it byte to byte. I&#39;m going to expose here the data structures this file contains:</p><table border="0" cellpadding="0" cellspacing="0" id="string_entity" style="width:100%">
<tbody>
<tr>
<th colspan="4"><strong>String entity</strong></th>
</tr>
<tr>
<th><strong>Type</strong></th>
<th><strong>Name</strong></th>
<th><strong>Description</strong></th>
<th><strong>Null value</strong></th>
</tr>
<tr>
<td>uint16</td>
<td>Lenght</td>
<td>Length of the string</td>
<td>0x0000</td>
</tr>
<tr>
<td>ASCII data</td>
<td>Data</td>
<td>Actual string of (length) size. Don&#39;t need to read this if length is null.</td>
<td><em>nothing</em></td>
</tr>
</tbody>
</table><table border="0" cellpadding="0" cellspacing="0" id="property_entity" style="width:100%">
<tbody>
<tr>
<th colspan="3"><strong>Property entity</strong></th>
</tr>
<tr>
<th><strong>Type</strong></th>
<th><strong>Name</strong></th>
<th><strong>Description</strong></th>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Key</td>
<td>Key of the property</td>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>value</td>
<td>Property value</td>
</tr>
</tbody>
</table><table border="0" cellpadding="0" cellspacing="0" style="width:100%">
<tbody>
<tr>
<th colspan="4"><strong>Record entity</strong></th>
</tr>
<tr>
<th><strong>Type</strong></th>
<th><strong>Field name</strong></th>
<th><strong>Description</strong></th>
<th><strong>Null value</strong></th>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Domain</td>
<td>App domain</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Path</td>
<td>Path to file</td>
<td>0x0000</td>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Target</td>
<td>&nbsp;</td>
<td>0xFFFF</td>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Hash</td>
<td>SHA-1 hash of the file</td>
<td>0xFFFF</td>
</tr>
<tr>
<td><a href="#string_entity">string</a></td>
<td>Encription key</td>
<td>Encryption key -if any-</td>
<td>0xFFFF</td>
</tr>
<tr>
<td>uint16</td>
<td>Mode</td>
<td>File mode:
<ul>
<li>0xAXXX: Symlink</li>
<li>0x4000: Directory</li>
<li>0x8000: File</li>
</ul>
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint64</td>
<td>inode number</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint32</td>
<td>User ID</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint32</td>
<td>Group ID</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint32</td>
<td>Last modified time</td>
<td>EPOCH</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint32</td>
<td>Last accesed time</td>
<td>EPOCH</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint32</td>
<td>Created time</td>
<td>EPOCH</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint64</td>
<td>File size</td>
<td>&nbsp;</td>
<td>0x0...0</td>
</tr>
<tr>
<td>uint8</td>
<td>Flag</td>
<td>0x1 to 0xB</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>uint8</td>
<td>Properties number</td>
<td>Number of properties to follow with this record</td>
<td>0x00</td>
</tr>
<tr>
<td><a href="#property_entity">property</a>[0...n]</td>
<td>Property objects</td>
<td>Each property object -if any-</td>
<td><em>nothing</em></td>
</tr>
<tr>
<td>--</td>
<td>File name</td>
<td>SHA1(domain + path)</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table><p><strong>More info:&nbsp;</strong> <a href="http://theiphonewiki.com/wiki/ITunes_Backup#Manifest.mbdb">The iPhone Wiki</a> | <a href="http://nagareshwar.securityxploded.com/wp-content/uploads/2012/09/mbdb-record.jpg">This image I found</a></p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to: Starbound dedicated server on a linux machine | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/12/05/howto-starbound-dedicated-server-linux-machine/">How to: Starbound dedicated server on a linux machine</a></h1>
<div class="info">
Published on December 05, 2013
</div>
<div class="content">
<p><img src="/blog/2013/12/05/howto-starbound-dedicated-server-linux-machine/starbound-
logo.jpg" alt="Starbound logo"></p>
<p>The day it's here! Starbound beta is finally here, and what could be better
than having a dedicated server to play with your friends? Let's get this done.</p>
<h2 id="install-steamcmd">Install SteamCMD</h2><p>Official documentation: <a href="https://developer.valvesoftware.com/wiki/SteamCMD">https://developer.valvesoftware.com/wiki/SteamCMD</a></p>
<p>Basically you need to download it's shell script to manage steam apps, take
special attention to the lib32 section if you're running the server in a 64bit
machine.</p>
<div class="hll"><pre><span></span>wget http://media.steampowered.com/client/steamcmd_linux.tar.gz
tar xzf steamcmd_linux.tar.gz
</pre></div>
<h2 id="install-starbound-on-the-server">Install Starbound on the server</h2><p>You will need to login with your steam username here to download/update
starbound. Your account<strong> is not needed</strong> to keep the server running.</p>
<div class="hll"><pre><span></span>./steamcmd.sh
# Steam updating and validating stuff
Steam&gt; login your_username_here
# Your password WILL BE VISIBLE. But after a first login
# your credentials will be cached so you don&#39;t need to
# expose them everytime you need to use the steamcmd.
Steam&gt; app_update 211820
# This will install starbound, it will take a while
# depending on the server bandwidth.
Steam&gt; app_update 211820 validate
# Validate installation, just in case.
# I do this in two separate steps because -at least for me-
# validating on a fresh install take a lot longer that
# just installing and validating afterwards. Don&#39;t sure why.
Steam&gt; quit
# Finished!
</pre></div>
<h2 id="start-the-server">Start the server</h2><p>Go to <code>Steam/SteamApps/common/Starbound/linuxXX/</code> (where XX is 32 or 64 based
on your server architecture).</p>
<p>Launch <code>launch_starbound_client.sh</code></p>
<p>If you want to use the universe you played on your computer, just upload the
universe folder found on your computer to the same folder where the server
script is.</p>
<p>Happy gaming!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>2013 | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2013/12/31/2013/">2013</a></h1>
<div class="info">
Published on December 31, 2012
</div>
<div class="content">
<p>According to the Gregorian calendar, a new year is coming.</p>
<p>I'm not gonna waste my time -nor yours- making promises, wishing things and
all that crappy stuff. 2012 has been good and bad, I want 2013 to stay that
way, but I will keep that to me and I'm going to expose what I've thought
about the blog and what I want to do with it during 2013.</p>
<ul>
<li><p>First of all, the <strong>#AppSunday</strong> thing: doing it. I've missed the last two because of the date and also I wasn't really in the mood to write a word either. I really want to do it, so I will keep writing a Sunday post about apps and stuff as long as I've something about to write.</p>
</li>
<li><p>As for <em>new technologies</em>, the reason I do not write too much about developing is because I do not think I'm a good programmer. I can't think I'm either good nor bad for something I <strong>love</strong>. I develop just because I enjoy it, as I've the bless that it's also my job. But after a lot of thinking, I'm going to post some micro-entries about new things I'm using -that could be things you already know long time ago- like PaaS services, libraries and stuff in general. I've a draft about <em>how to copy a mysql record with one SQL statement</em>, for example. If people like the posts as I like writing them, I will keep on with it.</p>
</li>
<li><p>Also, this last year has been really… complete? I've started a lot of new projects -I really mean it, a lot of things whisper around my mind and some of it already have drafts and time invested on them-, so I've thought writing about its evolution. I don't know if I will make individual posts of each project or a weekly summary of all of them -or at least the ones I've worked that week-, but I want to share experiences, problems, solutions, technologies, <em>code</em>… with you.</p>
</li>
<li><p>I still don't know if I will write personal experiences/opinion posts. I assumed that I will decide it when the time comes.</p>
</li>
<li><p>There won't be a "What I've done in the last six months" post anymore. The one that is already in the blog will be purged when the translation is completed.</p>
</li>
</ul>
<p>Now, get off the screen, eat a lot and get drunk. Today is the day.</p>
<p>Happy new year!</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Amazon EC2: No space left on device | Blog | Felipe Martin</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="cleartype" content="on">
</head>
<body class="blog post">
<div class="page-content center">
<header>
<div class="avatar">
<img class="avatar" src="/static/images/avatar.jpg?h=f834fb12">
</div>
<h1>Felipe Martín</h1>
<nav>
<a href="/">/home</a>
<a class="text-bold" href="/blog/">/blog</a>
<a href="/about/">/about</a>
</nav>
</header>
<hr>
<section class="main-content">
<article class="blog-post">
<h1 class="title"><a href="/blog/2015/05/04/amazon-ec2-no-space-left-device/">Amazon EC2: No space left on device</a></h1>
<div class="info">
Published on May 04, 2015
</div>
<div class="content">
<p>So a funny thing happened today at out pre-production environment. I was
performing our pre-big-PR deployment when a beautiful error was shown in my
terminal:</p>
<div class="hll"><pre><span></span>cannot create X: No space left on device
</pre></div>
<p>What?! How could that be possible. I know that our environment don't have a
lot of bytes for us to play with but having the storage already full with our
database and other services outside this machine just wasn't possible. And I
was right.</p>
<div class="hll"><pre><span></span>fmartingr@pre-production:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 59G 37G 21G 65% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 12K 2.0G 1% /dev
tmpfs 396M 400K 395M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
</pre></div>
<p>What?! Now I sure don't understand a thing. I was laughing hysterically when
my brain just started working as I remembered an old friend: the
<a href="http://www.wikiwand.com/en/Inode">inode</a>.</p>
<div class="hll"><pre><span></span>fmartingr@pre-production:~$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 3932160 3932160 0 100% /
none 505855 2 505853 1% /sys/fs/cgroup
udev 504558 403 504155 1% /dev
tmpfs 505855 332 505523 1% /run
none 505855 1 505854 1% /run/lock
none 505855 1 505854 1% /run/shm
none 505855 4 505851 1% /run/user
</pre></div>
<p>F<strong>k you. Our deploys are made using "isolated" builds. That is, we reinstall
pip/bower requirements </strong>for every build.** So each build take about ~50k
inodes, and we keep some in case some rollback is needed, but of course,
keeping two months old builds wasn't needed at all, so I made a script that
just deletes builds older than two weeks and our poor thing was happy again.</p>
<p>To search which folder of your server is eating the inode limit, you can run
this command:</p>
<div class="hll"><pre><span></span>find . -xdev -type f | cut -d &quot;/&quot; -f 2 | sort | uniq -c | sort -nr
</pre></div>
<p>This will show the path name and the inode count, keep going inside dirs to
get some detailed input, once found, just delete the files that are causing
havok.</p>
</div>
<hr />
</article>
<div class="block-info">
If you want to approach me directly about this post use the most appropriate channel
from <a href="/about/">the about page</a>.
</div>
</section>
<hr>
<footer>
Site created using <a target="_blank" href="https://getlektor.com">Lektor</a>. Source code available in <a target="_blank" href="https://github.com/fmartingr/fmartingr.com">Github</a>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Some files were not shown because too many files have changed in this diff Show More