LINUX.ORG.RU

Избранные сообщения oxapentane

Трудности перехода. Hex редактор

Форум — Desktop

Посоветуйте более-менее мощный hex-редактор для замены 010 Editor’a (Знаю, есть нативный, но цена как-то высоковата).

Нужно чтобы он

а) был графическим, qt|kde|gtk3

б) поиск/замена текста работала во всех открытых вкладках одновременно

в) имел встроенный скриптовый язык для обработки бинарных данных

На поддержку шаблонов данных и совместимость со скриптами 010 я уже даже не рассчитываю…

Все что я нашел - либо слишком примитивные, или консольные.

Может быть, существует какое-то расширение для vscodium которое так умеет?

 , ,

hargard
()

выбор принтера «во время чумы» 2020

Форум — Talks

Всех приветствую.

Не так давно сдох мой самсунг который верой и правдой 10 лет снабжал меня потешными лубками на разные темы.

Надо что-то делать дальше по сему призываются специалисты по всему с вопросом.

Есть два варианта «чего хочется»:

  1. Принтер, лазерный, ч/б, разрешение по обеим осям не менее 1200dpi. Дешевые и доступные рассходники. Для бытового использования - типа пачки бумаги в 3-6 мес. Если есть возможность ставить совместимый картридж это плюс. Заправка картриджей не интересует (лично мне проще купить новый). Обязательно проводной езернет, но если есть беспроблемный wi-fi то пусть (подключения к моей точке доступа). Поддержка в линуксе без пердолинга.

  2. МФУ (принтер, копир, сканер). Печатающая часть как в пункте 1. Сканер цветной, планшетный. Если есть автоподача, то это плюс. Разрешение самое ходовое (что там модное? не менее 4800dpi по обеим осям). Компактность. Поддержка сканирования по сети. Если есть такая фича чтобы по нажатию кнопки на сканере отправлял в предустановленную сетевую шару это плюс. поддержка линукса так же без пердолинга.

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

По производителям. Всегда считал HP самыми крутыми. Но говорят, на почве жаности скурвились. Бразеры слышал хороши. Кеосиры очень хороши, но любит фотовал сделать отдельно от тонера.

Нужны личные истории успеха.

 , ,

yax123
()

Переехал на кучу утилит переписаных на Rust

Форум — Talks

Тег «угадай автора по заголовку».

Q: Зачем?

A: Ради эксперимента, повысится комфорт пользования терминалом или нет.

Q: Причем тут Rust?

A: Ни при чем, но из-за нативности и отсутствия GC на нем толпа людей побежала переписывать что ни попадя. С таким же успехом можно было бы и npm install, но тормозило бы. Ближе opam install или go get

Теперь мой терминал по истине свистит и пердит. Даю список если кому надо.

  • alacritty - GPU ускоренный терминал.
  • alias cat=bat- cat с хорошей подсветкой синтаксиса и нумерацией строк и пейджером.
  • broot - навигатор по каталогам, который одновременно показывает дерево, но адекватно себя ведет с громадными каталогами, показывая их по чуть-чуть.
  • dust - утилита для исследования места занимаемого каталогами, сортирует деревья файлов начиная с самых больших каталогов.
  • alias ls="exa -l --group-directories-first" ls с хорошими дефолтами, tree встроено.
  • rip Утилита для удаления файлов с разными удобными фичами и восстановлением
  • hors "How do I parse float in javascript?" - находит короткий ответ в интернетах и отвечает. Чуть лучше работает чем оригинал - howdoi.
  • mdcat - cat для Markdown, для отображения удобочитаемой формы документа. Ссылки делает сносками.
  • alias grep=rg - очень быстрый и удобный grep
  • starship - shell command prompt, показывает кучу полезной информации в зависимости от контекста, например git branch если в репозитории, версии софта и ЯП если в каталогах с сорцами, hostname если зайти по ssh.
  • tokei - сборщик статистики по ЯП и строкам кода в деревьях исходников.
  • hyperfine - бенчмарк утилита, time на стероидах.
  • tldr- сокращенная версия man, показывает как чем пользоваться в примерах, а не выдавая полную справку. Страницы поддерживаются сообществом для громадного количества утилит. Изначальный проект - https://tldr.sh/
  • topgrade - универсальная утилита обновления. При запуске пытается обновить все что видит - системные пакеты, vim пакеты и так далее.
  • runiq - быстрый sort | uniq с разными алгоритмами внутри.
  • fd - быстрый и удобный find, удобно чтобы не вспоминать заковыристые ключи
  • fselect - поисковик файлов с SQL-like языком запросов
  • sd - как sed, только интуитивный
  • i3status-rs - Сразу i3status+i3blocks. Плюс батарейки к i3blocks, которые как я понял автор решил убрать.
  • onefetch - Вроде neofetch, но для сорцов. Просто запустите эту штуку с корня любого git репа, клонированого локально
  • wasmtime - JIT runtime для WASI стандарта. Пускалка WebAssembly приложений.
  • scriptisto - «shebang-интерпретатор» для компилируемых языков, прозрачно собирает и кеширует нативные сборки кода

Что не зашло совсем

Все вышеперечисленое ставится через cargo install <package_name> (кроме alacritty), название смотрите на страницах. Сам cargo и Rust ставятся через

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

P.S. Призываю остальных взять ЯП вашей секты и поставить такой эксперимент и отписаться. Да-да, расскажите как вы пользовались ls на Java. Пользователей emacs прошу не беспокоить

 , , ,

vertexua
()

Посоветуйте годную светлую тему

Форум — Development

В первую очередь для vim и терминала, но в общем и целом х3 куда оно ещё зайдёт…

 , ,

pon4ik
()

Наноконкурс по Си :)

Форум — Development

Вдохновленный подобным запилю свой маленький топик :) В 2010, читая Седжвика, увидел такую задачу:

Написать программу, которая принимает строку в качестве аргумента и распечатывает таблицу, которая отображает встречаемые в строке символы с частотой появления каждого из них.

Проще некуда, ведь правда?

Для ее решения был накрапан такой быдлокод

#include <iostream>
#include <unistd.h>
#include <string.h>

using namespace std;

int main(int argc, char* argv[])
{ const int N = 255;
  const unsigned int sz = 26;
  static int l = 0;
  const char alf[sz]={'a','b','c','d','e','f','g','h','i','j','k','l','m',
						 'n','o','p','q','r','s','t','u','w','x','y','z'};
  int index[sz];
  char str[N];
   for (int i = 0; i < sz;i++)
   {index[i] = 0;
   }
   cin >> str;
   cout <<'\n';
   for ( unsigned int j = 0; j < (strlen(str));j++)
   {   if(str[j] < 0x61)
	   str[j] = _tolower(str[j]);
	 for (int k = 0; k < sz;k++){
		 if (str[j] == alf[k]) index[k]++;}  
   }
    cout <<'\t';
	for(int l = 0; l < sz;l++)
	  if (index[l]) { 
		  cout << alf[l] <<" ";
		  cout << index[l] <<'\n' <<'\t';
	  } 
	sleep(7);
   return 0;
}
Тут правда табуляции корежать линуксовый терминал, немного, но тогда дело было под оффтопом. Из того, что хотелось бы улучшить, например, чтобы программа выводила еще и позицию заданного символа от начала строки.

Короче, принимаются ваши красивые решения господа, а также коменты Царя, про мою тотальную АНскильность, хроническое НИасиляторство и даунизм. You are welcome!

 , ,

Twissel
()

Как сделать чтение кода максимально приятным?

Форум — Development

Есть код на Си, в котором хотелось бы разобраться. Открыл один файл вимом — почитал и закрыл, отрыл другой — почитал и закрыл. Открыл все остальные и заблудился.
Как бы удобно так смотреть сразу на все файлы, чтобы посмотреть — ага, дефайн, этот дефайн использован там-то и там-то. Ага, что-то непонятное, так препроцессор же из этого сделает 0x03ff!
Сейчас я для этого использовал конвеер из find и grep, не очень-то удобно.
Обязательно иметь подсветку для Си и желательно для ассемблерных вставок тоже.
Посоветуйте, что можно предпринять.

 , , , ,

CYB3R
()

vim-anywhere || вездевим.sh

Форум — General

Тут попался на глаза новый плугин, суть такова: находимся в броузере, другом редакторе, где-угодно → нажимаем хоткей → открывается гвим/вимтерминал → пишем текст, сохраняем-выходим → вуаля, это дело попало в буфер обмена, откуда можно теперь вставить в целевое приложение, которое в фокусе, потому что гвим/вимтерминал закрылись автоматически после сохранения.

В плугине что-то говорится про установку, какой-то гном, какие-то gsettings/gconf и прочая ненужная шелупонь, короче я его обрезал и повесил как скрипт на хоткей в осоме:

#!/bin/bash

TMPFILE_DIR=/tmp/vim-anywhere
TMPFILE=$TMPFILE_DIR/doc-$(date +"%y%m%d%H%M%S")

mkdir -p $TMPFILE_DIR
touch $TMPFILE

if [[ $OSTYPE == "linux-gnu" ]]; then
  chmod o-r $TMPFILE # Make file only readable by you
  gvim --nofork $TMPFILE
  cat $TMPFILE | xclip -selection clipboard
fi

Естественно, должен стоять xclip. Если подумать, то можно докрутить сюда автопасту выделенного до открытия вима и непосредственное редактирование выделенного текста, а не создание нового.

И на десерт, мощная вещь: https://github.com/itchyny/calendar.vim

 , ,

science
()

Хочу запилить свой ЯП на асме.

Форум — Development

Есть у меня некоторые идейки. Основная идея - простота и прзрачность, ну и, я бы сказал, несколько иной, концептуально, подход, но это сложная тема, не влезает в рамки топика.

Тащемта, основные наброски, можно сказать рабочий прототип, уже готов, я его реализовал на js. Основная проблема в скорости. Думаю, логично было бы написать его на асме. Но проблема в том, что как сам асм, так и архитектуру, я знаю чуть меньше чем никак. Это печально.

Однако, для реализации мне хватило бы некоего подобия лисповских car и cdr, и возможности их модификации. Т.е. Нужно, всего-навсего, делать ссылки из какой либо единицы памяти на другие единицы, условно говоря, с атома на список атомов, и далее по цепочке, прошу прощения, за корявую терминологию.

Возможно ли такое реализовать, пусть не идеально, не эффективно, но чтоб хоть как-то работало, не изучая премудростей архитектуры, и, особенно, хексов и прочего ч-бства. Если да, то дайте пожалуйста направление, куда нужно копать.

Благодарю за ответы.

 ,

anonimous
()

Прекрасный мир вокруг

Галерея — Скриншоты

Здесь вы можете увидеть, как GIMP легко и непринужденно отображает небольшое изображение.
Само изображение давно уже было обсуждено на лоре (старожилы могут накидать ссылок), изначально было скачано с торентов и конвертировано в png посредством консольного редактора изображений ImageMagick. В процессе этого действия пришло осознание, что для правильно написанной программы недостаток оперативной памяти (которой у меня наскребётся не более 8 Гб) не является помехой.
На данное действие меня сподвигла вызывающе неверная фраза мельком брошенная на хабре, что нет такой программы, которая бы смогла отобразить подобное изображение в связи со слишком большим его размером.

p.s. так же самые зоркие могут углядеть System Monitor, оперативно отображающий сетевой трафик, температуру и нагрузку процессора, процент занятой памяти и свопа, заряд батареи и свободное место на файловой системе. Всё то же самое могли бы отображать и конки, только вот уже недели три я не видел обоев и даже успел позабыть, что сейчас на них поставлено.

>>> Просмотр (1600x900, 1015 Kb)

mm3
()

Тёмные углы C и C++

Форум — Development

Изначально даный пост предназначался для habrahabr, но местные модераторы его не пропустили без объяснения причин:

Увы, ваш топик «Тёмные углы C и C++» не был одобрен и не попал в общую ленту. Причин этому может быть много, но просим не терроризировать службу технической поддержки, так как там вашу статью даже не видели. Расстраиваться тоже не стоит - попробуйте опубликовать что-нибудь еще.

С уважением, Хабрахабр

В связи с этим выкладываю его сюда.

Я, как и многие из вас, работаю программистом. Официально моя должность не привязана к какому-либо конкретному языку программирования, что, кстати говоря, прекрасно, ведь для каждой задачи должны быть свои инструменты. Но довольно часто выбора просто нет (например, из-за особенностей реализации той или иной платформы), в связи с чем подавляющее большинство моих проектов пишутся на C++.

Я не гуру C++. Я не могу похвастаться тем, что с уверенностью распознаю любую шаблонную конструкцию данного языка или возьму и вспомню, что возвращает какая-то редко используемая мной функция из стандартной библиотеки без помощи документации.

Думаю, вы со мной согласитесь, что C++ — язык с очень высоким порогом вхождения. Серьёзно! Я изучаю этот язык уже больше 3 лет, и практически каждую неделю открываю в нём что-то новое и удивительное. Именно об этом «новом и удивительном» и пойдёт речь в данной статье.

За то время, пока я изучал C++, у меня потихоньку накапливались интересные задачки, сниппеты и просто необычные куски кода, которыми я делился с коллегами по работе и знакомыми. У нас даже появилась своего рода традиция — каждый рабочий день с того момента, как я пришёл в компанию, я выкладывал по две новых задачки, которые мы старались по возможности обсудить в перерывах. Постепенно их набиралось всё больше и больше, пока, наконец, я не стал забывать некоторые из них. Именно в тот момент я решил предпринять попытку составления сборника так называемых «тёмных углов» C и C++. Я собрал воедино все те куски кода, что видел до сих пор, дополнил их цитатами из различных стандартов и продолжил копить свою «коллекцию». Изначально моей целью было собрать вместе всего 100 задачек, но я и оглянуться не успел, как их стало уже 200, 300 и вот теперь 400. На самом деле, их даже больше, но на данном этапе я решил ограничиться именно этим количеством.

Итак, представляю Вашему вниманию книгу «C and C++ Dark Corners». Конечно, назвать её книгой можно с натяжкой, ведь это, как я уже и сказал, сборник интересных и для кого-то малоизвестных мест C и С++.

Не откладывайте её в сторону после пары-тройки вопросов, ответы на которые Вы уже итак знаете — я уверен, что хоть какие-то из них заставят Вас задуматься, а ответы на другие могут удивить и даже шокировать.

В качестве примера приведу несколько вопросов из книги:

97. Что попадёт в stdout в результате выполнения след. кода и почему?

#include <iostream>
#include <memory>

#include <boost/smart_ptr/scoped_ptr.hpp>

class Foo
{
public:
 ~Foo() { std::cout << "Foo::~Foo() \n"; }
};

class Bar : public Foo
{
public:
 ~Bar() { std::cout << "Bar::~Bar() \n"; }
};

class Baz : public Bar
{
public:
 ~Baz() { std::cout << "Baz::~Baz() \n"; }
};

int main()
{
 std::cout << 1 << '\n';
 {
  Foo* instance = new Baz;
  delete instance;
 }

 std::cout << 2 << '\n';
 {
  std::shared_ptr<Foo> instance(new Baz);
 }

 std::cout << 3 << '\n';
 {
  std::shared_ptr<Foo> instance(false ? new Bar : new Baz);
 }

 std::cout << 4 << '\n';
 {
  boost::scoped_ptr<Foo> instance(new Baz);
 }

 std::cout << 5 << '\n';
 {
  std::unique_ptr<Foo> instance(new Baz);
 }

 std::cout << 6 << '\n';
 {
  std::auto_ptr<Foo> instance(new Baz);
 }
}

A: Первый случай уже обсуждался ранее – здесь UB в чистом виде (как правило, это приводит к тому, что не будет вызван деструктор производного класса).

Второй случай выдаст на экран следующее:

Baz::~Baz()

Bar::~Bar()

Foo::~Foo()

Почему? Что произошло? Ведь мы же ясно видим, что деструкторы у данных классов не являются виртуальными. Или это один из частных случаев UB? На самом деле, тут всё вполне законно и должно работать так, как указано выше. Посмотрим в документацию к std::shared_ptr и boost::shared_ptr:

http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

Proper delete expression corresponding to the supplied type is always selected, this is the reason why the constructors are implemented as templates using a separate parameter Y.

http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/shared_ptr.htm

This constructor has been changed to a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete with its original type, even when T does not have a virtual destructor, or is void.

Третий случай выдаст:

Bar::~Bar() Foo::~Foo()

Почему? Ведь мы только что обсуждали поведение std::shared_ptr! Что тут не так? Вспомните поведение тернарного оператора в C++ — он требует, чтобы второй и третий его операнды были одинакового типа. Более того, каст от базового к производному касту без лишних действий не выполнить, в отличие от обратной ситуации:

#include <iostream>

class Base
{
};

class Derived : public Base
{
};

int main()
{
 Base* first;
 Derived* second;

 Base* foo = second; // Ok
 Derived* bar = first; // Error: invalid conversion from 'Base*' to 'Derived*'
}

Наткнуться на данный момент, связанный с тернарным оператором, можно также и в подобном случае:

#include <iostream>
#include <typeinfo>

template <typename T, typename U>
auto foo(bool b, T t, U u)-> decltype(b ? t : u)
{
 return b ? t : u;
}

int main()
{
 auto _1 = foo(true, 0, 'c');
 std::cout << typeid(_1).name() << '\n';
 auto _2 = foo(false, 0, 'c');
 std::cout << typeid(_2).name() << '\n';
}

Переменные _1 и _2 будут одного и того же типа – int.

Именно поэтому Baz в данном случае будет приведён к Bar.

4, 5 и 6 случаи ничем не отличаются от первого – здесь UB. Надо помнить, что поведение std::shared_ptr отличается от остальных умных указателей.

43. Зачем может понадобиться писать так

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

вместо

#define DO_JOIN(FOO, BAR) FOO##BAR

A: Потому что препроцессор отработает конкатенацию не так, как того ожидал программист, в том случае, если в качестве аргумента(-ов) мы передадим в макрос DO_JOIN другой макрос:

#include <iostream>

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

Output:

15

#include <iostream>

#define DO_JOIN(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

error: unable to find numeric literal operator 'operator"" MY_MACRO'

Получается, макрос MY_MACRO не успел раскрыться, в результате чего была попытка провести конкатенацию с 1 и MY_MACRO, что, разумеется, привело к ошибке.

ISO/IEC 14882:2011

16.3.1 Argument substitution [cpp.subst]

1 After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded. Before being substituted, each argument’s preprocessing tokens are completely macro replaced as if they formed the rest of the preprocessing file; no other preprocessing tokens are available.

44. Что попадёт в stdout в результате выполнения след. кода?

#include <iostream>
#include <stdexcept>

struct Foo
{
 Foo() { std::cout << "Foo::Foo()" << std::endl; }
 ~Foo () { std::cout << "Foo::~Foo()" << std::endl; }
};

void foo()
{
 Foo bar;
 throw std::runtime_error("Error");
}

int main ()
{
 foo();
}

A: Зависит от реализации.

// 1

Foo::Foo()

// 2

Foo::Foo() Foo::~Foo()

ISO/IEC 14882:2011

15.3 Handling an exception [except.handle]

9 If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).

Например, в документации к gcc сказано, что раскрутки стека не произойдёт:

The stack is not unwound before std::terminate is called.

Сборник выкладывается на бесплатной основе, желающим помочь каким угодно образом буду безумно признателен и благодарен. По любым вопросам, рекомендациям и пожеланиям Вы можете обращаться на мой электронный ящик nikita.trophimov@gmail.com. Буду рад услышать абсолютно любое мнение по данному поводу.

В книге ещё много чего можно и даже нужно дорабатывать. Обещаю, что если сообщество проявит хоть какой-то интерес к данному проекту, я продолжу развивать его согласно Вашим предпочтениям и пожеланиям, дополнять новыми задачками и исправлять ошибки. У меня есть много мыслей по поводу улучшения «C and C++ Dark Corners» — среди них добавление тематических разделов, workaround'ы для различных компиляторов и т.д. Главное, чтобы этот интерес был не только с моей стороны.

Жду Ваших положительных и отрицательных отзывов, рекомендаций и, конечно, новых задачек.

Внимательно ознакомьтесь с тем, что указано во «введении», и приятного чтения!

 ,

NikitaTrophimov
()

Как запилить такой экшон? (шорткаты для Git на numpad'е клавиатуры / хардварные кнопки для Git)

Форум — General

Простите, если вам пришло уведомление по причине вашей подписки на тег «Git». Возможно кто-то из пользователей сабжа уже реализовал то, о чем я интересуюсь, и поэтому я влепил этот тег.

Как известно, на многих ноутбуках и клавиатурах есть нампад (numpad или keypad?) - совершенно бесполезный массив кнопок.

Я хочу сделать из него пульт управления VCS, конкретно, например для Git. Рассмотрим на простом примере:

Нажатие на кнопку [2] (она же KP_Down) делает следующее:

git clone --depth 1 <вставка из буфера обмена> <CR>
т.е., будучи в терминале, нажав 2 - у меня автоматически вводится «git clone», вставляется адрес из буфера обмена и нажимается Enter (<CR>). Готово.

Если хочу не в текущую диру, то ввожу сначала путь, а в экшон просто добавляется C-a (Home). В общем неважно, надеюсь суть ясна? Кнопок как минимум 9, а с модификаторами вообще можно будет забыть о вводе каких либо управляющих команд. Кнопка 2/8 с стрелочками вниз/вверх мнемонически удобно для clone/push, например.

Вопрос: как такое реализовать? (проблема конкретно забиндить на одно нажатие кнопки: управляющая команда + вставка из буфера обмена + <CR>)

xcape? xdotool? или можно по хардкору как?

 , , ,

science
()

посоветуйте нищебродский vps/vds

Форум — Talks

наверно о бесплатности о речи быть не может, но да ладно. может, за 100р/месяц что-нибудь посоветуете, или меньше?..

до этого хостился на локалхосте: jabberd2 (один аккаунт для себя), nginx, php-fpm (эксперементирую с веб 2.0 технологиями, висит висел бложик куда собираюсь писать раз в месяц, играюсь с кэшированием - выжимаю максимум производительности из имеющихся ресурсов), еще собираюсь установить smtp сервер, чтобы «запустить раз в день, получить одно письмо и выключить».
такие были планы, но вчера провайдер забрал внешний айпи, лишив радостей администрирования локалхоста :(

ресурсы не важны, ОС не важна, хочется лишь более-менее стабильного аптайма и чтобы можно было собрать свой nginx (php-fpm, sqlite3), jabberd2.

 ,

Spoofing
()

Альтернативы сервисам Гугла.

Форум — Talks

Как-то меня не очень радует последнее время Гугл с его «зачистками», закрытиями «непрофильных сервисов» и прочими прелестями корпоративной политики. Собственно, я предлагаю в этом треде собрать ссылки на альтернативы сервисам гугла. В частности, интересуют почтовые сервисы, xmpp-серверы и прочие полезные вещи.

 ,

Psykukumber
()

Работа с последовательностями в разных языках

Форум — Development

Навеяно темой Ментальный вирус, пример взят и дополнен оттуда. Интересует реализация подобной операции на других языках. Лично я хотел бы увидеть на Lisp, Java, Smalltalk, Erlang.

array = ["John", "James", "Jakob", "Peter", "Janette", "Tom", "Vasya", "Jean", "Juilia", "Heather"]

puts array.select{|v|v[/^J[a-z]+/]}. # ВЫБРАТЬ ПО someregexp
each_slice(3). # КАЖДЫЙ КУСОК ПО 3 ЭЛЕМЕНТА
map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}. # ПОДСТАВИТЬ ЗНАЧЕНИЯ В СТРОКУ
join("\n") # ОБЪЕДИНИТЬ
# John and James follow Jakob
# Janette and Jean follow Juilia

Пошагово для тех, кто не знаком с Ruby:

array.select{|v|v[/^J[a-z]+/]}
# ["John", "James", "Jakob", "Janette", "Jean", "Juilia"]
array.select{|v|v[/^J[a-z]+/]}.
each_slice(3).to_a # в массив
# [["John", "James", "Jakob"], ["Janette", "Jean", "Juilia"]]
array.select{|v|v[/^J[a-z]+/]}.each_slice(3).
map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}
# ["John and James follow Jakob", "Janette and Jean follow Juilia"]
array.select{|v|v[/^J[a-z]+/]}.each_slice(3).map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}.
join("\n") 
# "John and James follow Jakob\nJanette and Jean follow Juilia"

Использовать только стандартную библиотеку.

Целесообразность операции не важна. Вопрос кратности количества найденных элементов трем не рассматриваем.

 , , , ,

dr_jumba
()

Бабушкин strikes back

Форум — Talks

Студент АлтГТУ Алексей Бабушкин, который стал объектом обсуждений на многих интернет-форумах из-за созданного им антивируса, дал altapress.ru свои комментарии по поводу сложившейся ситуации.

Для Ъ

Если честно, это напоминает спланированную акцию. Я не отрицаю, что могу ошибаться, но факты говорят за себя. После того, как меня показали в сюжете по второму каналу сначала какие-то школьники подняли шум на интернет-форумах по этому поводу, потом появилась статья, в которой утверждается, что моя программа разобрана и вся построена на bat-скриптах. Однако, bat-скрипты даже разбирать не надо. Они как страница html - кто угодно может прочитать. Не разобравшись, люди начали обвинять меня в том, что антивирус не работает.

Потом в мою разработку начинают вставлять какие-то программы, которых там не было, меняют им авторские права и обвиняют меня в краже кода, однако на самом деле в комплект поставки никаких программ с изменёнными авторскими правами не включается. Потом находится какой-то сайт (или создаётся специально), и начинаются утверждения, будто все иконки и логотипы я своровал с сайта, однако - это опять не так, все исходники есть у меня и рисовал я всё сам.

Затем мне приходит почти 2,5 тыс. личных сообщений и все они либо идентичные, либо однотипные. Мне звонят по телефону, на электронную почту приходят просьбы о том, чтобы я признал, что мой антивирус таковым не является и вообще не работает. Кто-то пишет, что меня нужно привлечь к ответственности, хотя на самом деле не за что. От моего имени создают фейковую страницу в одной из социальных сетей начинают писать откровенную чушь, подставляя меня. А некоторые даже заказывают покупки в интернет-магазинах от моего имени! Письма с оскорблениями и угрозами приходят на почту и моему отцу. Отец помог мне только придумать название «Иммунитет» - на этом его помощь заканчивается. Все остальное было достигнуто собственными силами. Кстати, на тот момент отец ещё не был проректором.

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

В СМИ изначально информация была преподнесена некорректно. Например, о флэшке-маркере, я вообще не хотел рассказывать, как и о тестировании Windows 8, это была инициатива журналистов. Также я не продавал лицензии на «Иммунитет», я его только устанавливал и брал деньги именно за эту работу. А грант 400 тыс. рублей по программе «У.М.Н.И.К.» я получил на дальнейшее развитие проекта. Я никогда не делал громких заявлений о том, что мой антивирус во многом превосходит «старших братьев». Все его пользователи довольны и продолжают им пользоваться. Я согласен с тем, что над ним предстоит еще много работать, но уже сейчас для самых обычных пользователей он подходит, гарантируя им защиту от большого количества вредоносных объектов.

Для !Ъ: http://altapress.ru/story/103084
За ссылку спасибо Krok

 , , , иммунитет

Deleted
()

Антивирус «Иммунитет»

Форум — Talks

 , ,

flareguner
()