deploy: 7186839b0f
|
@ -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>
|
|
@ -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">"Version"</span><span class="o">:</span> <span class="s2">"2008-10-17"</span><span class="p">,</span>
|
||||||
|
<span class="s2">"Statement"</span><span class="o">:</span> <span class="p">[{</span>
|
||||||
|
<span class="s2">"Sid"</span><span class="o">:</span> <span class="s2">"AllowPublicRead"</span><span class="p">,</span>
|
||||||
|
<span class="s2">"Effect"</span><span class="o">:</span> <span class="s2">"Allow"</span><span class="p">,</span>
|
||||||
|
<span class="s2">"Principal"</span><span class="o">:</span> <span class="p">{</span>
|
||||||
|
<span class="s2">"AWS"</span><span class="o">:</span> <span class="s2">"*"</span>
|
||||||
|
<span class="p">},</span>
|
||||||
|
<span class="s2">"Action"</span><span class="o">:</span> <span class="p">[</span><span class="s2">"s3:GetObject"</span><span class="p">],</span>
|
||||||
|
<span class="s2">"Resource"</span><span class="o">:</span> <span class="p">[</span><span class="s2">"arn:aws:s3:::/*"</span><span class="p">]</span>
|
||||||
|
<span class="p">}]</span>
|
||||||
|
<span class="p">}</span>
|
||||||
|
</pre></div>
|
||||||
|
<p>Replace <bucket name> 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">"Resource"</span><span class="o">:</span> <span class="p">[</span><span class="s2">"arn:aws:s3:::<bucket>/<path>/*"</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>
|
|
@ -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 > Utilities > 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>
|
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 141 KiB |
After Width: | Height: | Size: 141 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 155 KiB |
After Width: | Height: | Size: 155 KiB |
After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 157 KiB |
After Width: | Height: | Size: 157 KiB |
|
@ -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=""Soda
|
||||||
|
theme""></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=""Example of
|
||||||
|
SublimeLinter""></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=""Example of SublimeCode
|
||||||
|
Intel""></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=""Example of
|
||||||
|
SublimeRope""></p>
|
||||||
|
<h2 id="git-gitgutter">Git & 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=""Example of
|
||||||
|
GitGutter""></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=""SidebarEnhancements contextual
|
||||||
|
menu""></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=""Example of
|
||||||
|
AdvancedNewFile""></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>
|
|
@ -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=""Early draft of Project
|
||||||
|
Herobrine""></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 <task></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>
|
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 373 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 31 KiB |
|
@ -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=""Tweeria
|
||||||
|
summary""></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=""My
|
||||||
|
profile""></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=""Upcoming and in-progress
|
||||||
|
raids""></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=""Some tweeria stats
|
||||||
|
windows""></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>!<spell shortcut></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=""The beautiful
|
||||||
|
map""></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>
|
After Width: | Height: | Size: 294 KiB |
After Width: | Height: | Size: 166 KiB |
After Width: | Height: | Size: 166 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 29 KiB |
|
@ -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=""Kamisama no Iutoori \(FUJIMURA
|
||||||
|
Akeji\)""></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>
|
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 69 KiB |
|
@ -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=""Psyren""></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>
|
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 198 KiB |
|
@ -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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>The war of the ancients Trilogy</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Warcraft: Orcs and Humans</strong></td>
|
||||||
|
<td><em>The first war</em></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> & <strong>Pre-Warcraft III</strong></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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>–</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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Warcraft III: Reign of Chaos</strong></td>
|
||||||
|
<td><em>The third war</em></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>The war of the ancients Trilogy</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>WoW: The Burning Crusade</strong></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>–</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </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>
|
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 175 KiB |
After Width: | Height: | Size: 175 KiB |
|
@ -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>
|
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 90 KiB |
|
@ -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=""Enigma""></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>
|
|
@ -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>
|
|
@ -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->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>
|
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 70 KiB |
|
@ -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>
|
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 290 KiB |
After Width: | Height: | Size: 437 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 55 KiB |
|
@ -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 &> /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: "cloth", "chain", "iron", "diamond", "gold"
|
||||||
|
./classes/bge.java: "cloth", "chain", "iron", "diamond", "gold"
|
||||||
|
./classes/kd.java: w = (new kc(17, "diamonds", -1, 5, xn.p, k)).c();
|
||||||
|
./classes/rf.java: null, "mob/horse/armor_metal.png", "mob/horse/armor_gold.png", "mob/horse/armor_diamond.png"
|
||||||
|
./classes/xn.java: p = (new xn(8)).b("diamond").a(wh.l);
|
||||||
|
./classes/xn.java: cg = (new xn(163)).b("horsearmordiamond").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("flintAndSteel");
|
||||||
|
</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<code>[a-z]{2}\((?P<id>[1-9]{1,3}).*\"(?P<name>\w+)\"\))/</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">"hoeGold"</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">"seeds"</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">"wheat"</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">"helmetCloth"</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">"chestplateCloth"</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">"seeds"</span><span class="p">);</span>
|
||||||
|
<span class="n">yi</span><span class="p">(</span><span class="s2">"39"</span><span class="p">,</span> <span class="s2">"aqh.ad.cE"</span><span class="p">,</span> <span class="s2">"aqh.aE.cE"</span><span class="p">)</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">"seeds"</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">"chickenRaw"</span><span class="p">);</span>
|
||||||
|
<span class="n">xi</span><span class="p">(</span><span class="s2">"109"</span><span class="p">,</span> <span class="s2">"2"</span><span class="p">,</span> <span class="s2">"0.3F"</span><span class="p">,</span> <span class="s2">"true"</span><span class="p">)</span><span class="o">.</span><span class="n">a</span><span class="p">(</span><span class="s2">"mv.s.H"</span><span class="p">,</span> <span class="s2">"30"</span><span class="p">,</span> <span class="s2">"0"</span><span class="p">,</span> <span class="s2">"0.3F"</span><span class="p">)</span><span class="o">.</span><span class="n">b</span><span class="p">(</span><span class="s2">"chickenRaw"</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">"<Item(</span><span class="si">%d</span><span class="s2">: '</span><span class="si">%s</span><span class="s2">')>"</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">"Sets the name"</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><insert obfuscated class name here></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">'code'</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('name \'(?P<name>\w+)\' is not defined')</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">'name'</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">'code'</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>
|
|
@ -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><username>:<Yubikey token ID 1>[:<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><first username>:<Yubikey token ID 1>[:<Yubikey token ID 2][:...]
|
||||||
|
<second username>:<Yubikey token ID 3>[:<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>
|
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 243 KiB |
After Width: | Height: | Size: 730 KiB |
After Width: | Height: | Size: 255 KiB |
|
@ -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>
|
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
|
@ -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'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'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'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> </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> </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> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint64</td>
|
||||||
|
<td>inode number</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint32</td>
|
||||||
|
<td>User ID</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint32</td>
|
||||||
|
<td>Group ID</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint32</td>
|
||||||
|
<td>Last modified time</td>
|
||||||
|
<td>EPOCH</td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint32</td>
|
||||||
|
<td>Last accesed time</td>
|
||||||
|
<td>EPOCH</td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint32</td>
|
||||||
|
<td>Created time</td>
|
||||||
|
<td>EPOCH</td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint64</td>
|
||||||
|
<td>File size</td>
|
||||||
|
<td> </td>
|
||||||
|
<td>0x0...0</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>uint8</td>
|
||||||
|
<td>Flag</td>
|
||||||
|
<td>0x1 to 0xB</td>
|
||||||
|
<td> </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> </td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table><p><strong>More info: </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>
|
|
@ -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> login your_username_here
|
||||||
|
# Your password WILL BE VISIBLE. But after a first login
|
||||||
|
# your credentials will be cached so you don't need to
|
||||||
|
# expose them everytime you need to use the steamcmd.
|
||||||
|
Steam> app_update 211820
|
||||||
|
# This will install starbound, it will take a while
|
||||||
|
# depending on the server bandwidth.
|
||||||
|
Steam> 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't sure why.
|
||||||
|
Steam> 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>
|
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 15 KiB |
|
@ -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>
|
|
@ -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 "/" -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>
|
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 22 KiB |