То, что в Linux на bash можно много сделать, это факт. Но вот тут приводится решение однострочного калькулятора на bash, работоспособное, изящное и красивое. https://habrahabr.ru/post/316106/
Был впечатлен. Проверил - работает :)
То, что в Linux на bash можно много сделать, это факт. Но вот тут приводится решение однострочного калькулятора на bash, работоспособное, изящное и красивое. https://habrahabr.ru/post/316106/
Был впечатлен. Проверил - работает :)
Не могу не прокомментировать новость про выход MS SQL Server for Linux (https://www.microsoft.com/ru-ru/server-cloud/sql-server-on-linux.aspx). Так, по порядку.
Оффтоп. Я в порядке хобби достаточно много занимаюсь Linux для десктопов, и могу сказать, что за последние 10 лет он кардинально "развернулся лицом" как минимум к простому пользователю. А возможности этой ОС во многом не уступают, а во многом и превосходят возможности Windows.
В прошлом посту я жаловался на то, что у Runtu 14.4.1 у меня были проблемы с экраном. Там же я писал про костыльное решение. Костыльное - потому что после перезагрузки требуется повторить операцию. В общем, подумав, и порывшись в Сети, было найдено работающее решение:
alexander@alexander-desktop:~$ sudo nano /etc/lightdm/lightdm.conf [SeatDefaults] user-session=openbox greeter-session=lightdm-gtk-greeter greeter-setup-script=/etc/lightdm/xr.sh alexander@alexander-desktop:~$ sudo nano /etc/lightdm/xr.sh #!/bin/sh xrandr --output LVDS1 --off
Смысл в том, что создаем скрипт xr.sh, в котором вызываем xrandr, которым отклюычаем обнаруженное ядром устройство вывода (которого у меня нет). Кладем скрипт в папку с которой заираются скрипты конфига LightDM (опционально).
Для определения того, что именно надо вписать, запускаем xrandr без параметров, и внимательно изучаем вывод.
В скрипт конфига lightDM добавляем строку автозапуска этого скрипта... Всё.
В связи с приездом ко мне дешевого китайского SSD (и необходимости перестановки системы на неттопе) в очереной раз здумался о "легком Linux", ибо - Atom D410 и 2Gb ОЗУ. До того там трудилась LXDE, показывая неплохие результаты... Но хотелось-то больше, то есть - меньше. Более легкий вариант. Но при этом - чтобы работало не хуже, ну и среда была более-менее привычная. Я-то и с awesome неплохо себя ощущаю, а вот дети её вряд ли поймут. В общем, эсперимента ради - поставил (да так и оставил) Runtu 14.04.1 (http://www.runtu.org).
Почему именно её? Во-первых и в-основном, потому что она на базе ubuntu - привычного мне дистрибутива. Во-вторых, она на базе хорошо знакомого мне openbox. То есть - легкая по определению.
Ну, а дальше были приятные сюрпризы.
Во-первых, там не "чистый openbox + панель", а вполне себе допиленный. Провайдером рабочего стола выступает nemo (файловый менеджер, разработанный для Cinnamon ). Почему не pcmanfm - наверное, потому что nemo "легче" по каким-то параметрам. А с учетом того, что там еще и lxpanel - то работать достаточно комфортно.
Во-вторых, Runtu красив. Вроде бы ерунда - но вот на общем впечатлении очень сказывается. У меня, повторюсь, версия light - она идет отдельной веткой, выпускается после основной. Но доводится до ума, как мне кажется - не менее тщательно.
В-третьих, Runtu построен с очень тщательным подбором ПО в составе. Нет офиса, это да. А все остальное, нужное для быстрого старта - присутствует. Что касается самой идеи построения рабочего окружения, что я примерно в том же ключе (писал об этом тут и тут) предлагал построить легкое решение - только в качестве панели рассматривал tint2. Но для меня это было скорее умозрительно "так можно", а тут же - готовое работающее решение!
Из софта, что идет в комплекте:
- нет офиса
- fsWallpaper для управления обоями
- lx-terminal
- Traeda (Gaeny) в качестве среды разработки и одновременно продвинутого блокнота. (Пожалуй, самое спорное с моей точки зрения решение - я бы запилил leafpad).
- VLC в качесте видеоплеера
- DeaDBeef в качестве аудиоплеера
- mtPaint - графический редактор
- GPicView - просмотрщик изображений
- Firefox - браузер. Тут тоже... есть желание поэксперементировтаь - больно уж огнелис до памяти прожорлив.
- Transmission и uGet (torrent и download manager)
- gcalculator - гномовский калькулятор
- nemo, mc и sunflower в качестве файловых менеджеров (sunflower - простой двухпанельный графический файловый менеджер. Простой и легкий, как следствие - не перегруженный разными функциями).
- Менеджер архивов Gnome
- GParted
- Synaptic
- Обновление системы (на базе Synaptic)
- GDebi (Установка пакетов)
В общем, я доставил только OpenOffice (ну не могу я без него), Скайп и nano (привык я к этому редактору).
Но что меня поразило - после установки free -m показал, что система около 350 Мб памяти после старта системы кушает!!! Для сравнения, linux mint 17 xfce после старта кушает порядка 900Мб. (Из чего я делаю вывод, что авторы Runtu поотключали "все ненужное" - и правильно сделали).
Да, флеш в браузере работает, звук при проигрывании mp3 есть, видео тянет нормально.
Кстати, система занимает на диске 2 Gb после установки и обновлений.
Про обновления. Сразу после установки есть смысл сделать sudo apt-get updade - чтобы получить последние сведения о пакетах. Затем - sudo apt-get dist-upgrade, чтобы получить свежие версии пакетов. Кстати, заодно разоброался, чем отличается sudo apt-get upgrade от sudo apt-get dist-upgrade. Простой upgrade - просто "тупо" поднимет версии всех возможных пакетов, а dist-upgrade - поднимет версии и проанализирует зависимости, и разрешит их (доставит нужное, удалит неиспользуемое). Это я man apt-get начитался :)
И последнее. Ложка дегтя - в том, что есть косяк с экраном. Он заключается в том, что не все приложения распахиваются на весь экран, некоторые - только в строго отведенную область. Более того, экран логина (lightDM) тоже оказался вписанным в 2/3 монитора. Костылей два: либо в автозапуск прописать xrandr --size 1280x1024, либо вручную: Меню - Настройки - Параметры дисплея - Отключить галку DVI-monitor, только VGA. Но сие будем решать отдельно, потому что оба решения - костыли. Да и на lightDM они не распространяются.
Очень хочется пожелать авторам Runtu дальнейшего развития системы, сил и вдохновения... ну а мы будем ждать Runtu 16.04 Lite (сейчас есть только Runtu 16.04 XFCE).
Тут на днях решил запилить на сайт новую версию MaxSiteCMS (http://www.max-3000.com) - использовал автоустановщик... Все прошло отлично, только при запуске вывалилось, что "The Encrypt library requires the Mcrypt extension.". Хм три раза, потому что php-mcrypt у меня уже стоял (вывод sudo apt-get install php5-mcrypt
тому доказательство). На всякий случай переинсталлировал это расширение:
apt-get --reinstall install php5-mcrypt
Затем перезапустил апач (sudo service apache2 restart). Ага три раза. Не работает. Ок, смотрим php.ini и связанные файлы. Для этого делаем файл info.php со следующим содержимым:
<?php phpinfo(); ?>
Изучаем вывод. Видим, что есть ряд прогруженных файлов .ini, исследуем их. И выясняем, что не в одном из них не подключается mcrypt.so
Ну, ок, вписываем в /etc/php5/apache2/php.ini строку
extension=mcrypt.so
Перезапускаем апач. И вуаля, всё работает!
ПС. Не стал бы писать о такой мелочи, но вот для памяти...
Расскажу про свой небольшой опыт подключения сканера на Linux-систему на базе Ubuntu (Linux Mint).
Для начала - немного теории. В Linux за сканирование отвечает sane - опенсорсная подсистема, "умеющая" работать со сканером.
Итак, для того, чтобы подключить сканер к Linux, необходимо:
Как пишут в наборах радиоэлектроникик: "равильное собранное устройство в настройке не нуждается". Так вот, правильно подобранная пара sane - сканер в настройке не нуждается. Все не просто, а... очень просто.
Ну и оффтопик: я купил HP ScanJet 3500c. Он был помечен как "Good" - и, в общем, со своей основной функцией - сканировать - справляется на отлично. Медленно правда, особенно на 1200dpi, зато CCD датчик ... в общем, доволен я :)
В общем, я посмотрел на DWM, мне стало печально (ну не дело "настраивать" любое ПО через правки исходных кодов... не дело), стал смотреть в сторону альтернатив. Нашел awesome. Это вроде как тот же DWM, только более гибкий и настраиваемый. Правда, не без странностей: конфиги его написаны на малораспространенном языке программирования lua. Зато - их великое множество. Хорошая документация, и (о чудо после dwm'a) - для конфигурирования не надо лезть в исходный код и перекомпилировать приложение!
Ну, что же... проверим.
Ставим awesone:
alexander@alexander-VPCP11S1R:~$ sudo apt-get intall awesome awesome-extra
Далее - делаем автозуск. По умолчанию, его как бы нет, но лечится довольно легко.
Создаем папку настроек:
alexander@alexander-VPCP11S1R:~$ mkdir ~/.config/awesome alexander@alexander-VPCP11S1R:~$ ls ~/.config/ | grep awesome awesome
Копируем в нее файл автостарта openbox (он уже есть - чего по новой-то городить?)
alexander@alexander-VPCP11S1R:~$ cp ~/.config/openbox/autostart ~/.config/awesome/autostart
Смотрим, что в нем:
alexander@alexander-VPCP11S1R:~$ cat ~/.config/awesome/autostart /home/alexander/My-Scripts/xrandr.sh if which tint2 >/dev/null 2>&1; then (sleep 1 && xcompmgr) & (sleep 2 && tint2) & (sleep 5 && xxkb) & (sleep 5 && volumeicon ) & fi pcmanfm --desktop & (sleep 2 && setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle") &
Малость редактируем:
alexander@alexander-VPCP11S1R:~$ gedit ~/.config/awesome/autostart
Привоим к виду:
/home/alexander/My-Scripts/xrandr.sh xxkb setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle" volumeicon
Смотрим, что у нас в xrandr.sh (это только для sony vaio):
alexander@alexander-VPCP11S1R:~$ cat ~/My-Scripts/xrandr.sh #!/bin/bash xrandr --newmode "1280x600_60.00" 61.00 1280 1328 1456 1632 600 603 613 624 -hsync +vsync xrandr --newmode "1600x768_60.00" 100.25 1600 1688 1848 2096 768 771 781 798 -hsync +vsync xrandr --addmode LVDS-0 1280x600_60.00 xrandr --addmode LVDS-0 1600x768_60.00 xrandr --output LVDS-0 --mode 1280x600_60.00
Во всех руководствах по awesome пишут, что работать надо с локальным конфигом, так что делаем его:
alexander@alexander-VPCP11S1R:~$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua
Теперь можно приступать непосрественно к автостарту
В начало rc.lua вписываем:
------------------------------------------------------------------------------- -- Формируем список автозапуска ------------------------------------------------------------------------------- local autostart_list = {} -- Открываем файл списка для чтения local f = io.open("/home/alexander/.config/awesome/autostart", "r") -- Число прочитанных команд local num_cmd = 0 -- Читаем команды в список и считаем их for line in f:lines() do autostart_list[num_cmd] = line num_cmd = num_cmd + 1 end ------------------------------------------------------------------------------- -- Конец списка автозапуска -------------------------------------------------------------------------------
И в конец rc.lua
------------------------------------------------------------------------------ -- Автозапуск (этот код ставим в конце rc.lua) ------------------------------------------------------------------------------ -- Перебираем список автозапуска и стратуем всё с паузой в три секунды for i = 0, num_cmd - 1 do awful.util.spawn_with_shell(autostart_list[i] .. " && sleep 3") end ------------------------------------------------------------------------------ -- Конец: Автозапуск (этот код ставим в конце rc.lua) ------------------------------------------------------------------------------
(решение отсюда: http://archlinux.org.ru/forum/topic/11748/?page=4)
Вообще много способов описано тут: https://awesome.naquadah.org/wiki/Autostart/ru - я взял самый удобный мне, чтобы все приложения автозапуска были бы в отдельном файле.
Раз уж мы работаем с rc.lua, то заодно и обои поправим.
Копируем к себе файл темы:
alexander@alexander-VPCP11S1R:~$ cp /usr/share/awesome/themes/default/theme.lua ~/.config/awesome/theme.lua
Открываем его
Ищем строку
theme.wallpaper_cmd = { "awsetbg /usr/share/awesome/themes/default/background.png" }
Закомментируем ее:
--theme.wallpaper_cmd = { "awsetbg /usr/share/awesome/themes/default/background.png" }
И вместо нее пишем:
theme.wallpaper_cmd = { "awsetbg /home/alexander/Изображения/Wallpapers/1372644-wp-1253020795739.jpg" }
Затем в rc.lua нахоим и меняем строчку темы:
beautiful.init("/usr/share/awesome/themes/default/theme.lua")
на
beautiful.init("/home/alexander/.config/awesome/theme.lua")
Еще немного украшательств: календарь при наведении на часы
В ~/.config/awesome кладем calendar2.lua со следующим содержанием:
-- original code made by Bzed and published on <a href="http://awesome.naquadah.org/wiki/Calendar_widget" target="_blank" >http://awesome.naquadah.org/wiki/Calendar_widget</a> -- modified by Marc Dequ?nes (Duck) <Duck@DuckCorp.org> (2009-12-29), under the same licence, -- and with the following changes: -- + transformed to module -- + the current day formating is customizable local string = string --local print = print local tostring = tostring local os = os local capi = { mouse = mouse, screen = screen } local awful = require("awful") local naughty = require("naughty") module("calendar2") local calendar = {} local current_day_format = "<u>%s</u>" function displayMonth(month,year,weekStart) local t,wkSt=os.time{year=year, month=month+1, day=0},weekStart or 1 local d=os.date("*t",t) local mthDays,stDay=d.day,(d.wday-d.day-wkSt+1)%7 --print(mthDays .."\n" .. stDay) local lines = " " --интервал перед днями неделями os.setlocale("ru_RU.utf8") for x=0,6 do lines = lines .. os.date("%a ",os.time{year=2006,month=1,day=x+wkSt}) end lines = lines .. "\n"-- .. os.date(" %V",os.time{year=year,month=month,day=1}) --Убираем номер недели local writeLine = 1 while writeLine < (stDay + 1) do lines = lines .. " " --интервал перед первым числом, если оно не в начале недели writeLine = writeLine + 1 end for d=1,mthDays do local x = d local t = os.time{year=year,month=month,day=d} if writeLine == 8 then writeLine = 1 lines = lines .. "\n"-- .. os.date(" %V",t) --убираем номер недели end if os.date("%Y-%m-%d") == os.date("%Y-%m-%d", t) then x = string.format(current_day_format, d) end if (#(tostring(d)) == 1) then x = " " .. x --выравнивание между одно и двухзначными цифрами end lines = lines .. " " .. x --интервал между числами writeLine = writeLine + 1 end local header = os.date("%B %Y\n",os.time{year=year,month=month,day=1}) header = " " .. header --выравниваем месяц и год по центру return header .. "\n" .. lines end function switchNaughtyMonth(switchMonths) if (#calendar < 3) then return end local swMonths = switchMonths or 1 calendar[1] = calendar[1] + swMonths calendar[3].box.widgets[2].text = string.format('<span font_desc="%s">%s</span>', "monospace", displayMonth(calendar[1], calendar[2], 2)) end function switchNaughtyGoToToday() if (#calendar < 3) then return end local swMonths = switchMonths or 1 calendar[1] = os.date("*t").month calendar[2] = os.date("*t").year switchNaughtyMonth(0) end function addCalendarToWidget(mywidget, custom_current_day_format) if custom_current_day_format then current_day_format = custom_current_day_format end mywidget:add_signal('mouse::enter', function () local month, year = os.date('%m'), os.date('%Y') calendar = { month, year, naughty.notify({ text = string.format('<span font_desc="%s">%s</span>', "monospace", displayMonth(month, year, 2)), timeout = 0, hover_timeout = 0.5, screen = capi.mouse.screen }) } end) mywidget:add_signal('mouse::leave', function () naughty.destroy(calendar[3]) end) mywidget:buttons(awful.util.table.join( awful.button({ }, 1, function() switchNaughtyMonth(-1) end), awful.button({ }, 2, switchNaughtyGoToToday), awful.button({ }, 3, function() switchNaughtyMonth(1) end), awful.button({ }, 4, function() switchNaughtyMonth(-1) end), awful.button({ }, 5, function() switchNaughtyMonth(1) end), awful.button({ 'Shift' }, 1, function() switchNaughtyMonth(-12) end), awful.button({ 'Shift' }, 3, function() switchNaughtyMonth(12) end), awful.button({ 'Shift' }, 4, function() switchNaughtyMonth(-12) end), awful.button({ 'Shift' }, 5, function() switchNaughtyMonth(12) end) )) end
Далее, в верх rc.lua добавляем
require("calendar2")
И после строки
mytextclock = awful.widget.textclock({ align = "right" })
вставялем
calendar2.addCalendarToWidget(mytextclock, "<span color='green'>%s</span>")
проверяем, всё работает!
Проблема: некоторые процессы запускаются по несколько раз.
Нашел функцию (http://www.linux.org.ru/forum/general/8424382)
-- {{{ Autoruns function run_once(prg) if not prg then do return nil end end awful.util.spawn_with_shell('ps ux | grep -v grep | grep -F ' .. prg .. ' || ' .. prg .. ' &') end
Еще одна очень интересная возможность awesome - теги.
Во-первых, их можно переименовать "под себя". Достаточно найти tags { names - и там исправить имена тегов.
Например:
tags[s] = awful.tag({ "Main", "WWW", "IM", "Ed", "CMD", 6, 7, 8, 9 }, s, layouts[1])
Во-вторых, можно запускать приложения в тегах, для этого надо внести корректировки в секцию awful.rules.rules.
Например, чтобы firefox запускался во втором теге, надо написать:
{ rule = { class = "Firefox" }, properties = {tag = tags[1][2]}},
Как идея: если совместить эту особенность с автозагрузкой, то можно сразу после загрузки получить готовую к употреблению рабочую среду.
теперь очень важная на sony vaio функция: переключение разрешения. Для этого ищем globalkeys, и вносим туда:
awful.key({}, "#146", function () awful.util.spawn("~/My-Scripts/xrandr-change.sh") end)
проверяем. Работает!
Продолжение видимо следует...)))