Нашёл для себя идеальный вариант дока - не показывать ничего кроме запущенных программ (и запускать их через Namely). И пару папок с документами (ебуками) ибо для быстрого открытия документов индексаторы типа Spotlight ещё не годятся совсем (о, где же ты, krunner). Хотя, казалось бы, какого чёрта, на кой в системе тогда есть locate?
UPD: нашёл такую штуку как Butler. Как минимум fuzzy-find и запуск документов (да и вообще всего) он умеет, что уже покрывает мои потребности, а там столько всего...
21 ноября 2009
Док
на 13:22 3 коммент.
16 ноября 2009
Preview, Opera, whatever and Dictionary.app
Недавно возмущался тем, что в самых нужных местах не работает поиск выделенного текста по хоткею с помощью стандартного Dictionary.app. Не работало это в частности в Preview (так и хочется опять пнуть Эппл, оба приложени их) и в Opera (тут стоит пнуть саму Оперу - интеграция с макосью у них так себе, более того, в контекстном меню пункт "Поискать в словаре" загружает словари Яндекса, нужны они сто лет с таким latency).
А сегодня внезапно нашёл решение, оно как всегда в стиле Эппл - то есть несколько сбоку (читай через задницу). В меню каждого приложения есть пункт Services -> Look Up in Dictionary, этим и воспользуемся, дальше понятно без слов:
на 16:02 0 коммент.
13 ноября 2009
Гоню на макось.
Давно заметка валяется в черновиках, пора бы уже запостить, а то вдруг на сно-лепарда обновлюсь. Вкратце - тут я буду всяко гнать на макось. Это не значит, что я не вижу в ней ничего хорошего.
- Нет буфера выделения.
- Нельзя потаскать окно мышкой при зажатом Alt'е (ну вот тут коллега пишет костыль для этого)
- Зато на Alt + letter забиндены все возможные Deadletters - чувствуешь себя в mc инвалидом, пока не вспомнишь, что можно юзать Esc
- ФМ ортодоксальных толковых НЕТ. Кроме mc, ну вы поняли
- Нет централизованного пакетного менеджмента, а макпорты и финк - говнище, каждый по-своему. Есть ещё Homebrew, идея мне нравится, но тоже хрень пока - очень молод. В общем ничего лучше портежей ещё я не видел.
- Как следствие культура "всё с собой" для бандлов (думайте про пакеты со всеми зависимостями внутри. тысячи их [зависимостей] !)
- Как следствие культура "всё с собой" для ОС - приготовьтесь работать с почерствевшими версиями языков и библиотек. Хорошо, что я тут root, посносил всё старьё нафиг.
- Мало крутилок. Мало! А те, что есть, по умолчанию выставлены в идиотские положения
- Некоторые скучают по тайловым оконным менеджерам, да и вообще оконный менеджмент тут слабоват.
- Жестокие и беспощадные вариации на тему программ. iTunes на макбуке про (про!) стартует так медленно, что можно уснуть и без колыбельной на ночь
- А держать всё в памяти не позволяет то, что всё дико свопится. На домашнем вообще своп отключен, используется в лучшем случае гигабайт памяти. Тут же менее гигабайта занятым не видел даже после старта.
- Обновления. Приехало обновление - отвалилась нативная версия игры, которая до того работала как часы, не упав ни разу. И никакого вам отката - нефиг. Да даже в винде какие-то там обновления присутствовали в Установке и удалении программ, как бы намекая нам, что их можно удалить (на минутку, в винде икспи, вышедшей в каком году? давно в общем). Ну а недавно вышедший унылый леопард уже давно стал притчей во езицех, утерев нос даже майкрософту с их вистой.
- Каждое рабочее утро начинаем с упражнения "Настрой-ка снова второй монитор".
- Каждый приход домой - с упражнения "найди ручками и подключи нестандартно настроенный вайфай" (в связи с некоторыми событиями это упражнение заменилось другим, см. ниже)
- Накрылся недавно домашний сервер, стал интернет раздавать с макбука. Ежечасное упражнение "воткни обратно непонятно куда девшуюся галочку Раздавать инет". И после этого они ещё выпускают какой-то там макосикс сервер. Отпавший PPPoE вроде научился переподнимать, да и то не всегда.
- Всякие разные спорадические глюки, чего только стоят внезапно отрубившиеся клава и тачпад макбука при работяющих как ни в чём ни бывало внешних мышке и клаве. Всего не вспомнишь.
- Пилить под себя никто не отменял, не факт, что я потратил на это времени меньше, чем потратил бы на свежей генте или там убунте.
Помидоры оставьте при себе, без конструктива не входить.
на 16:47 4 коммент.
JSON, YAML, whatever...schema
Не так давно прикрутил к проекту валидатор схемы JSON документа. По ссылке всякая документация и примеры.
Зачем оно надо?
- Для спецификации. Причём спека может быть написана хоть на YAML, хоть на JSON, хоть на чистом ruby - валидатор схемы создаётся из ruby-объекта. Так что перед тем как пистаь очередной протокол обмена чего-то с чем-то через JSON можно написать его спецификацию на том же JSON'е и избежать разночтений (свежа в памяти фраза коллеги - не, так [по разные стороны протокола] мы работать не будем, просто не будем друг друга слышать и будем писать несовместимых продюсеров и консюмеров).
- Для валидации, как ни странно. До валидатора у меня была хитроумная система проверки с привлечением всех хитрых штук динамического программирования в ruby. Сейчас нет. Защита от дурака, особенно полезная в случае если потом таким образом будет кому-то предоставлено API.
В общем, на мой взгляд, с какой стороны не подойди - исполняемая (не просто где-то записанная, а исполняемая) спецификация - полезная в хозяйстве вещь.
на 16:10 0 коммент.
24 октября 2009
C/C++/Obj-C closures
Не так давно решил таки ознакомиться (никак не мигрировать, боже упаси) на представленный в MacOS X 10.6 GCD, почитал их введение в это дело (ровно одна строчка кода, всё остальное - маркетоидный буллщит), но одна фраза заставила на себя обратить внимание - основной компонент этого GCD - блоки - что-то подозрительно напоминали. И добрался до расшаренной коллегой статьи про реализацию блоков, и понял - ну точно, это ж самые что ни на есть closures, которым скоро 50 лет, их наконец-то добавят и в эти языки... Однако, всё сильнее и сильнее этот лагерь офункционаливается.
Со статьёй крайне рекомендую ознакомиться, а потом по ссылкам в конце. Особенно по первой, там чуть ли не дословно цитируют ruby stdlib и часть парадигм RoR и вообще рубишных фреймворков.
Однако в руби их использование гораздо более синтаксически-слаще...
на 22:22 6 коммент.
12 октября 2009
Cache money warm-up
С недавнего времени использую в своём проекте Cache money. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.
Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).
на 20:30 0 коммент.
27 августа 2009
Using DRb
Сегодня ночью понял, что вслед за книгой the Ruby way дал маху и имел лишний вызов DRb.start_service на клиенте. Если почитать документацию, то в комментариях сэмпл кода выясняется, что это требуется далеко не всегда и уже в доке к классу DRbServer выясняются детали. А ведь пока в сорец не залез - не понял. А это устранило единственный крупный bottleneck в приложении.
Вот и читай после этого полезные книги.
на 10:41 0 коммент.
10 августа 2009
Camping 1.9, Passenger & ruby 1.9
Стремление найти себе на разные места приключений никогда не покидает таких как я, вот и захотелось завести текущий проект под ruby 1.9.1 и перевести под passenger.
Пара слов - по общему моему впечатлению, мир руби не готов ещё использовать 1.9.1. То одно, то другое не работает, приходится хачить уже написанное, вставлять проверки версии языка, что-то вообще не лечится (так, у меня не завёлся монгрел, даже после советов с isitruby19.com)
Начнём с самого ruby. Даже на InfoQ засветился скрипт для установки и переключения разных версий Ruby: ruby_swither.
Однако для моей цели пришлось внести в него поравки в секции для 1.9.1 (OMG, опять на одну маленькую строчку я убил полдня):
gem install camping --source http://gems.judofyr.net
Сам camping придётся поправить, вот патчик:
+++ /Users/phoenix/.ruby_versions/ruby-1.9.1-p129/lib/ruby/gems/1.9.1/gems/camping-1.9.316/lib/camping.rb 2009-08-09 18:07:48.000000000 +0600
@@ -3,12 +3,12 @@
S=IO.read(__FILE__)rescue nil;P="<h1>Cam\ping Problem!</h1><h2>%s</h2>"
U=Rack::Utils;Apps=[];class H<Hash
def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end
-undef id,type;end;module Helpers;def R c,*g
+undef id,type if respond_to? :id;end;module Helpers;def R c,*g
p,h=/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"unless u=c.urls.find{|x|
break x if x.scan(p).size==g.size&&/^#{x}\/?$/=~(x=g.inject(x){|x,a|
x.sub p,U.escape((a[a.class.primary_key]rescue a))})}
h.any?? u+"?"+U.build_query(h[0]):u end;def / p
-p[0]==?/?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls
+p[0]==?/?@root+p : p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls
c=self/c;c=@request.url[/.{8,}?(?=\/)/]+c if c[0]==?/;URI c end
end;module Base;attr_accessor:input,:cookies,:headers,:body,:status,:root
M=proc{|_,o,n|o.merge(n,&M)}
ENV['GEM_HOME'] = '/Users/phoenix/.ruby_versions/ruby-1.9.1-p129/lib/ruby/gems/1.9.1'
require 'rubygems'
require 'camping'
$: << ::File.expand_path(::File.dirname(__FILE__))
require 'bin/app'
App.create if App.respond_to? :create
run App
Удачного полёта!
на 00:23 0 коммент.
07 августа 2009
Делегирование методов контроллеров в Camping
Потребовалось мне недавно написать обёртку ко всем существующим ныне в приложении контроллерам, дабы их можно было вызывать через единую точку входа. Именно обёртку, поскольку всё к чертям переписывать не хотелось принципиально да и старый механизм работы мне бы самому пригодился. После пятнично-вечернего воскуривания сорцов Camping'а я это сделал (<ненависть>сорцы кемпинга - это лютое изнасилование мозга. Пусть этому вроде как и есть оправдание - '4K full of gags pocket framework', но так писать а тем более читать код нельзя</ненависть>). Вот вам примерчик - пусть есть контроллер, который просто возвращает завёрнутые в JSON свои параметры, и есть потребность вызвать его из другого контроллера:
def post(param1, param2)
return "{\"#{param1}\":\"#{param2}\"}"
end
end
controller_post_responce = App.post(:Controller, 'param1', 'param2').body
на 23:57 0 коммент.
02 августа 2009
Шаблон
Сменил шаблон блога на какой-то другой - теперь он резиновый и не уродует так код. Он мне не нравится, но я более-менее подправил цвета, чтобы глаз не резало.
на 23:48 2 коммент.
способы запуска Camping приложений
- традиционным camping app.rb
- напрямую app.rb или ruby app.rb
- через Passenger
- с использованием библиотеки Daemons
Второй требует, чтобы приложение само себя запустило, примерно таким кодом:
App::Models::Base.establish_connection :adapter => 'sqlite3', \
:database => "#{File.expand_path(File.dirname(__FILE__))}/../app.db"
App.create
end
if __FILE__ == $0
require 'mongrel/camping'
server = Mongrel::Camping::start(OPTIONS[:app_host], OPTIONS[:app_port], '/', App)
trap("KILL"){server.stop;exit}
server.acceptor.join
end
Третий способ тоже требует создания AR подключения и запуска приложения. Запуск из-под Passenger обнаруживается по наличию переменной окружения RACK_ENV. Об использовании этой переменной немного ниже. Ну а config.ru выглядит так:
require 'rubygems'
require 'rack'
$: << File.expand_path(File.dirname(__FILE__))
require 'bin/app'
run Rack::Adapter::Camping.new(App)
au BufWritePost * silent !test -f 'tmp/restart.txt' && touch 'tmp/restart.txt'
require 'rubygems'
require 'daemons'
Daemons.run( File.expand_path(File.dirname(__FILE__))+'/app.rb')
Ну и напоследок об окружениях. Идея RAILS_ENV хороша, почему бы и тут не сделать так же.
$logger = ((ENV['RACK_ENV'] || defined? Daemons )? \
# file-based logger for background execution and stdout for the rest
Logger.new("#{File.expand_path(File.dirname(__FILE__))}/../log/app.log", 10, 1024000) : \
Logger.new(STDOUT))
на 22:48 0 коммент.
30 июля 2009
XCode screenshots
Заметка на полях - XCode сохраняет скриншоты с устройств в ~/Library/Application Support/Developer/Shared/Xcode/Screenshots
на 11:22 0 коммент.
17 июля 2009
Colored svn diff
С подачи Тапа делаем svn diff а-ля гит - цветной и в less'е:
2 svn diff | awk '/^\+(.*)$/ { print "\033[32m" $0 "\033[0m"}; /^-(.*)$/ { print "\033[31m" $0 "\033[0m"}; /^[^+-].*$/ {print $0}' | less -r
на 13:39 0 коммент.
14 июля 2009
О моветоне в поведении моего блога
Обратил внимание после того, как мне пришёл комментарий. Внезапно в ленте руникса всплыли все (или многие, не суть) мои записи про линукс. Подозреваю в этом глюк гугла, который недавно заподозрил мой блог в спаме и заблокировал, вероятно происшедшее - результат разблокирования. Хотя в ридере лента этого блога не обновилась (да, я читаю себя и иногда даже нахожу опечатки и отправляюсь править пост), так что это может быть и глюк агрегатора руникса. Делайте выводы.
на 17:45 8 коммент.
Роутинг в Camping, Regexp'ы в Ruby
Если коротко - не следуйте документации в способе задания роутов для контроллеров. Документация советует так:
PS: если кто запамятовал, то %r!regexp! (где вместо ! может быть и другой символ) - это такой способ обрамить регексп, наряду с /regexp/
на 12:41 0 коммент.
12 июля 2009
Github'но-тестировочное
Смотрел я тут скринкаст на тему ObjC, было там немного про тестирование, и понял я - дальше так нельзя - тестировать. Полез в гугль (хотя кхе, туда я за этим давно залезал, руки не доходили применить), тот меня выкинул сначала на одного из коммитеров в Camping с его тестсьюитом 'camping/test', а потом и на mosquito в репозитарии автора того самого скринкаста. Скажу сразу, москит отстал от жизни и не работает, зато в том репозитории нашлось много полезного: ruby-style категории над основными Cocoa классами, скрипты для правильной максимизации окна (очень пригождается с MacVim) и куча пищи для размышлений.
Заодно накидал Rake task для дампа фикстур из используемого кемпингом (и только кемпингом, забудем про Rails, аминь) sqlite:
2
3 require 'rubygems'
4 require 'activerecord'
5
6 desc "Generate fixtures for all tables of current project"
7 task :generate_fixtures do
8 database = "#{ENV['HOME']}/.camping.db"
9 ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => database)
10 project = File.basename(File.expand_path('.')).downcase
11 tables = `sqlite3 #{database} ".tables"`.split(' ').reject{ |t| t.include?("sessions") || t.include?("schema_infos")}.collect{|t| t if t.include? project}
12 tables.each do |table_name|
13 File.open("test/fixtures/#{table_name}.yml", 'w') do |file|
14 data = ActiveRecord::Base.connection.select_all("SELECT * FROM #{table_name}")
15 rows = {}
16
17 data.each do |record|
18 rows["#{table_name}_#{record['id']}"] = record
19 end
20
21 file.write rows.to_yaml
22 end
23 end
24 end
Там много 'длиннострочников', но понять можно. Дампит все таблицы используя в качестве имени проекта имя текущей директории.
Не могу не пнуть попутно юродивый svn - перед тестированием всего и вся разложил сорцы по полочкам, так svn положенный в другое место файл считает новым, в то время как гит даже частично патченный и перемещённый после этого файл понимает и считает именно перемещённым.
Думается, пора покрыть тестами, оформить и выкинуть на гитхаб в виде библиотечки часть одного интересного проекта, но это уже как руки дойдут.
Stay tuned.
на 23:45 0 коммент.
05 июля 2009
ActiveSupport и Logger
NEVER Override Existing Methods.
Never, ever do this. Never override an existing method. Period, full stop, no excuse.
Rails Worst Practices: 13 Coding Nightmares You Should Avoid
Сначала грешил на Camping. А Camping использует ActiveSupport. И вот к чему это приводит.
ActiveSupport весь такой на белом коне приходит и превращает все сообщения стандартного логгера в абсолютно бесполезные puts без какой-либо полезной информации о времени и уровне сообщения. В документации способ отключения этого безобразия либо нерабочий либо нетривиальный - у меня не пошло. Ну так по рукам ему за это!
на 14:22 1 коммент.
04 июля 2009
ActionMailer с Gmail без Rails: Camping
В последнее время пишу прототип внутреннего сервиса на Camping. Попутно должен заметить, что это весьма хорошая штука от чокнутого _why для очень быстрого прототипирования - весь мой фронтэнд лежит в одном файле и занимает 150 строк.
И само собой, без отправки электронной почты не обошлось. А раз уж camping это такие очень маленькие рельсы - почему бы не встать на плечи ещё одного из гигантов мира рельс - ActionMailer. К условиям задачи добавилась и необходимость использования Google Apps for Domains.
Первым делом нужно научить Ruby <= 1.8.7 там авторизоваться:
sudo gem install openrain-action_mailer_tls -s http://gems.github.com
подробнее
и в корне проекта с camping приложением создаём mailer.rb
# for this example the folder structure should be as follow
#
# --+ camping_project_root
# |-- mailer.rb (this file)
# |--+ mailer
# |-- new_account.erb
require 'rubygems'
require 'action_mailer'
require "smtp_tls"
class Mailer < ActionMailer::Base
def new_account(bar)
recipients recipient
from "noreply@company.com"
subject "New account confirmation"
body :foo => bar
end
end
Mailer.template_root = File.dirname(__FILE__)
Mailer.smtp_settings = {
:address => "smtp.gmail.com",
:domain => "company.com",
:port => 587,
:user_name => "noreply@company.com",
:password => "noway",
:authentication => :plain,
:enable_starttls_auto => true
}
И в camping приложении подключаем этот мэйлер.
на 20:33 0 коммент.
20 июня 2009
Использование акселерометра мака для симулятора
Захотелось мне использовать в своём приложении акселерометр, симулятор его не поддерживает, а железяка для тестирования ещё в пути. А тут такая оказия - на ловца и пост с описанием и решением проблемы бежит.
Если очень коротко, то идея состоит в захвате данных с акселерометра мака и посылке этих данных по сети приложению в симуляторе.
Итак, берём Unimotion, собираем, туда же кладём питон скрипт, приведённый в указанном выше посте. Запускаем эту связку:
./motion -f 17 | python sendaccsim.py
Из симулятора акселерометра берём два файла (AccelerometerSimulation.h и AccelerometerSimulation.m) и подключаем хедер там, где используем акселерометр. Запускаем симулятор, крутим наш мак и так и сяк. Со стороны выглядит странно, внимание, использовать только при наличии вменяемых коллег.
на 12:51 0 коммент.
Пара MacOs полезностей
Возможность развернуть окно по хотекею.
Ну что за моветон, показывать в окне лишь часть необходимого для восприятия содержимого, и не иметь в самой keyboard-friendly системе шортката для разворачивания окна? Solved. Читаем пост, пишем скрипт, вешаем на хоткей в QuickSilver.
Возможность запретить показ иконки запущенного приложения в доке.
Я и так знаю, что у меня бегут QuickSilver и Namely, мне не нужны их иконки в доке. И если первый имеет для такого опцию - что с остальным? Dock Dodger в помощь. Читаем дисклеймер, не пугаемся - всё обратимо, отучаем приложения от дурного поведения.
Пока всё, остался открытым вопрос файлового менеджера.
на 00:56 0 коммент.
14 июня 2009
Linux -> MacOs switcher'ство
Я не буду говорить, как хорош или плох мак и линукс, я яростно ненавижу макодрочеров и не понимаю оголтелых линупсоедов (да-да, можете начинать отписываться), скажу в этой заметке лишь о том, чего мне не хватало в маке после линукса.
Вообще, хорошей отправной точкой может послужить SIMBL с его плагинами, из которых я сразу поставил InputSwitcher, дабы в каждом окне была своя раскладка клавиатуры (согласитесь, глупо иметь в терминале русский и в IM, за редким случаем, английский) и Visor - терминал должен быть под рукой всегда, на любом из Spaces, а это и zsh и git и vim и многое другое. В качестве замены gkrellm (не идеальной, не хватает иногда шкал, обновляемых в реальном времени) подойдёт iStatMenus - видно, когда процесс ушёл в бесконечный цикл, пора прибить обожравшийся памяти браузер или невовремя дорвавшийся до тарифицирумого траффика iTunes. Для быстрого запуска приложений в стиле автодополнения коммандной строки и krunner подойдёт namely.
Кроме того, нашёл мак сборки давно знакомых вещей - git, MacVim, zsh, arora, keepassx - это всё-таки такой специальный уличный юникс, много чего родного тут работает.
Чего не хватает до сих пор - толкового двухпанельного файлового менеджера и плеера (iTunes не предлагать, плавали - знаем). Тут я готов прослыть извращенцем и поставить krusader & amarok в маковской сборке.
Такой вот кратенький забег. Для остального либо нашлись очевидные аналоги - либо вопрос пока открыт...
на 00:13 10 коммент.
13 июня 2009
О текущем положении
Итак, уже две недели я работаю в новой компании, основная сфера моей деятельности теперь будет связана с разработкой под маки и в частности под iPhone OS. Как вы понимаете, из этого вытекает несколько вероятных следствий:
- появятся посты с мак и свитчерской тематикой
- появятся посты о разработке в данной области
- посты про Linux не пропадут, но упадёт их частота
- к maemo возможно даже увеличение внимания - я стал чаще таскать свою таблетку
PS: Тап, опять тебе спасибо.
на 15:07 2 коммент.
28 мая 2009
низкий уровень звука в maemo
Продолжая ковырять таблетку.
Как уже неоднократно убеждались владельцы, использовать maemo девайсы в качестве плеера крайне неудобно - они тихие.
А дело в том, что каждый раз при втыкании и вытыкании наушников программым методом снижается уровень pcm канала. Понаблюдать и порулить этим можно из миксера aumix, который водится в том же треде. И как одно из решений - тем же самым аумиксом по крону устанавливать звук на максимум (не бойтесь, не оглохнете - плеера управляют другим каналом):
aumix -w + 100
Это решение универсально и гарантированно выжмет максимум во всех приложениях. Правда, не кардинально, но ощутимо.
Ещё один путь - сорвать к чертям программный микшер, что, например, позволяет делать mplayer:
cat ~/.mplayer/config
softvol=1
softvol-max=300
300% от нормального - уже достаточно для мегаполиса и поездов с идущей в комплекте гарнитурой (даже слегка слишком - появляются шумы, которые слышны даже моему отдавленному взводом медведей уху). Минус - шумы, не все плееры поддерживают вывод через mplayer (kagu умеет).
В принципе, этого достаточно, хотя остаётся ещё несколько путей - replay gain, HAL, крутейшие наушники KOSS - но я уже слегка оглох...
на 12:43 0 коммент.
27 мая 2009
идентификация ОС
Байка: в одном продукте под ОС семейства видовс версия ОС определялась по наличию в корне диска c: папок с именами windows, winnt и т.п., что приводило к странным флуктуациям при наличии нескольких или отсутствию таковых.
Призказка: работал на n810 плеер kagu, да и перестал. И UKMP тоже перестал. А без kagu n810 вообще не плеер, поскольку была в kagu самая главная возможность любого плеера - быстро поставить его на паузу (аппаратной кнопкой на корпусе или на родной гарнитуре).
Сказка: а причина была как в той самой байке - из-за странного способа идентификации ОС: по наличию определённого пути (который я удалил, дабы в автодополнении шелла не мешал). Вот так:
#/usr/bin/MediaCenter.py
if os.name=="posix" and os.path.exists('/media/mmc1'): ISMAEMO=1
Из-за этого устанавливалась неправильная глубина цвета и любое приложение, использовавшее pygame, падало.
Мораль: надо определять ОС другим способом. Хотя бы по ядру:
uname -a
Linux Nokia-N810-23-14 2.6.21-omap1 #2 Wed Jul 16 12:29:11 EEST 2008 armv6l unknown
на 14:34 4 коммент.
12 марта 2009
дисковые буфера и hibernate в Linux
Пока нет ничего серьёзного к опубликованию, вот вам лёгенькая тема.
Заметил давно, что используемый мой метод hibernate в виде ядра с патчами tuxonice и скриптом оттуда же ну слишком уж медленный. Краткое раскидывание мозгами и раскапывание вопроса показало, что достаточно большую долю времени занимает сохранение дисковых буферов, что само по себе весьма экстравагантный финт - сохранять на винт кеш обращений к винту. Решил отключать кеш перед засыпанием и восстанавливать после просыпания:
#/etc/hibernate/common.conf
OnSuspend 10 echo 3 > /proc/sys/vm/drop_caches
OnResume 10 echo 0 > /proc/sys/vm/drop_caches
Время засыпания теперь - "как в лучших домах Лондона и Филадельфии".
на 22:08 4 коммент.
01 марта 2009
Убираем многословность в Kopete
Часто бывает - постишь код, кусок документации или просто цитату в Kopete и лог разговора моментально забивается так, что за деревьями леса не видно. Скальпель!
В папке с темой оформления окна разговора Kopete (я скопировал одну из стандартных, получился такой путь: ~/.kde/share/apps/kopete/styles/PXClear/Contents/Resources) ищем main.css и добавляем
{
height: 40px;
overflow:hidden;
}
.OutgoingMessage:hover, .NextOutgoingMessage:hover
{
height:auto;
}
.IncomingMessage, .NextIncomingMessage
{
height: 40px;
overflow:hidden;
}
.IncomingMessage:hover, .NextIncomingMessage:hover
{
height:auto;
}
посты длиннее двух строчек (с моим размером шрифта) отображаются полностью только при наведении на них мышки.
на 18:20 0 коммент.
28 февраля 2009
О web-based IDE и тонких клиентах вообще
Вся эта шумиха вокруг web-based IDE(bespin, heroku) и тонких клиентах для веб-сервисов вообще (google mail, docs) останется шумихой до тех пор, пока тонкий клиент (ноутбук, MID, телефон etc. + браузер) не будет считаться неработоспособным, если он не в состоянии функционировать в течении всего периода бодрствования человека без подзарядки (скажем 20 часов - в случае более длительного периода без доступа к розетке вам скорее нужно ружьё, нож и палатка) и обеспечить доступ в сеть из любой точки земного шара, включая метро, самолёт, глухую тайгу и дикие горы.
на 01:46 2 коммент.
08 февраля 2009
Improving KDE4.2 taskbar plasmoid
Захотелось мне удобства дополнительного в вышеозначенном плазмоиде, а именно - знакомого по браузерным вкладкам поведения, когда шелчок по заголовку вкладки средней кнопкой закрывает её. Так и тут захотел закрывать окна шелчком колеса на соотв. кнопке таскбара (важно - при этом не затрагиваются окна, бывшие ранее в группе - я не использую группировку). В общем-то, всё просто, хотя пришлось вспомнить великий могучий цпп и поползать по иерархии классов:
2 index aaaabbd..d4adaa4 100644
3 --- a/plasma/applets/tasks/windowtaskitem.cpp
4 +++ b/plasma/applets/tasks/windowtaskitem.cpp
5 @@ -84,6 +84,10 @@ void WindowTaskItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
6 if (isGrouped()) {
7 parentGroup()->collapse();
8 }
9 + else{
10 + m_task->close();
11 + close();
12 + }
13 } else {
14 AbstractTaskItem::mousePressEvent(event);
15 }
В связи с чем вопрос - кому-то интересно такое поведение плазмоида?
на 19:07 3 коммент.
02 февраля 2009
gentoo, kdeprefix useflag, KDE 4.2, Phonon and backends
Ну в общем в курсе все, что 4.2 вышел, он крут и наступило щастье. Так что это пока не обсуждаем.
А вот то, что поломался звук - предмет нашего разговора.
Поломался звук, amarok не играет, а всё потому что phonon не видит свои backend'ы, ибо всё раскидано в разных местах, понеже кто-то на useflag kdeprefix внимание обращает, а кто-то нет и кладёт всё по FHS.
Варианта, как водится, два.
1. Отмержить к чёрту все версии KDE ниже 4.2, отключить kdeprefix, только тогда ставить 4.2. Более правильный на мой взгляд. В воздухе повисшим оставим тот вопрос, что же делать с k3b и прочим антиквариатом.
2. Помочь найти потерянные backends.
ln -s /usr/share/kde4/services/phononbackends/ /usr/kde/4.2/share/kde4/services/phononbackends
Костыль, но быстрый и действенный.
на 05:44 1 коммент.
31 января 2009
Escaping Unicode in Ruby
Ещё одна крупица мудрости и благодати позволит преобразовывать non-ASCII символы в строке в их экранированный Unicode эквивалент вроде \u0444:
2 def escape_unicode
3 unpack('U*').map {|c| c < 0x80 ? c.chr : '\u%04x' % c}.join
4 end
5 end
>> puts "фывыфdd".escape_unicode
\u0444\u044b\u0432\u044b\u0444dd
Работает и в 1.8 и в 1.9.
Воистину, Ruby велик и Hal Fulton его пророк.
По мотивам одного перлового модуля. Короче в 5 раз.
на 09:31 0 коммент.
29 января 2009
Midori, Mer, Nokia Internet Tablets, webkit.
Это именно то, о чём я так долго мечтал и считал единственно приемлемым для NIT - легковесный webkit-based браузер вместо того убожества, которое есть сейчас. Его ещё конечно нужно допиливать, в частности хилдонизировать, но это уже мелочи.
Собственно сама основная новость - выход Mer - не менее важна, читать рукоммендую тут.
на 19:44 0 коммент.
26 января 2009
Дата в maemo
Приложение "Часы" в ITOS, скажем так, несколько странное, и при установке даты заставляет устанавливать не часовой пояс, а город, в списке доступных городов моего города нет, более того, города, по которому назван мой часовой пояс, там тоже нет! Такого бредового подхода я нигде не видел, да везде можно установить свой пояс в Asia/Yekaterinburg! Так что открываем рутову консоль и колдуем стандартное
echo "Asia/Yekaterinburg">/etc/timezone
date 01252055 (см. UPD)
Доступные временные зоны можно поглядеть так: ls -R /usr/share/zoneinfo/, а время записывать в формате ММДДЧЧмм.
Ещё +1 к карме и +5 к кошерности девайса.
UPD: я тут сам был и других ввёл в заблуждение. Оказывается, maemo не сохраняет системное время в аппаратные часы, что приводит к тому, что после перезагрузки время опять возвращается на круги своя. Из используемого в maemo busybox стандартная утилита для синхронизации системного и аппаратного времени hwclock была вырезана. Установить аппаратные часы можно так:
/mnt/initfs/usr/bin/retutime -T 2009-01-25/20:04:36
При этом время нужно указывать UTC (или гринвическое, как удобнее называйте).
на 01:25 6 коммент.
23 января 2009
Таблетка от головы
Вот читаешь этих аналитиков по девайсам - это смех какой-то. Вот вам статья: Таблетка от (для?) счастья, аж с тремя фактическими ошибками, написанная владельцем (!) девайса.
1. микрофон в корпусе есть. Проверено лично разговором в скайпе.
2. DVD-рипы без дополнительного пережимания смотреть не получится даже в mplayer'е, процессора не хватит. Могут быть флуктуации, но в общем случае это так и обсуждено не раз и скрипты для конвертации уже все написали.
3. Звук там нормального уровня, только его, как и подсветку, искуственно занизили, но тут уж и правда, сразу не обнаружишь такую программу как aumix, впрочем, нужная тема на форуме находится на раз в поисковиках. Это, кстати, самое слабое место - при втыкании наушников звук снова приглушается, так что можно считать, что автор почти прав.
Тем не менее, остаётся согласится - в качестве плеера не тянет. Впрочем, это моё временное мнение. Например, в ванной посмотреть фильм - милое дело.
PS а за регистрацию без поддержки OpenID "им надо в раковину нассать".
на 01:17 0 коммент.
11 января 2009
Not Rails
Вот вам кусочек кода Rails разработчика, пример того, что бывает, когда в уме Ruby is Rails:
36 unless logged_in?
37 redirect_to home_path
38 else
39 true
40 end
41 end
Сразу видно, что язык как таковой он не знает. Иначе бы назвал функцию "admin?" Но это так, незнание идиом, мелочи. А вот то, что она будет всегда возвращать true (или поднимать exception) станет сюрпризом, если использовать эту функцию в проверках. А всё потому что возвращать она будет статус редиректа как результат unless.
Поэтому надо всё-таки учить Ruby, или иметь кого-то, знающего его, для code review.
на 15:06 0 коммент.