Мини заметки — выпуск 12

22 мая 2013

Темы выпуска: настройка Claws Mail, генерация UUID и каррирование в Erlang, как в Linux заблокировать экран перед выполнением pm-suspend, и не только. Предыдущие выпуски: одиннадцатый, десятый, девятый, восьмой.

1. Как сгенерировать UUID в Erlang

Генерация валидного UUID 4-ой версии занимает пять строк кода на Erlang:

-module(uuid).

-export([
    generate/0
  ]).

generate() ->
  <<A:32, B:16, C:16, D:16, E:48>> = crypto:rand_bytes(16),
  Str = io_lib:format(
    "~8.16.0b-~4.16.0b-4~3.16.0b-~4.16.0b-~12.16.0b",
    [A, B, C band 16#0fff, D band 16#3fff bor 16#8000, E]),
  list_to_binary(Str).

Библиотека для подключения этого кода к своему проекту доступна на GitHub.

2. Как в Linux одновременно сделать suspend и lock

Если просто приостановить операционку командой pm-suspend, то после выхода из suspend любой сможет получить доступ к вашей системе. Я решил эту проблему следующим образом.

Файл ~/bin/suspend:

#!/bin/sh

gksudo ~/bin/suspend-priv

Файл ~/bin/suspend-priv:

#!/bin/sh

sudo -u eax i3lock -c 000000 & (sleep 3 && pm-suspend)

Решение вполне очевидное — блокируем экран, и только потом уходим в suspend. Фокус в том, чтобы выполнить все команды в правильной последовательности и от имени нужных пользователей.

3. Каррирование в Erlang

В Erlang нет каррирования, но его можно добавить:

1> F0 = curried:make(fun(A,B,C,D,E,F) -> [A,B,C,D,E,F] end).
{curried_function,#Fun<erl_eval.17.17052888>,6,[],[]}
2> F1 = curried:apply(F0, [1,2,3]).
{curried_function,#Fun<erl_eval.17.17052888>,3,[3,2,1],[]}
3> curried:arity(F1).                                      
3
4> F2 = curried:rapply(F1, [5,6]).
{curried_function,#Fun<erl_eval.17.17052888>,1,[3,2,1],[5,6]}
5> curried:apply(F2, [4]).
[1,2,3,4,5,6]

Код библиотеки доступен на GitHub.

4. Проверка орфографии русского языка в Claws Mail

«Из коробки» в моем любимом почтовом клиенте Claws Mail нет проверки орфографии русского языка. Говорим:

sudo aptitude install hunspell-ru

… и русские слова больше не выделяются красным. Если, конечно, в них нет ошибок.

5. Почему Си не является подмножеством C++

Программа выводит «C», если собрать ее с помощью gcc, и «C++», если с помощью g++:

#include <stdio.h>
 
int main() {
  printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C");
  return 0;
}

via @konung.

6. Перенаправление stdout в два пайпа

Следующая команда считает количество строк в файле и сжимает его в один проход:

cat test.c | tee >(wc -l >&2) | gzip > test.gz

via @truecrux.

7. Еще один скрипт для создания скриншотов

Делаем скриншот экрана, заливаем его на radikal.ru, открываем в pixlr.com, удаляем с radikal.ru:

#!/usr/bin/env perl

use strict;
use warnings;

`scrot /tmp/new-screenshot.png`;
my $rslt = `radikal-upload /tmp/new-screenshot.png`;
die if $?;

my ($img) = $rslt =~ /Image:\s(.*)/;
my ($del) = $rslt =~ /Delete:\s(.*)/;

`chromium-browser http://pixlr.com/editor/?image=$img`;

sleep 30;
`$del`;

Скрипт radikal-upload вы найдете в конце 10-го выпуске мини-заметок.

8. Увеличиваем количество рабочих столов в i3

По-умолчанию в оконном менеджере i3 доступно всего-навсего десять рабочих столов. Дописываем в ~/.i3/config:

bindsym $mod+y workspace 11
bindsym $mod+u workspace 12
bindsym $mod+i workspace 13
bindsym $mod+o workspace 14
bindsym $mod+p workspace 15

bindsym $mod+Shift+Y move container to workspace 11
bindsym $mod+Shift+U move container to workspace 12
bindsym $mod+Shift+I move container to workspace 13
bindsym $mod+Shift+O move container to workspace 14
bindsym $mod+Shift+P move container to workspace 15

Жмем Win+Shift+R. Теперь рабочих столов стало пятнадцать!

9. Алиасы в SSH

Прописываем в ~/.ssh/config:

Host user.dev
  Hostname user.dev.example.com
  User user
  ForwardAgent yes

Говорим ssh user.dev. Это будет полностью аналогично более длинной команде ssh -A user@user.dev.example.com.

10. Синхронизация фильтров в Claws Mail

Все фильтры хранятся в файле ~/.claws-mail/matcherrc. Просто копируем его с машины на машину.

Дополнение: Мини заметки — выпуск 13, полностью посвященный Linux

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.