четверг, 5 июля 2012 г.

KISS

Давайте взглянем на код пары простых программ. Первая поставляется с пакетом GNU coreutils во множестве дистрибутивов Linux. Программа называется true и обычно устанавливается в /bin/true :

/* Exit with a status code indicating success.
   Copyright (C) 1999-2012 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <system.h>

/* Act like "true" by default; false.c overrides this.  */
#ifndef EXIT_STATUS
# define EXIT_STATUS EXIT_SUCCESS
#endif

#if EXIT_STATUS == EXIT_SUCCESS
# define PROGRAM_NAME "true"
#else
# define PROGRAM_NAME "false"
#endif

#define AUTHORS proper_name ("Jim Meyering")

void
usage (int status)
{
  printf (_("\
Usage: %s [ignored command line arguments]\n\
  or:  %s OPTION\n\
"),
          program_name, program_name);
  printf ("%s\n\n",
          _(EXIT_STATUS == EXIT_SUCCESS
            ? N_("Exit with a status code indicating success.")
            : N_("Exit with a status code indicating failure.")));
  fputs (HELP_OPTION_DESCRIPTION, stdout);
  fputs (VERSION_OPTION_DESCRIPTION, stdout);
  printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
  emit_ancillary_info ();
  exit (status);
}

int
main (int argc, char **argv)
{
  /* Recognize --help or --version only if it's the only command-line
     argument.  */
  if (argc == 2)
    {
      initialize_main (&argc, &argv);
      set_program_name (argv[0]);
      setlocale (LC_ALL, "");
      bindtextdomain (PACKAGE, LOCALEDIR);
      textdomain (PACKAGE);

      atexit (close_stdout);

      if (STREQ (argv[1], "--help"))
        usage (EXIT_STATUS);

      if (STREQ (argv[1], "--version"))
        version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS,
                     (char *) NULL);
    }

  exit (EXIT_STATUS);
}

Вторая относится к пакету "sbase" проекта suckless.org.

/* See LICENSE file for copyright and license details. */
#include <stdlib.h>

int
main(void)
{
 return EXIT_SUCCESS;
}

Обе программы делают одну вещь. Ничего. Просто выходят, возвращая значение "успешно". Кто следует идеям UNIX? Кто следует здравому смыслу? Решайте сами.

Ссылки:

воскресенье, 17 июня 2012 г.

TID

В интернете свободно доступна интересная и полезная книга о программировании в Линуксе: Advanced Linux Programming. К несчастью, некоторые темы устарели. Одна из них - 4.5 GNU/Linux Thread Implementation. В книге говорится, что треды GNU/Linux реализованы как процессы. Следующий код должен это подтвердить, но он этого не делает:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *thread_fun(void *arg)
{
    fprintf(stderr, "child thread pid is %d\n", (int)getpid());
    while(1);
    return NULL;
}

int main(void)
{
    pthread_t thread;
    fprintf(stderr, "main thread pid is %d\n", (int)getpid());
    pthread_create(&thread, NULL, &thread_fun, NULL);
    while(1);
    return 0;
}

вторник, 12 июля 2011 г.

Life


Говорят, всё гениальное - просто. Сегодня я в этом убедился.

В поисках разминки для мозгов я бороздил просторы интернета, и набрёл на невзрачный снимок экрана на сайте http://screenshots.debian.net:
Я слышал о "Жизни" и раньше, даже видел работающие примеры этой игры, но не полагал, что вся её суть кроется всего лишь в паре утверждений.

пятница, 10 июня 2011 г.

Terminal


В книге "Современные операционные системы" Эндрю Таненбаум несколько раз говорит о том, что развитие компьютерной индустрии проходит по спирали: позабытые казалось бы технологии переживают своё рождение несколько раз на различных типах устройств, либо с течением времени обретают актуальность.

На раннем этапе развития компьютеров к ним подключались терминалы. Порой это были довольно большие устройства, предоставляющие сразу все устройства ввода-вывода для машины. С терминалом работал оператор. К тому времени разделение инжинеров и программистов уже произошло — человеку не нужно было больше глубоко разбираться в физике и технике, чтобы работать на компьютере.

Теперь к нашим временам. Office 365, Chromebook, Cloud Computing... Все эти новшества позволяют нам вобще не задумываться как и что работает, а сразу получать готовые, работающие машины. Нам даже не нужно администрировать систему, следить за ней (в случае с Chromebook). По сути компьютеры становятся лишь придатком, позволяющим нам подключаться к великой Паутине и жить там. Мозг и центр переносится на мощные серверы, которые обеспечивают нас всем необходимым, выдавая готовый результат вычислений и/или виртуализаций. Домашние компьютеры же становятся не чем иным как удаленным терминалом, набором устройств для ввода информации и получения в каком-либо виде её вывода.

От программистов теперь и окончательно отпочковались пользователи, порой совершенно не интересующиеся внутренностями своей машины или операционной системы. Есть результат, а какой магией он достигается совсем не важно. Со временем пользователи, видимо, станут только ещё тупее, погружаясь в пучину социальных сетей, глубоко пронизывающих всю жизнь. Мы постепенно проектируем Матрицу, не считаете? Что самое странное (впрочем, в фильме было подобное же) — люди сами охотно в неё ныряют. Жутко. Однако дети Эйнштейна были, есть, и будут. Это не может не радовать. Давайте не будем забывать о нашем интересе. В путь! Ковыряться в недрах системы, писать что-то своё, разбираться как это всё работает.

Правда?

вторник, 7 июня 2011 г.

Stability

Стабильность против свежести

или история любви

В нашем мире (свободного программного обеспечения) много священных войн. Это не плохо и не хорошо, это есть. Пожалуй вряд ли можно что-то с этим сделать. Сегодня я хочу рассказать об одном аспекте Linux, по поводу которого ведутся нескончаемые споры.

На стабильность операционной системы смотрят обычно под двумя углами. Одни признают её необходимость и стремятся всячески достичь её. На таких дистрибутивах (естественно при некоторых настройках) вполне можно поднять какой-либо сервер и не беспокоиться за очередное обновление безопасности — операционная система обязана обновиться гладко и безболезненно. Другие полагают, что в дистрибутиве должны быть самые свежие пакеты ежедневно, первых они обычно обзывают некрофилами и клянут всяческими непотребными словами. На мой взгляд сравнивать (а тем паче спорить о том, что лучше) настолько разные системы глупо. Никто в здравом уме не станет ставить Ubuntu(дабы не привлечь на свою голову ненавистников, подчеркну, что речь не о Server Edition) или Fedora на сервер. Для этого есть Debian и CentOS. Любители же нового, любители эффектов и новых игр никогда не установят себе последние.

Так вот, я хотел поделиться некоторыми мыслями по поводу стабильности первого и второго типов систем. Так вышло, что недавно у меня ломался компьютер, и после смены жесткого диска сразу установить родной мне Debian я не смог — нужно было скачать образы. Попробовал то, что было.

Вспомнил начало своей жизни в Linux — поставил Ubuntu, посмотрел. Стала ещё красивее и удобнее. Что ж, здорово. Постоянная свежесть и все блага, которыми обладает Linux. Можно вполне себе играть в новейшие игры в последней версии Wine. Минусы? Постоянные обновления. Для Ubuntu нужен очень хороший канал связи, чего в нашем общежитии (естественно, университета связи!) как раз не хватает. Сами обновления порой меняют что-то настолько кардинально близкое и понятное, что даже теряешься (это я о Unity).
Попробовал несколько раз и Fedora. Новый Gnome очень красив. И пока что так же нестабилен. На мой взгляд, сейчас в нём работать — мука. Однако уверен, ситуация будет исправлена.

Затем я решил попробовать установить CentOS. Вот чёрт, столько мороки с установкой у меня не было никогда. Даже опыт установки Slackware парой недель ранее не помог. Я многократно и различными способами записывал образ на флешку, стартовал с неё загрузчик и не мог поставить систему. Первоначально это был liveCD, и я просто не нашёл в этой системе, как же можно установить CentOS. Затем был скачан DVD. Тысячекратные перезаписи на флешку, её вставляния и выдёргивания. Проблема системы установки CentOS для меня заключалась в том, что она не монтирует раздел при выборе пункта меню "с жесткого диска". Я опробовал это несколько раз. Когда мои нервы были на исходе, меня осенило. Загрузчик полностью выгружается в оперативную память! Я залил на флешку загрузчик и следом на неё же образ диска. Тогда и только тогда я установил CentOS.

Разочарование было велико. Community ENTerprise Operating System установлен в нашем университете и там работает вполне прилично. На нем приятно программировать. На нетбуке же он почему-то не создал сетевой интерфейс, хотя вроде бы определил сетевую карточку. Пакеты были древними (о, не старыми, именно древними — даже Debian по сравнению с этим более свеж). Заморачиваться с настройкой сил не было..

Теперь снова Debian.
Только что, второй раз затерев кэш и настройки браузера Chromium, я понял, что браузер падал из-за последней версии расширения Adblock plus. Которое: а) из официального источника Google просто не ставилось, принуждая обновляться; б) поставленное с сайта расширения роняло браузер. Попытки найти более старые версии расширения успехом не увенчались.

Некоторые выводы. Быть актуальным и свежим здорово. Но, чёрт возьми, быть назойливым и вынуждая всех обновляться ничуть не лучше, чем навязывать политические взгляды всем, кто думает не как ты. Полагаю, писать отчёт об ошибке в данном случае глупо — скажут, чтобы обновлялся. Пожалуй я найду расширение, спросив у дебианщиков. Хорошо ли это? Чёрт, я бы не сказал.

В очередной раз я убедился в правильности позиционирования Debian. Это действительно Универсальная операционная система, которая не стремится быть блестящей. Это проработанный и стабильный Linux. Я его обожаю. Обладая всеми функциями, необходимыми системе "рабочего стола", он вдобавок стабилен и обладает кучей пакетов, что позволяет настроить его под абсолютно любые нужды. Он гармонично сплетает в себе стабильность и красоту необходимых пакетов. Ничего лишнего. Только то, что хочешь ты.

Прошу не принимать сказанное близко к сердцу — не хочу разжечь очередной спор. Это мои мысли по поводу стабильности и свежести дистрибутивов. Спасибо за внимание.