Alex Raichev

What is This?

Can you guess what this Chinese-made product is, given the following product description printed on its box? Not to give it away too easily, i've replaced one word with +++.

  1. This product is a new science and technology product and made with high and new science and technology. It can illuminate only placing it in rhythm.
  2. No need any power. No environmental pollution. Low noise and health. Comparing with common +++ it can be several times on lift.
  3. Constantly using this health +++, it can benefit to your palm, arm and shoulder stretching and blood circulation, so as to let your hands relax and brain clever, hand and brain coordinate and promote your brain memory and health composition.
Author: Alex Raichev
Date: 2013-10-20
Tags: puzzle
Permalink, Comment

Experience vs Memory

youtube~XgRlrBl-7Yg

Pychologist Daniel Kahnemann explains that our "experiencing selves" and our "remembering selves" perceive happiness differently.

Author: Alex Raichev
Date: 2013-08-24
Tags: psychology, video, Kahnemann
Permalink, Comment

Do the Math

youtube~IsIfokifwSo

And join the movement to solve the climate crisis at 350.org.

Video sourced from YouTube here.

Author: Alex Raichev
Date: 2013-07-13
Tags: global warming, video, 350
Permalink, Comment

PRISM Break

Opt out of PRISM, the NSA’s global data surveillance program. For software tips, see http://prism-break.org/.

Author: Alex Raichev
Date: 2013-07-05
Tags: website, PRISM, security
Permalink, Comment

Brahma

If the red slayer think he slays,
Or if the slain think he is slain,
They know not well the subtle ways
I keep, and pass, and turn again.

Far or forgot to me is near;
Shadow and sunlight are the same;
The vanished gods to me appear;
And one to me are shame and fame.

They reckon ill who leave me out;
When me they fly, I am the wings;
I am the doubter and the doubt,
I am the hymn the Brahmin sings.

The strong gods pine for my abode,
And pine in vain the sacred Seven;
But thou, meek lover of the good!
Find me, and turn thy back on heaven.

~ Ralph Waldo Emerson, 1857

Apparently Emerson should have titled this poem 'Brahman' instead of 'Brahma'. For why and more insighful commentary, see Emerson's Brahma: An Indian Interpretation, K. R. Chandrasekharan, The New England Quarterly, Vol. 33, No. 4 (Dec., 1960), pp. 506-512.

Author: Alex Raichev
Date: 2013-06-04
Tags: poem, Emerson
Permalink, Comment

Flow

youtube~jE1j5Om7g0U

Judson Brewer, an addiction psychiatrist and neuroscientist at Yale University, describes flow and his research findings on the topic.

Video sourced from YouTube here.

Author: Alex Raichev
Date: 2013-05-25
Tags: nonduality, video, neuroscience
Permalink, Comment

The New World of Sales

youtube~O1bSwewzyjQ

Author Daniel H. Pink answers seven questions about pitching, selling, and closing for the 21st Century workforce.

Video sourced from YouTube here.

Author: Alex Raichev
Date: 2013-05-25
Tags: sales, video
Permalink, Comment

Blohg to Pelican

Over the past few days i moved this website's backend from Blohg to Pelican, both of which are RST-capable website generators. I did so, because i don't need the dynamic Flask-application capabilities of Blohg and because Pelican is more mature and equally simple to use.

The transition was mostly smooth, but i did encounter a few issues that required me to search beyond Pelican's documentation to resolve. To save new Pelicaneers the effort, here are those issues and resolutions.

Issue 1: Custom paginated templates.

I wanted a separate landing page and blog page, and the Pelican docs don't elaborate on this point. Querying the Pelican developers through the project's Github page, i received instructions from justinmayer. First, he said, i needed to make a custom template to house my blog, which i called blog.html. It contains the code

{% extends "base.html" %}
{% set active_page = "blog" %}
{% block title %}{{ SITENAME }} - Blog{% endblock %}
{% block content %}
{% for article in (articles_page.object_list if articles_page else articles) %}
    <div class="blogItem">
    <h1><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></h1>
    {{ article.content }}

    <div class="blogMeta">
    Author: <a href="mailto: {{ AUTHOR_EMAIL }}">{{ article.author }}</a><br>
    Date: {{ article.locale_date }}<br>
    {% if article.tags %}
        Tags:
        {% for tag in article.tags %}
            <a href="{{ SITEURL }}/{{ tag.url }}">
            {{ tag }}</a>{% if not loop.last %}, {% endif %}
        {% endfor %}<br />
    {% endif %}
    <a href="{{ SITEURL }}/{{ article.url }}#disqus_thread">Comments</a> -
    <a href="{{ SITEURL }}/{{ article.url }}">Permalink</a>
    </div>
    </div><!-- end #blogItem -->
{% endfor %}
{% include 'pagination.html' %}
{% endblock content %}

By the way, here's the code for the pagination template pagination.html:

{% if articles_page and articles_paginator.num_pages > 1 %}
    <div class="pagination">
    <ul>
    {% if articles_page.has_previous() %}
        {% set num = articles_page.previous_page_number() %}
        <li class="prev"><a href="
            {{ SITEURL }}/{{ page_name }}{{ num if num > 1 else ''}}.html"
            >&laquo;</a></li>
    {% endif %}
    {% for num in range( 1, 1 + articles_paginator.num_pages ) %}
        <li><a href="
            {{ SITEURL }}/{{ page_name }}{{ num if num > 1 else '' }}.html"
            class="{{ 'active' if num == articles_page.number else '' }}"
            >{{ num }}</a></li>
    {% endfor %}
    {% if articles_page.has_next() %}
        <li class="next"><a href="
            {{ SITEURL }}/{{ page_name }}{{
               articles_page.next_page_number() }}.html"
            >&raquo;</a></li>
    {% endif %}
    </ul>
    </div>
{% endif %}

I got it from the tuxlit_tbs Pelican theme and modified it to my liking.

Second, i had to add the following lines to my pelicanconf.py.

DIRECT_TEMPLATES = (('index', 'blog', 'tags', 'categories', 'archives'))
PAGINATED_DIRECT_TEMPLATES = (('blog',))

Issue 2: Disqus comments.

This is another topic the Pelican docs don't elaborate on. To embed Disqus comments in my blog pages, i read Disqus's help article on embedding comments and Disqus's help article on adding comment counts and did the following.

First, i made the template disqus_comments.html which contains the code

{% if DISQUS_SITENAME %}
    <div class="blogItem">
    <h2>Comments</h2>
    <div id="disqus_thread"></div>
    <script type="text/javascript">
        var disqus_shortname = '{{ DISQUS_SITENAME }}';
        (function() {
            var dsq = document.createElement('script');
            dsq.type = 'text/javascript';
            dsq.async = true;
            dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
            (document.getElementsByTagName('head')[0] ||
             document.getElementsByTagName('body')[0]).appendChild(dsq);
        })();
    </script>
    <noscript>
        Please enable JavaScript to view the
        <a href="http://disqus.com/?ref_noscript={{ DISQUS_SITENAME }}">
            comments powered by Disqus.
        </a>
    </noscript>
    <a href="http://disqus.com" class="dsq-brlink">
        blog comments powered by <span class="logo-disqus">Disqus</span>
    </a>
    </div>
{% endif %}

and in my article.html template added the line {% include 'disqus_comments.html' %} before the line {% endblock %}. Doing so embeds Disqus comments for each blog post (article).

Second, i made the template disqus_comment_counts.html which contains the code

{% if DISQUS_SITENAME %}
    <script type="text/javascript">
        var disqus_shortname = '{{ DISQUS_SITENAME }}';
        (function () {
            var s = document.createElement('script'); s.async = true;
            s.type = 'text/javascript';
            s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
            (document.getElementsByTagName('HEAD')[0] ||
             document.getElementsByTagName('BODY')[0]).appendChild(s);
        }());
    </script>
{% endif %}

and in my base.html template added the line {% include 'disqus_comment_counts.html' %} before the </body> tag. That enables blog post comment counts via the tags <a href="{{ SITEURL }}/{{ article.url }}#disqus_thread">Comments</a>.

Issue 3: Typesetting math.

I wanted to use MathJax to typeset math on this site. Pelican has a LaTeX plugin, which uses MathJax, but doesn't work properly at present. It didn't typeset math in the list view of my blog posts, only in the detail view of each post. So i searched the web for an alternative and found this helpful blog post from another Pelican user. Following its instructions, i added this Javascript code into the <head> section of my base.html template:

<!-- Using MathJax, with the delimiters $ -->
<!-- Conflict with pygments for the .mo and .mi -->
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
    "HTML-CSS": {
    styles: {
    ".MathJax .mo, .MathJax .mi": {color: "black ! important"}}
    },
    tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']],processEscapes: true}
    });
    MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
    var VARIANT = MathJax.OutputJax["HTML-CSS"].FONTDATA.VARIANT;
    VARIANT["normal"].fonts.unshift("MathJax_SansSerif");
    VARIANT["bold"].fonts.unshift("MathJax_SansSerif-bold");
    VARIANT["italic"].fonts.unshift("MathJax_SansSerif-italic");
    VARIANT["-tex-mathit"].fonts.unshift("MathJax_SansSerif-italic");
    });
    MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
    var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;
    VARIANT["normal"].fonts.unshift("MathJax_SansSerif");
    VARIANT["bold"].fonts.unshift("MathJax_SansSerif-bold");
    VARIANT["italic"].fonts.unshift("MathJax_SansSerif-italic");
    VARIANT["-tex-mathit"].fonts.unshift("MathJax_SansSerif-italic");
    });
</script>

<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML">
</script>

I removed the ['$','$'] item which allows dollar signs to delimit math text, as is standard in LaTeX documents, but it requires escaping every backslash in the math text with an additional backslash. For now i'll stick with the standard RST role :math: for inline math and the standard RST directive .. math:: for block math display. The area of a circle is Ac = (π ⁄ 4)d2, that is,

Ac = (π)/(4)d2.
Author: Alex Raichev
Date: 2013-05-11
Tags: instructions, tech
Permalink, Comment

Delicious Dal

Ingredients

  • 1.5 C green or brown lentils
  • 5 C water
  • 2 T coconut oil
  • 1 400mL can chopped tomatoes
  • 1 onion chopped
  • 2 cloves garlic chopped
  • 1 T shredded ginger
  • 1 t ground turmeric
  • 1 hot chili
  • 1 red capsicum chopped
  • 1 t salt
  • 1 t cumin seeds
  • 2 t black mustard seeds
  • some coriander leaf for garnish

Directions

  1. Except for 1 T coconut oil, the cumin seeds, and the mustard seeds, put everything into a pressure cooker, and cook at high pressure for 11 minutes.
  2. Fry the reserved coconut oil, cumin seeds, and mustard seeds until the mustard seeds begin to pop.
  3. Add the fried seeds and oil to the soup, garnish with coriander leaf, and serve.

Notes

Serves about 6. C = cup, T = tablespoon, t = teaspoon.

Author: Alex Raichev
Date: 2013-04-27
Tags: recipe
Permalink, Comment

Store Credit

Here's the store credit problem from Google Code Jam Qualification Round Africa 2010, which i discovered via Programming Praxis:

You receive a credit C at a local store and would like to buy two items. You first walk through the store and create a list L of all available items. From this list you would like to buy two items that add up to the entire value of the credit. The solution you provide will consist of the two integers indicating the positions of the items in your list (smaller number first). For instance, with C=100 and L={5,75,25} the solution is 2,3; with C=200 and L={150,24,79,50,88,345,3} the solution is 1,4; and with C=8 and L={2,1,9,4,4,56,90,3} the solution is 4,5.

Algorithm 1

Brute force. Test all pairs in the list. O(n^2) time and O(n) space.

Algorithm 2

Sort the list and then iterate over the list, at each step looking for the complementary price of the current price via binary search. O(n lg n) time and O(n) space.

Algorithm 3

Store the prices and indices in a dictionary and then iterate over the dictionary, at each step looking for the complementary price. Since dictionary look-up is constant time on average, this is an O(n) time (in the average case) and O(n) space algorithm. Hooray!

Here's a Python 2.7 implementation:

def find_pair(credit, prices):
    # Make a dictionary with items of the form
    # (price, set of indices of items with that price).
    # Note that the price list could contain duplicate prices.
    d = dict()
    for (i, p) in enumerate(prices):
        d[p] = d.get(p, set())
        d[p].add(i + 1)  # + 1 to index from 1 instead of 0.
    for price in d.keys():
        if price <= credit:
            # Remove price index from d.
            i = d[price].pop()
            # Check whether there's a complementary price in d.
            if credit - price in d:
                # This works even if price == credit - price.
                j = d[credit - price].pop()
                return min(i, j), max(i, j)
            # Reinsert price index into d.
            d[price].add(i)
    return "Sorry, no pair of item costs sum to %s" % credit
Author: Alex Raichev
Date: 2013-04-11
Tags: algorithm, puzzle
Permalink, Comment


Why no comments? I used to do public comments but found that moderating and maintaining them took too much time in front of the computer, time better spent playing outdoors. So these days I only do private comments, that is, you can email me comments regarding a post by clicking the 'Comment' link at the bottom of the post.