tag:blogger.com,1999:blog-36228016261699450372024-03-05T02:13:41.359-08:00kmb-tipsполезное по линуксу и os x
собрано все интересное мне лично (методом copy-paste из инета и не пыхтите насчет копирайта я ссылки на источник ставлю)Unknownnoreply@blogger.comBlogger117125tag:blogger.com,1999:blog-3622801626169945037.post-43603623037399302452020-02-13T01:57:00.002-08:002020-02-13T01:57:33.674-08:00Быстрый пакетный менеджер для node -pnpm<div dir="ltr" style="text-align: left;" trbidi="on">
pnpm - новый пакетный менеджер для node в папке node-modules создает только линки</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-27100521947446980602010-05-20T01:51:00.000-07:002020-02-13T01:58:31.361-08:00Ruby on Rails делаем красивые формы ( поле ввода даты)<div dir="ltr" style="text-align: left;" trbidi="on">
Если хочется показывать нормальный контрол для даты а не ущербные три селекта то используем jQuery datepicker<br />
<br />
Как сделать не меняя старого кода <a href="http://kmb.homelinux.net/tags/unobtrusive">http://kmb.homelinux.net/tags/unobtrusive</a><br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-62346298689680346052010-03-29T05:47:00.000-07:002020-02-13T01:59:20.686-08:00rake db:backup<div dir="ltr" style="text-align: left;" trbidi="on">
<blockquote>
#= encoding: utf-8 <br />
namespace :db do desc "Backup the database to a file. Options: DIR=base_dir RAILS_ENV=production MAX=20" <br />
task :backup => [:environment] do<br />
datestamp = Time.now.strftime("%Y-%m-%d_%H-%M-%S") <br />
base_path = ENV["DIR"] || "db" <br />
backup_base = File.join(base_path, 'backup')<br />
backup_folder = File.join(backup_base, datestamp)<br />
backup_file = File.join(backup_folder, "#{RAILS_ENV}_dump.sql.gz") <br />
FileUtils.mkdir_p(backup_folder)<br />
db_config = ActiveRecord::Base.configurations[RAILS_ENV]<br />
pass = ''<br />
pass = '-p' + db_config['password'] if db_config['password']<br />
<br />
sh "mysqldump -u #{db_config['username']} #{pass} #{db_config['database']} -Q --add-drop-table=true --add-locks=FALSE --lock-tables=FALSE | gzip -c > #{backup_file}" <br />
dir = Dir.new(backup_base)<br />
all_backups = dir.entries[2..-1].sort.reverse<br />
puts "Created backup: #{backup_file}" <br />
max_backups = (ENV["MAX"] || 20).to_i<br />
unwanted_backups = all_backups[max_backups..-1] || []<br />
for unwanted_backup in unwanted_backups<br />
FileUtils.rm_rf(File.join(backup_base, unwanted_backup))<br />
puts "deleted #{unwanted_backup}" <br />
end<br />
puts "Deleted #{unwanted_backups.length} backups, #{all_backups.length - unwanted_backups.length} backups available" <br />
end<br />
task :restore => [:environment] do<br />
base_path = ENV["DIR"] || "db" <br />
backup_base = File.join(base_path, 'backup')<br />
dir = Dir.new(backup_base)<br />
all_backups = dir.entries[2..-1].sort.reverse<br />
last_backup_dir = File.join(backup_base,all_backups[0])<br />
last_backup=Dir.new(last_backup_dir).entries[2..-1]<br />
backup= File.join(last_backup_dir,"#{RAILS_ENV}_dump.sql.gz")<br />
if File.exist?( backup)<br />
puts "Restore #{backup}"<br />
db_config = ActiveRecord::Base.configurations[RAILS_ENV]<br />
pass = ''<br />
pass = '-p' + db_config['password'] if db_config['password']<br />
<br />
cmd_str="gunzip < #{backup} | mysql -u #{db_config['username']} #{pass} #{db_config['database']}"<br />
puts cmd_str<br />
else<br />
puts "Backup file <#{backup}> not found"<br />
end<br />
end<br />
end</blockquote>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-28257674171356641842010-03-22T05:40:00.000-07:002010-03-22T05:41:40.900-07:00Autoplay DVD with VLCAutoplay DVD with VLC<br /><br />1) Create a script using Script Editor and paste the following:<br /><br /><blockquote>activate application "VLC"<br />tell application "Finder" to set frontmost of process "VLC" to true<br />tell application "System Events" to click menu item "Open Disc..." of menu of menu bar item "File" of menu bar of process "VLC"<br />tell application "System Events" to tell process "VLC"<br /> keystroke return<br />end tell<br />tell application "VLC"<br /> fullscreen<br /> next<br />end tell<br /></blockquote><br />2) Compile and Save<br />3) Open "System Preferences..." and select "CDs & DVD's".<br />4) Select "Run Script" for "When you insert a video DVD".<br />5) Browse to where you saved your new script, select it and click "Choose".<br /><br />This will automatically play DVD using VLC.<br />If you are using a localized non-English version just replace the "Open Disc..." and "File" accordingly.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-50041846464273081582010-03-20T11:10:00.000-07:002010-03-20T11:13:22.204-07:00GetBundles для TextMateставим для управления всеми Bundle<br /><br /><pre>mkdir -p ~/Library/Application\ Support/TextMate/Bundles<br />cd !$<br />svn co http://svn.textmate.org/trunk/Review/Bundles/GetBundles.tmbundle/<br />osascript -e 'tell app "TextMate" to reload bundles'<br /></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-88976365447657146152010-03-18T03:01:00.000-07:002020-02-13T02:00:52.952-08:00Делаем virtual hosts на Apache OS X Leopard<div dir="ltr" style="text-align: left;" trbidi="on">
У меня работает так.<br />
<div class="commenttext">
<br />
<span style="font-weight: bold;">Шаг 1:</span><br />
Правим файл /etc/apache2/httpd.conf в любом редакторе, удаляем комментарии # в строке:<br />
<br />
<blockquote>
#LoadModule vhost_alias_module libexec/httpd/mod_vhost_alias.so<br />
<br /></blockquote>
и ставим коммент на<br />
<br />
<blockquote>
#LoadModule userdir_module libexec/apache2/mod_userdir.so<br />
#LoadModule alias_module libexec/apache2/mod_alias.so</blockquote>
<br />
<span style="font-weight: bold;">Шаг 2:</span><br />
Ищем строку:<br />
<blockquote>
# Supplemental configuration<br />
<br /></blockquote>
и отключаем<br />
<blockquote>
# Fancy directory listings<br />
#Include /private/etc/apache2/extra/httpd-autoindex.conf<br />
# User home directories<br />
#Include /private/etc/apache2/extra/httpd-userdir.conf<br />
# Local access to the Apache HTTP Server Manual<br />
#Include /private/etc/apache2/extra/httpd-manual.conf<br />
# Virtual hosts<br />
#Include /private/etc/apache2/extra/httpd-vhosts.conf<br />
<br />
<br />
<br />
<br /></blockquote>
<span style="font-weight: bold;">Шаг 3:</span><br />
добавляем строки после второго шага 2:<br />
<br />
<blockquote>
UseCanonicalName Off<br />
VirtualDocumentRoot /Library/WebServer/Documents/%0</blockquote>
так настраиваем перенаправление для виртуальных хостов т.е. http://foo.homelinux.net -> /Library/WebServer/Documents/foo.homelinux.net/ <br />
<br />
<span style="font-weight: bold;">Шаг 4:</span><br />
Сохраняем файл и рестартуем апач (отключаем веб шаринг и включаем его снова).<br />
<br />
<br />
<br />
<br />
Ну и наконец создаем необходимые директории для виртуальных хостов например для<br />
foo.homelinux.net и bar.homelinux.net делаем следующие директории:<br />
<br />
<blockquote>
/Library/WebServer/Documents/foo.homelinux.net<br />
/Library/WebServer/Documents/bar.homelinux.net</blockquote>
<br />
заливаем в них нужные файлы и все работает<br />
если не работает смотрим вывод команды<br />
<blockquote>
apachectl -t</blockquote>
и правим httpd.conf<br />
<br />
<br />
в дополнение я использую www.dyndns.org для своих хостов ( айпишник внешний но динамический)<br />
<br /></div>
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-25562695749421908392010-02-28T01:36:00.000-08:002010-02-28T01:40:06.689-08:00Консольные хитрости<div class="entrybody"> <p>Опытные юниксоиды знают и осознают всю мощь использования командной строки и немного “свысока” посматривают на “мышевозов” :) Но и в консоли есть свои недостатки, которые побеждаются с помощью каких-то приемов. У каждого свой набор, а я хочу поделиться своими наработками-находками-привычками, которые появились за долгие годы использования командной строки. Эдакий небольшой cheat-sheet.<br />Начнем :)</p> <p>1. Копирование файлов с указанием прогресса. Всегда чертовски не хватало информативности в <code>cp</code></p> <blockquote> <pre>rsync --progress file1 file2</pre> </blockquote> <p><span id="more-90"></span></p> <p>2. Преобразование текста в картинку. Использовал для создания простенькой капчи</p> <blockquote> <pre>echo -e "Some Text Line1\nSome Text Line 2" | convert -background none -density 196 -resample 72 -unsharp 0x.5 -font "Courier" text:- -trim +repage -bordercolor white -border 3 text.gif</pre> </blockquote> <p>3. Поиск и замена в текстовых файлах</p> <blockquote> <pre>find . -iname "FILENAME" -exec sed -i 's/SEARCH_STRING/REPLACE_STRING/g' {} \;</pre> </blockquote> <p>4. Метод Столлмана! Отправка веб-странички по почте :)</p> <blockquote> <pre>{ u="http://twitter.com/boombick"; echo "Subject: $u"; echo "Mime-Version: 1.0"; echo -e "Content-Type: text/html; charset=utf-8\n\n"; curl $u ; } | sendmail recipient@example.com</pre> </blockquote> <p>5. Запись iso-файла на диск</p> <blockquote> <pre>cdrecord -v speed=4 driveropts=burnfree dev=/dev/scd0 cd.iso</pre> </blockquote> <p>6. Ограничение канала для scp. В данном случае ограничен 10kbps</p> <blockquote> <pre>scp -l10 boombick@srv02:/home/svnstat/* .</pre> </blockquote> <p>7. Скриншот на удаленной машине :) (С запущенными иксами конечно)</p> <blockquote> <pre>DISPLAY=":0.0" import -window root screenshot.png</pre> </blockquote> <p>8. Качаем и сразу распаковываем :)</p> <blockquote> <pre>wget -qO - http://example.com/path/to/blah.tar.gz | tar xvf -</pre> </blockquote> <p>9. url_encode :) Достаточно примитивно, но часто помогает</p> <blockquote> <pre>echo "$url" | sed 's/%/%25/g;s/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g'</pre> </blockquote> <p>10. Погода в Москве :) Подставьте свой город</p> <blockquote> <pre>curl -s "http://www.google.com/ig/api?weather=Moscow" | sed 's|.*<temp_c data="\([^">.*|\1|'</pre> </blockquote> <p>Пока все, to be continued</p><p>взято <a href="http://boombick.org/blog/posts/90">отсюда</a><br /></p><p><br /></p> </div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-36404460881355558462010-01-21T23:28:00.000-08:002010-01-21T23:30:44.103-08:00Прибил файл место не освобождается<a href="http://www.unixpin.com/wordpress/2010/01/21/removed-file-space/">http://www.unixpin.com/wordpress/2010/01/21/removed-file-space/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-42696013865973688182009-12-24T10:45:00.000-08:002010-01-04T13:14:10.516-08:00полезяшкиdstat - Combines vmstat, iostat, ifstat, netstat information and more<br />pydf - размалеваный df<br />iftop - top для интерфейсов<br />htop - более прикольный top<br />iptraf - просмотр статистики по портам<br />mtr - динамический routetraceUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-9591762330717737012009-12-10T22:57:00.000-08:002009-12-10T23:02:45.395-08:00Setup Ruby Enterprise Edition, nginx and Passenger (aka mod_rails) on Ubuntu<div class="contenttitle"> <p>By <a href="http://antoniocangiano.com/about">Antonio Cangiano</a>. Filed under <a href="http://antoniocangiano.com/category/quick-tips/" title="View all posts in Quick Tips" rel="category tag">Quick Tips</a>, <a href="http://antoniocangiano.com/category/ruby/" title="View all posts in Ruby" rel="category tag">Ruby</a>, <a href="http://antoniocangiano.com/category/ruby-on-rails/" title="View all posts in Ruby on Rails" rel="category tag">Ruby on Rails</a> </p> </div> <p>The following is a very short guide on setting up Ruby Enterprise Edition (REE), nginx and Passenger, for serving Ruby on Rails applications on Ubuntu. It also includes a few quick and easy optimization tips.</p> <p>We start with setting up REE (x64), using the .deb file provided by Phusion:</p> <div class="highlight"> <pre><blockquote>wget http://rubyforge.org/frs/download.php/66163/ruby-enterprise_1.8.7-2009.10_amd64.deb<br />sudo dpkg -i ruby-enterprise_1.8.7-2009.10_amd64.deb<br />ruby -v</blockquote><br /></pre> </div> <p>In output you should see “ruby 1.8.7 (2009-06-12 patchlevel 174)…” or similar. If this is the case, good; while you are there, update RubyGems and the installed gems:</p> <div class="highlight"> <pre><blockquote>sudo gem update --system<br />sudo gem update</blockquote><br /></pre> </div> <p>Next, you’ll need to install nginx, which is a really fast web server. The <a href="http://phusion.nl/about.html">Phusion</a> team has made it very easy to install, but if you simply follow most instructions found elsewhere, you’ll get the following error:</p> <pre><blockquote>checking for system md library ... not found<br />checking for system md5 library ... not found<br />checking for OpenSSL md5 crypto library ... not found<br /><br />./configure: error: the HTTP cache module requires md5 functions<br />from OpenSSL library. You can either disable the module by using<br />--without-http-cache option, or install the OpenSSL library in the<br />system,<br />or build the OpenSSL library statically from the source with nginx by<br />using<br />--with-http_ssl_module --with-openssl=<br /><path> options.</path></blockquote><path></path></pre> <p>Instead, we are going to install libssl-dev first and then nginx and its Passenger module:</p> <div class="highlight"> <pre>sudo aptitude install libssl-dev<br />sudo passenger-install-nginx-module<br /></pre> </div> <p>Follow the prompt and accept all the defaults (when prompted to chose between 1 and 2, pick 1).</p> <p>Before I proceed with the configuration, I like to create an init script and have it boot at startup (the script itself is adapted from one provided by the excellent <a href="http://articles.slicehost.com/">articles at slicehost.com</a>):</p><blockquote><p></p> <div class="highlight"> <pre>sudo vim /etc/init.d/nginx</pre></div></blockquote><div class="highlight"><pre><br /></pre> </div> <p>The content of which needs to be:</p> <div class="highlight"> <pre><span class="c"></span><blockquote><span class="c">#! /bin/sh</span><br /><br /><span class="c">### BEGIN INIT INFO</span><br /><span class="c"># Provides: nginx</span><br /><span class="c"># Required-Start: $all</span><br /><span class="c"># Required-Stop: $all</span><br /><span class="c"># Default-Start: 2 3 4 5</span><br /><span class="c"># Default-Stop: 0 1 6</span><br /><span class="c"># Short-Description: starts the nginx web server</span><br /><span class="c"># Description: starts nginx using start-stop-daemon</span><br /><span class="c">### END INIT INFO</span><br /><br /><span class="nv">PATH</span><span class="o">=</span>/opt/nginx/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br /><span class="nv">DAEMON</span><span class="o">=</span>/opt/nginx/sbin/nginx<br /><span class="nv">NAME</span><span class="o">=</span>nginx<br /><span class="nv">DESC</span><span class="o">=</span>nginx<br /><br /><span class="nb">test</span> -x <span class="nv">$DAEMON</span> <span class="o">||</span> <span class="nb">exit </span>0<br /><br /><span class="c"># Include nginx defaults if available</span><br /><span class="k">if</span> <span class="o">[</span> -f /etc/default/nginx <span class="o">]</span> ; <span class="k">then</span><br /> . /etc/default/nginx<br /><span class="k">fi</span><br /><br /><span class="nb">set</span> -e<br /><br />. /lib/lsb/init-functions<br /><br /><span class="k">case</span> <span class="s2">"$1"</span> in<br />start<span class="o">)</span><br /> <span class="nb">echo</span> -n <span class="s2">"Starting $DESC: "</span><br /> start-stop-daemon --start --quiet --pidfile /opt/nginx/logs/<span class="nv">$NAME</span>.pid <span class="se">\</span><br /> --exec <span class="nv">$DAEMON</span> -- <span class="nv">$DAEMON_OPTS</span> <span class="o">||</span> <span class="nb">true</span><br /><span class="nb"> echo</span> <span class="s2">"$NAME."</span><br /> ;;<br />stop<span class="o">)</span><br /> <span class="nb">echo</span> -n <span class="s2">"Stopping $DESC: "</span><br /> start-stop-daemon --stop --quiet --pidfile /opt/nginx/logs/<span class="nv">$NAME</span>.pid <span class="se">\</span><br /> --exec <span class="nv">$DAEMON</span> <span class="o">||</span> <span class="nb">true</span><br /><span class="nb"> echo</span> <span class="s2">"$NAME."</span><br /> ;;<br />restart|force-reload<span class="o">)</span><br /> <span class="nb">echo</span> -n <span class="s2">"Restarting $DESC: "</span><br /> start-stop-daemon --stop --quiet --pidfile <span class="se">\</span><br /> /opt/nginx/logs/<span class="nv">$NAME</span>.pid --exec <span class="nv">$DAEMON</span> <span class="o">||</span> <span class="nb">true</span><br /><span class="nb"> </span>sleep 1<br /> start-stop-daemon --start --quiet --pidfile <span class="se">\</span><br /> /opt/nginx/logs/<span class="nv">$NAME</span>.pid --exec <span class="nv">$DAEMON</span> -- <span class="nv">$DAEMON_OPTS</span> <span class="o">||</span> <span class="nb">true</span><br /><span class="nb"> echo</span> <span class="s2">"$NAME."</span><br /> ;;<br />reload<span class="o">)</span><br /> <span class="nb">echo</span> -n <span class="s2">"Reloading $DESC configuration: "</span><br /> start-stop-daemon --stop --signal HUP --quiet --pidfile /opt/nginx/logs/<span class="nv">$NAME</span>.pid <span class="se">\</span><br /> --exec <span class="nv">$DAEMON</span> <span class="o">||</span> <span class="nb">true</span><br /><span class="nb"> echo</span> <span class="s2">"$NAME."</span><br /> ;;<br />status<span class="o">)</span><br /> status_of_proc -p /opt/nginx/logs/<span class="nv">$NAME</span>.pid <span class="s2">"$DAEMON"</span> nginx <span class="o">&&</span> <span class="nb">exit </span>0 <span class="o">||</span> <span class="nb">exit</span> <span class="nv">$?</span><br /> ;;<br />*<span class="o">)</span><br /> <span class="nv">N</span><span class="o">=</span>/etc/init.d/<span class="nv">$NAME</span><br /> <span class="nb">echo</span> <span class="s2">"Usage: $N {start|stop|restart|reload|force-reload|status}"</span> >&2<br /> <span class="nb">exit </span>1<br /> ;;<br /><span class="k">esac</span><br /><br /><span class="nb">exit </span>0</blockquote><br /></pre> </div> <p>Change its permission and have it startup at boot:</p> <div class="highlight"> <pre></pre></div><blockquote><div class="highlight"><pre>sudo chmod +x /etc/init.d/nginx<br />sudo /usr/sbin/update-rc.d -f nginx defaults<br /></pre> </div> </blockquote><p>From now on, you’ll be able to start, stop and restart nginx with it. Start the server as follows:</p> <div class="highlight"> <pre><blockquote>sudo /etc/init.d/nginx start</blockquote><br /></pre> </div> <p>Heading over to your server IP with your browser, you should see “Welcome to nginx!”. If you do, great, we can move on with the configuration of nginx for your Rails app.</p> <p>Edit nginx’ configuration file:</p> <div class="highlight"> <pre><blockquote>sudo vim /opt/nginx/conf/nginx.conf</blockquote><br /></pre> </div> <p>Adding a server section within the http section, as follows:</p> <div class="highlight"> <pre><blockquote> server <span class="o">{</span><br /> listen 80;<br /> server_name example.com;<br /> root /somewhere/my_rails_app/public;<br /> passenger_enabled on;<br /> rails_spawn_method smart;<br /> <span class="o">}</span></blockquote><br /></pre> </div> <p>The server name can also be a subdomain if you wish (e.g., blog.example.com). It’s important that you point the root to your Rails’ app public directory.</p> <p>The rails_spawn_method directive is very efficient, allowing Passenger to consume less memory per process and speed up the spawning process, whenever your Rails application is not affected by its limitations (for a discussion about this you can read the proper <a href="http://www.modrails.com/documentation/Users%20guide.html#_the_smart_spawning_method">section in the official guide</a>).</p> <p>If you have lots of RAM (e.g., more than 512 MB) on your server, you may want to consider increasing you maximum pool size, with the directive passenger_max_pool_size from its default size of 6. Conversely, if you want to limit the number of processes running at any time and consume less memory on a small VPS (e.g., 128 to 256MB), you can decrease that number down to 2 (or something in that range). (Always test a bunch of configurations to find one that works for you). You can read more about this directive, <a href="http://modrails.com/documentation/Users%20guide%20Nginx.html#PassengerMaxPoolSize">in the official guide</a>.</p> <p>While you are modifying nginx’ configuration, you may also want to increase the worker processes (e.g., to 4, on a typical VPS) and add a few more tweaks (such as enabling gzip compression):</p> <div class="highlight"> <pre><span class="c"></span><blockquote><span class="c"># ...</span><br />http <span class="o">{</span><br /> passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.5;<br /> passenger_ruby /usr/local/bin/ruby;<br /><br /> include mime.types;<br /> default_type application/octet-stream;<br /><br /> access_log logs/access.log;<br /><br /> sendfile on;<br /> keepalive_timeout 65;<br /> tcp_nodelay on;<br /><br /> gzip on;<br /> gzip_comp_level 2;<br /> gzip_proxied any; <br /><br /> server <span class="o">{</span><br /> <span class="c">#...</span></blockquote><br /></pre> </div> <p>When you are happy with the changes, save the file, and restart nginx:</p> <div class="highlight"> <pre><blockquote>sudo /etc/init.d/nginx restart</blockquote><br /></pre> </div> <p>If you wish to restart Passenger in the future, without having to restart the whole web server, you can simply run the following command:</p> <div class="highlight"> <pre><blockquote>touch /somewhere/my_rails_app/tmp/restart.txt</blockquote><br /></pre> </div> <p>Passenger also provides a few handy monitoring tools. Check them out:</p> <div class="highlight"> <pre><blockquote>sudo passenger-status<br />sudo passenger-memory-stats</blockquote><br /></pre> </div> <p>That’s it, you are ready to go! I hope that you find these few notes useful.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-27174440268611395452009-12-03T22:21:00.000-08:002009-12-03T22:33:12.416-08:00Установка Nokogiri на OS XДля начала ставим свежую версию libxml2 из портов<br /><blockquote>sudo port install libxml2 libxslt</blockquote><br /><br /><blockquote>gem install nokogiri -- --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local</blockquote><br /><br /><br />или если поставили libxml2 из source соответственно<br /><blockquote>gem install nokogiri -- --with-xml2-include=/usr/local/include/libxml2 --with-xml2-lib=/usr/local/lib --with-xslt-dir=/usr/local</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-74950235471349417762009-11-24T23:00:00.000-08:002009-11-24T23:01:56.675-08:00MySQL gem на leopard 10.5...sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_configUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-6223113666408184522009-11-14T09:17:00.000-08:002009-11-14T09:20:47.696-08:00PXE: теперь не только для серверов<h1>PXE: теперь не только для серверов</h1> <p> Оригинал: <noindex><a href="http://www.linuxjournal.com/article/10410">PXE: Not Just for Server Networks Anymore!</a></noindex><br />Автор: Bill Childers<br />Дата: 1 апреля 2009<br />Перевод: Александр Тарасов aka oioki<br />Дата перевода: 7 ноября 2009 </p><p> В апрельском выпуске 2008 года Linux Journal была напечатана статья Кайла Ранкина (Kyle Rankin) "PXE Magic", описывающая способ работы PXE (Preboot eXecution Environment, Среда предзагрузочного исполнения), инструкцию по установке своего собственного PXE-сервера и включению аварийных средств вроде Knoppix в PXE-установщик Kickstart. Мне эта статья очень помогла, однако теперь у меня встала задача обслуживания не только сети Linux-серверов, а всей сети, состоящей из ноутбуков, рабочих станций и серверов с установленными Ubuntu и Windows. Я представил, как было бы здорово иметь сервер, с помощью которого можно было бы устанавливать не только сервера и загружать по сети аварийные средства, но также создавать временные рабочие окружения для пользователей, в том случае, если что-нибудь сломается. Было бы идеально, если бы с помощью этого PXE-сервера можно было бы по сети устанавливать Windows. Через несколько часов проб и ошибок, я, наконец, создал рецепт и, по странному стечению обстоятельств, я сумел наладить сетевую установку Windows... сперва разворачивая Linux. </p><h2>Установка терминального сервера Ubuntu</h2> <p> Одной из моих целей при создании такой системы была возможность предоставления пользователям такой среды, которую они могли бы быстренько загрузить, чтобы она была привычна для них, и позволяла бы выполнять простейшие действия - проверить почту, зайти на сайт, отправить мгновенное сообщение и т.п. К счастью, большинство персонала в моей компании пользуется на рабочих компьютерах системой Ubuntu, поэтому ясно вырисовалось решение установить и настроить терминальный сервер Ubuntu на основе проекта Linux Terminal Server Project (LTSP). </p><p>Как любая реализация PXE, сервер LTSP требует наличия TFTP-сервера, правильно настроенного DHCP-сервера и программы syslinux. Если объяснять простыми словами, то процесс происходит так. Пользователь загружает свой компьютер, сетевой адаптер выполняет PXE-код, компьютер получает с помощью DHCP свой IP-адрес и IP-адрес сервера, на котором хранится код syslinux. Затем запускается TFTP-клиент, код syslinux скачивается и исполняется, таким образом начинается процесс загрузки. Благодаря кропотливому труду разработчиков Ubuntu LTSP, установка такого сервера происходит быстро и легко. </p><p>Есть два способа установки LTSP-сервера: обычный и самостоятельный. В первом случае предполагается, что у вас в сети уже есть существующий DHCP-сервер; а самостоятельный способ подразумевает отсутствие DHCP-сервера. В случае самостоятельной установки в вашей сети будет установлен DHCP-сервер с последующей автоматической интеграцией с LTSP-сервером. В моей сети уже был DHCP-сервер, поэтому я выбрал обычную установку с интеграцией с нашим существующим Windows Server DHCP. </p><p> <table align="right" cellpadding="10" width="40%"> <tbody><tr> <td bgcolor="white"> <p> <zag>Замечания по DHCP</zag> </p><p>Я упомянул интеграцию LTSP-сервера с сервером DHCP для Microsoft Windows, но отнюдь несложно заставить работать LTSP в связке с любым другим DHCP-сервером. Если у вас DHCP стандартной реализации (от Internet Software Consortium), тогда обратитесь к уже упоминавшейся статье Кайла "PXE Magic" (см. источники информации в конце статьи). В этой статье приведен пример необходимых настроек и объяснения, как они работают. Если ваш сервер - dnsmasq (он популярен в OpenWRT и других легковесных Linux-дистрибутивах для встраиваемых систем), то нужно добавить в файл dnsmasq.conf опции <tt>dhcp-option=66,<ip_адрес_ltsp></ip_адрес_ltsp></tt> и <tt>dhcp-option=pxe,67,pxelinux.0</tt>. Именно такая конфигурация работает у меня дома. </p></td> </tr> </tbody></table> Я начал с установки стандартной десктопной Ubuntu 8.04 на сервер Dell 1950, ведь LTSP-сервер должен предоставлять пользователям рабочее окружение GNOME. После этого назначил серверу статический IP-адрес из диапазона адресов нашей сети (в той же подсети, что и рабочие станции и ноутбуки). Установка LTSP-сервера происходит проще некуда - просто наберите в терминале GNOME команду <tt>sudo apt-get install ltsp-server openssh-server</tt>, и он будет установлен. Последним шагом, относящимся к LTSP-серверу, является построение системы "тонких клиентов". Просто скомандуйте в терминале <tt>sudo ltsp-build-client</tt>, и остальные настройки и построение LTSP-окружения chroot будет выполнено автоматически. </p><p> Теперь, когда сам LTSP-сервер готов, нужно включить поддержку PXE-загрузки в нашей сети, а это означает дополнительное конфигурирование Windows DHCP-сервера. Потребовалось достаточно много времени и сил, но как и в статье Кайла, на стороне DHCP-сервера потребовалось изменить всего лишь две настройки. В Microsoft DHCP-сервере этими настройками были "066 Boot Server Host Name", которой я присвоил значение IP-адреса LTSP-сервера и настройка "067 Bootfile Name", значение которой нужно присвоить "ltsp/i386/pxelinux.0". Это значение поначалу казалась непонятным, пока я не уяснил, что корневым каталогом TFTP-сервера Ubuntu является /var/lib/tftpboot. Если у вас стоит какой-нибудь другой DHCP-сервер, тогда вам может помочь врезка "Замечания по DHCP", либо обратитесь к документации по вашему DHCP. </p><p> </p><center> <a href="http://rus-linux.net/MyLDP/admin/pxe_files/10410f1.jpg"><img src="http://rus-linux.net/MyLDP/admin/pxe_files/10410f1.mini.jpg" border="1" /></a><br /><i>Рисунок 1. Окно входа в Ubuntu LTSP</i> </center> <p>На данный момент можно загрузить компьютер в нашей сети, нажать F12, выбрать в качестве загрузочного устройства сетевую карту и через 30 секунд вы получите окно входа GDM. У меня получилось бы войти, но я бы сделал это как один из пользователей на самом Ubuntu-сервере. Близко, но не совсем то, что мне нужно. В идеале, нужно настроить так, чтобы LTSP-сессию мог открыть любой пользователь из Windows-домена. Таким образом, нужно добавить этот сервер в Active Directory моего предприятия. Сама по себе эта задача не проста, но в системе Ubuntu 8.04 и выше, это можно сделать с помощью apt-get и пары других команд. </p><p> Пакет, который все это делает, называется likewise-open. Сначала нужно скомандовать: </p><pre>sudo apt-get install likewise-open<br /></pre> <p> И пакет likewise будет установлен. После этого нужно включить Ubuntu-сервер в Windows-домен. Для этого командуйте: </p><p> </p><pre>sudo domainjoin-cli join <fqdn.mydomain.com> <domainadminuid><br /></domainadminuid></fqdn.mydomain.com></pre> <p> Если требуется, чтобы likewise запускался при загрузке компьютера, тогда нужно выполнить такую команду: </p><p> </p><pre>sudo update-rc.d likewise-open defaults<br /></pre> <p> Также я хотел, чтобы логины проверялись в домене по умолчанию, для этого я добавил эту строку в файл /etc/samba/lwiauthd.conf: </p><p> </p><pre>winbind use default domain = yes<br /></pre> <p> Наконец, запускаем демон likewise-open с помощью: </p><p> </p><pre>sudo /etc/init.d/likewise-open start<br /></pre> <p> Теперь мои PXE LTSP клиенты могут аутентифицировать себя в корпоративной Active Directory. Первый шаг нашей задачи выполнен! </p><p> </p><center> <a href="http://rus-linux.net/MyLDP/admin/pxe_files/10410f2.jpg"><img src="http://rus-linux.net/MyLDP/admin/pxe_files/10410f2.mini.jpg" border="1" /></a><br /><i>Рисунок 2. Рабочий стол Ubuntu - работает!</i> </center> <h2>Настройка установки Windows по PXE через Unattended</h2> <p> Следующий шаг в моих приключениях с PXE - переустановка Windows на 30 ноутбуках. Старый системный администратор устанавливал Windows через образы. К сожалению, мне не удалось найти эти файлы образов. Из-за некоторых нюансов и нехватки времени для пересоздания правильных образов для каждой аппаратной платформы, я выбрал проведение установки Windows через Unattended. </p><p>Мне известно, что вместе с Windows поставляется Remote Installation Service (RIS, Сервис удаленной установки), но так как у меня не было времени, мне не хотелось изучать полностью новую технологию. Однако у меня был другой выбор: открытый проект Unattended. Unattended попалась мне на глаза примерно год назад, и хотя я пробовал ее дома, но никогда не задействовал в корпоративных условиях. Как и многие администраторы Linux, когда я слышу слово "Windows", у меня мурашки бегут, но так как мне поручили это задание, то его нужно сделать. Я понял, что лучше решать эту задачу наиболее умным способом - не терять времени зря и автоматизировать установку Windows. </p><p>Работа Unattended основана на том факте, что первый шаг в установке Windows 2000/XP - это по сути DOS-программа. Процессы, происходящие при PXE-загрузке через Unattended, довольно запустанны, но зато это дает большую гибкость. В простейшем случае, компьютер загружает ядро Linux и оболочку, далее вступают в действие скрипты Unattended. Скрипт разбивает системный диск на разделы и создает базовую структуру FAT, затем вы выбираете операционную систему (например, тип Windows-системы), настройки конфигурации и дополнительные программы. Когда вы устанавливаете Windows по-обычному, вам задают много вопросов о серийном номере, имени пользователя, к какой рабочей группе или домену присоединять, и о пользователях с правами администратора. Скрипты Unattended автоматически собирают эти данные воедино и создают файл unattend.txt, который складывается на свежесозданной файловой системе FAT. Затем запускается сессия FreeDOS, в которой с Samba-ресурса на сервере Unattended копируются установщик Windows и части операционной системы, и, наконец, запускается установщик, задействующий файл unattend.txt. После этого установка будет происходить самостоятельно, без вмешательства администратора. Разработчики из команды Unattended пошли еще дальше и создали разные скрипты, устанавливающие дополнительные программы (к примеру, автоматизированная VPN или Microsoft Office). Эти скрипты можно включить в свою конфигурацию. </p><p> По причине отсутствия такого понятия, как "пакет Unattended", процесс установки значительно отличается от стандартных <tt>./configure && make install</tt>, и пришлось усердно штудировать документацию на сайте. Вкратце, система Unattended использует PXE и Linux, а также Samba для передачи установочных данных, также в ней содержится набор Perl, shell и batch-скриптов, которые выполняют всю установочную "магию". </p><p>В документации предполагается, что у вас есть рабочие DHCP- и DNS-серверы, а также Samba-сервер. У меня уже был установлены DHCP- и DNS-сервер, а Samba-сервер я установил с помощью команды <tt>sudo apt-get install samba</tt>. Потом я скачал дистрибутив Unattended с веб-сайта и распаковал его в /opt/unattended. Далее, создал CNAME-запись на нашем DNS-сервере, который отображал имя ntinstall на реальное имя хоста - установочного сервера. После этого я настроил Samba-сервер, файл конфигурации /etc/samba/smb.conf выглядит примерно следующим образом (некоторые части файла опущены): </p><p> </p><pre>[global]<br />...<br />guest account = guest<br />unix extensions = off<br />...<br />[install]<br /> comment = Unattended<br /> writable = no<br /> locking = no<br /> path = /path/to/unattended/install<br /> guest ok = yes<br /></pre> <p> Наконец, пришло время заполнить место, предназначенное для дистрибутива ОС, данными Windows. Мы создаем подкаталог в каталоге <i><b>корень_unattended</b>/install/os</i> с именем вашего дистрибутива. В моем случае я создал каталог <i>/opt/unattended/install/os/winxp</i> и примонтировал этот каталог через Samba на свой рабочий стол. Затем я вставил установочный диск Windows в CD-привод и скопировал с диска каталог <i>/i386</i> в каталог <i>/install/os/winxp</i> на моем сервере. Теоретически, теперь мой сервер Unattended был готов к предоставлению установки системы... но пока не было способа выбрать установку Unattended из загрузочного меню. </p><p>Тут мне опять помогла статья Кайла. Мне нужно было не что иное, как загрузочное меню PXE, и благодаря статье Кайла, мне удалось быстренько его создать. Нужно было взять файлы bzImage и initrd из каталога tftpboot, хранящегося в zip-файле linuxboot на сайте Unattended. Эти файлы нужно поместить в каталог <i>/var/lib/tftpboot/ltsp/i386/</i> (я переименовал файл bzImage в unat, а файл intird - в unatin.img, чтобы лучше их различать). </p><p> Затем я создал на сервере файл <i>/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default</i> (см. листинг 1). В нем содержится набор загрузочных аргументов syslinux, соответствующий конфигурациям серверов LTSP и Unattended. Нужно обратить особое внимание на директивы DISPLAY и LABEL. Директива DISPLAY означает, что при загрузке компьютера будет отображено содержимое файла <i>pxemenu.msg</i>, в котором содержится текст меню. Директива LABEL - это то, что нужно ввести, чтобы произошла загрузка определенного вида. В данном случае, если пользователь введет "1", система загрузит Ubuntu LTSP сессию (кстати, это вариант по умолчанию), а если введет "2", то сможет установить Windows. </p><p> <b>Листинг 1. Пример файла pxelinux.cfg/default</b> </p><pre>default 1<br />serial 0,9600n8<br />timeout 300<br />prompt 1<br />DISPLAY pxemenu.msg<br />F1 pxemenu.msg<br /><br />LABEL 1<br />KERNEL vmlinuz<br />APPEND ro initrd=initrd.img quiet splash<br /><br />LABEL 2<br />KERNEL unatµ<br />APPEND initrd=unatin.img z_user=guest z_password=guest z_path=//192.168.1.20/install<br /></pre> <p>Теперь при загрузке PXE-клиента у меня есть выбор - загрузить сессию Ubuntu LTSP или провести Unattended-установку. На данный момент установка Windows через Unattended мной протестирована и работает - установка базовой Windows происходит хорошо, но при этом не устанавливаются никакие драйверы, и не накладываются патчи. Я понял, как сильно я прикипел к менеджеру обновлений Ubuntu, но мне пришлось смириться с этим и искать способ довести систему полностью до рабочего состояния, чтобы установка драйверов и обновлений происходила без моего вмешательства. </p><p> </p><center> <a href="http://rus-linux.net/MyLDP/admin/pxe_files/10410f3.jpg"><img src="http://rus-linux.net/MyLDP/admin/pxe_files/10410f3.mini.jpg" border="1" /></a><br /><i>Рисунок 3. Какую программу запустим?</i> </center> <p>Мне не пришлось изобретать колесо, потому что проблема с драйверами и обновлениями адресована на самом деле ребятам из Unattended. Существует способ встроить DriverPacks (это большой сжатый архив с драйверами) в систему Unattended. Описание этого метода уже выходит за рамки данной статьи, но если вам понадобится, обратитесь к соответствующей ссылке в конце статьи. </p><p>Что касается автоматической установки обновлений, то ребята из Unattended выбрали Linux-подобный подход. В каталоге Unattended есть два каталога - <i>/install/scripts</i> и <i>/install/tools</i>. Каталог <i>scripts</i> содержит Windows batch-файлы (с расширением <i>.bat</i>), они используются для проведения автоматической установки различного программного обеспечения, а также некоторых обновлений. Каталог <i>tools</i> содержит набор скриптов, которые будут получать текущую конфигурацию с вашего Unattended-сервера и содержимое <i>scripts</i> на сервере и сравнивать его с содержимым CVS-хранилища, поддерживаемого командой Unattended. Затем скрипты скачают последние bat-файлы и разместят их в соответствующем месте каталога scripts. На данный момент при установке Windows через систему Unattended также автоматически скачиваются все патчи и устанавливаются без вмешательства пользователя. После очередной перезагрузки система возьмет следующий неустановленный патч, установит его и так продолжится до полного обновления системы. Обновление вашей системы Unattended до актуального состояния происходит с помощью трех последовательных команд <tt>./script-update; ./check; ./prepare</tt>, выполненных из каталога <i>/install/tools</i> из корня Unattended. </p><p> </p><center> <a href="http://rus-linux.net/MyLDP/admin/pxe_files/10410f4.jpg"><img src="http://rus-linux.net/MyLDP/admin/pxe_files/10410f4.mini.jpg" border="1" /></a><br /><i>Рисунок 4. Windows устанавливается! Быстрее и надежней - вот это спорно.</i> </center> <p> CVS-архив скриптов, как и архив скриптов на вики - бесценны. Эти ресурсы помогли мне выстроить автоматизированную систему установки, и теперь у меня есть конфигурация, которая полностью удовлетворяет потребности моей компании в Windows. Теперь я могу ввести данные, относящиеся к компьютеру (буквально несколько секунд), и я могу спокойно гулять по своим делам, зная, что Windows, Office, Cisco VPN client, Symantec Anti-Virus и многие другие программы будут установлены автоматически без моего присутствия и без присутствия вообще кого-либо. </p><p>В заключение я хотел бы сказать, что благодаря усилиям разработчиков Ubuntu и LTSP, теперь у меня есть окружение, позволяющее пользователям работать даже при поломанной основной системе. И благодаря разработчикам Unattended, мне не приходится каждый раз нянчиться с установкой Windows, либо ставить Windows через полуготовые образы или другие странные способы. У меня уже есть идеи, как еще больше расширить эту систему. </p><h2>Источники информации</h2> <noindex> <p> "PXE Magic: Flexible Network Booting with Menus" от Кайла Ранкина (Выпуск журнала LJ от апреля 2008): <a href="http://www.linuxjournal.com/article/9963">www.linuxjournal.com/article/9963</a> </p><p> Ubuntu Wiki - Установка LTSP: <a href="https://help.ubuntu.com/community/UbuntuLTSP/LTSPQuickInstall">https://help.ubuntu.com/community/UbuntuLTSP/LTSPQuickInstall</a> </p><p> Аутентификация Active Directory в Ubuntu 8.04 и 8.10: <a href="http://anothersysadmin.wordpress.com/2008/04/06/howto-active-directory-authentication-in-ubuntu-804">anothersysadmin.wordpress.com/2008/04/06/howto-active-directory-authentication-in-ubuntu-804</a> </p><p> Unattended: система развертывания Windows: <a href="http://unattended.sourceforge.net/">unattended.sourceforge.net</a> </p><p> Пошаговые инструкции Unattended: <a href="http://unattended.sourceforge.net/step-by-step.php">unattended.sourceforge.net/step-by-step.php</a> </p><p> Unattended Wiki: <a href="http://ubertechnique.com/unattended/FrontPage">ubertechnique.com/unattended/FrontPage</a> </p><p> Использование DriverPacks с Unattended: <a href="http://ubertechnique.com/unattended/BTS_Driver_Packs">ubertechnique.com/unattended/BTS_Driver_Packs</a> </p><p> Архив скриптов Unattended: <a href="http://ubertechnique.com/unattended/Scripts">ubertechnique.com/unattended/Scripts</a> </p><p> <i>Билл Чайлдерс (Bill Childers) - IT-менеджер из Силиконовой долины, где он живет со своей женой и двумя детьми. Ему слишком нравится Linux, возможно, ему нужно почаще выходить на солнышко. В свое свободное время посещает фестиваль чеснока в Гилрое, но он вовсе не пахнет чесноком. </i> </p><hr /></noindex>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3622801626169945037.post-11235178584296097232009-11-11T12:07:00.000-08:002009-11-12T13:29:18.627-08:00Доступ к MSSQL из Rails (OS X Leopard)Настраиваем доступ из рельсов к MSSQL серверу<br /><br />Ruby/Rails => ActiveRecord SQL Server Adapter => DBI Gem w/DBD-ODBC => Ruby ODBC => unixODBC => FreeTDS => MSSQL Server.<br /><br />Так как мне это нужно только для временого доступа к разным серверам то я использую проброс портов через ssh<br /><blockquote>$ ssh -L 1433:mssqlserver.mydomain:1433 login@myhost </blockquote>поэтому вместо имени сервера я использую localhost<br /><br />для начала ставим xcode с установочного диска и ports<br />или обновляем<br /><blockquote>$ sudo port selfupdate</blockquote>Все настройки я описываю для ruby 1.8.7<br />Проверяем версию руби<br /><blockquote>$ ruby -v</blockquote>и обновляем при необходимости<br /><blockquote>$ sudo port install ruby</blockquote>ставим gem<br /><blockquote>$ sudo port install rb-rubygems</blockquote>теперь переходим к установке unixODBC и FreeTDS<br /><blockquote>$ sudo port install unixODBC<br />$ sudo port install freetds +odbc<br /></blockquote>ставим необходимые gem<br /><blockquote>$ sudo gem install dbi -v 0.4.1<br />$ sudo gem install dbd-odbc -v 0.2.4<br />$ sudo gem install activerecord-sqlserver-adapter<br /></blockquote>на время написания статьи необходимо подправить Portfile для rb-odbc<br /><blockquote>$ port file rb-odbc | xargs mate<br /></blockquote>Теперь в открывшемся TextMate правим<br />0.9995 на 0.9997<br />и соответственно правим MD5 на 36d21519795c3edc8bc63b1ec6682b99<br /><br />у меня получилось<br /><blockquote># $Id: Portfile 30250 2007-10-23 02:16:17Z jmpp@macports.org $<br />PortSystem 1.0<br />PortGroup ruby 1.0<br /><br />ruby.setup {odbc ruby-odbc} 0.9997 extconf.rb {README doc test}<br />maintainers nomaintainer<br />description An extension library for ODBC from ruby.<br />long_description Extension library to use ODBC data sources from Ruby. \<br /> Supports Ruby 1.6.x and 1.8 on Win32 OSes and UN*X<br />checksums md5 36d21519795c3edc8bc63b1ec6682b99<br />homepage http://www.ch-werner.de/rubyodbc<br />master_sites http://www.ch-werner.de/rubyodbc<br />categories-append databases<br />platforms darwin<br /><br />variant utf8 {<br /> configure.args-append -Cutf8<br />}<br /><br /></blockquote>После сохранения файла можно ставить ruby ODBC<br /><blockquote>$ sudo port install rb-odbc +utf8</blockquote>Теперь настраиваем FreeTDS<br /><blockquote>$ mate /opt/local/etc/freetds/freetds.conf<br /></blockquote>я добавил в конец файла<br /><blockquote>[my_dev_server]<br /> host = localhost # я использую проброс портов<br /> port = 1433<br /> tds version = 8.0<br /> port = 1433<br /> client charset = UTF-8 # у меня серваки отдают win1251 а в рельсах utf-8<br /></blockquote>После этого настраиваем unixODBC<br /><blockquote>$ sudo cp /opt/local/etc/odbc.ini.dist /opt/local/etc/odbc.ini<br />$ sudo cp /opt/local/etc/odbcinst.ini.dist /opt/local/etc/odbcinst.ini<br />$ mate /opt/local/etc/odbcinst.ini</blockquote>вставляем<br /><blockquote>[FreeTDS]<br />Decscription = FreeTDS driver for SQLServer<br />Driver = /opt/local/lib/libtdsodbc.so<br />Setup = /opt/local/lib/libtdsodbc.so<br />FileUsage = 1<br /></blockquote>теперь очередь за настройкой DSN<br /><blockquote>$ mate /opt/local/etc/odbc.ini<br /></blockquote>вот например мой<br /><blockquote>[my_dev_server_dsn]<br />Driver=FreeTDS<br />Description=My Server Connection<br />Servername=my_dev_server<br />Server=my_dev_server<br />Port=1433<br />Database=mssql-database<br /></blockquote>теперь очередь за database.yml в приложении<br />например<br /><blockquote>development-mssql: <br /> adapter: sqlserver<br /> mode: ODBC<br /> username: user<br /> password: secret<br /> database: mssql-database # возможно достаточно настроек dsn<br /> dsn: my_dev_server_dsn<br /></blockquote><br /><br />Все работает.<br />На самом деле я использую модель и rake task для импорта данных в рельсовое приложение т.е. <span style="font-weight: bold;">только на этапе разработки.</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-75757187394543085802009-11-11T09:42:00.000-08:002009-11-11T09:46:13.331-08:00Show Git branch in bash terminalдобавляем в .profile<br /><br /><br /><blockquote>alias ss="ruby script/server"<br /><br /><br />parse_git_branch() {<br /> git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'<br />}<br />PS1='\[\033[00;32m\]\u\[\033[01m\]@\[\033[00;36m\]\h\[\033[01m\]:\[\033[00;35m\]\w\[\033[00m\]\[\033[00;36m\]$(parse_git_branch)\[\033[00m\]\$ '<br /><br /></blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-16116428344858038592009-11-11T03:50:00.000-08:002009-11-11T03:52:20.662-08:00Исправление некорректного отображения русских букв в Midnight Commander под Mac OS X<a href="http://theapplegeek.ru/archives/1180">отсюда взято</a><br /><br />Я уже давно заметил, что консольный файловый менеджер Midnight Commander неправильно работает с русскими буквами под Mac OS X. Но меня это особо не беспокоило, так как мне он нужен редко и с этой проблемой я могу спокойно смириться. Но сегодня @ex3m_su (очень рекомендую посмотреть социальную сеть ex3m для экстремальных людей, которую он создал – я там бываю регулярно) задал мне вопрос:<br /><br /> Подскажи, как наложить патч для MC из портов, он не воспринимает utf в интерфейсе {…}<br /><br />MC из портов, плохо работает с русскими буквами, и я решил найти решение такому поведению:<br /><br />Я начал с инструкции, подсказанной мне @ex3m (он проблему решил по ней) “Сборка Midnight Commander 4.6.3 на Mac OS Leopard“, но при использовании рекомендованного “Screen library” mcslang по-прежнему были проблемы с кодировкой, и не отображались символы, формирующие интерфейс программы:<br /><br />Поэтому я использовал slang. Учитывая то, что используемая сборка оказалась доступной только со страницы автора статьи, но не автора модификации, то для полноты картины я решил попробовать и официальную пререлизную сборку. Детали – ниже.<br />Подготовка<br /><br />Ставим и удаляем mc через MacPorts для разрешения зависимостей.<br /><br />$ port installed | grep mc<br /> mc @4.6.1_0 (active)<br />$ sudo port uninstall mc<br /><br />Все действия будем производить в каталоге ~/tmp<br /><br />mkdir ~/tmp<br />cd ~/tmp<br /><br />Находим последние slang, gettext и libiconv:<br /><br />wget http://www.sfr-fresh.com/unix/misc/slang-2.2.1.tar.gz<br />wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz<br />wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz<br /><br />Раскручиваем архивы<br /><br />tar xfz gettext-0.17.tar.gz<br />tar xfz libiconv-1.13.1.tar.gz<br />tar xfz slang-2.2.1.tar.gz<br /><br />Компилируем и устанавливаем пакеты (они поставятся не в /opt/local, а в /usr/local, поэтому нужно будет проверить $PATH, чтобы /usr/local/bin стоял перед /opt/local/bin):<br /><br />cd ~/tmp<br />cd gettext-0.17<br />./configure && make -j 4 && sudo make install<br />cd ..<br />cd libiconv-1.13.1<br />./configure && make -j 4 && sudo make install<br />cd ..<br />cd slang-2.2.1<br />./configure && make -j 4 && sudo make install<br />cd ..<br /><br />Использование модифицированной сборки Midnight Commander 4.6.3<br /><br />По оригинальному адресу модифицированного MC нет, берём с сайта автора статьи sudouser:<br /><br />cd ~/tmp<br />wget http://sudouser.com/mc-4.6.3-r504.tar.bz2<br />tar xfp mc-4.6.3-r504.tar.bz2<br /><br />Особенность (!) – в качестве “Screen library” используем не mcslang, а slang<br /><br />cd ~/tmp<br />cd mc-4.6.3-r504<br />./configure --with-screen=slang --with-libiconv-prefix=/usr/local<br /><br />Configuration:<br /> Screen library: S-Lang library (installed on the system)<br /> Enable support for utf-8: yes<br /> Enable support for charset: yes<br /><br />make -j 4 && sudo make install<br /><br />Информация по сборке:<br /><br />ole-mac:mc-4.6.3-r504 ctrld$ /usr/local/bin/mc -V<br />GNU Midnight Commander 4.6.3<br />Virtual File System: tarfs, extfs, cpiofs, ftpfs, fish, smbfs<br />With builtin Editor<br />Using system-installed S-Lang library with terminfo database<br />With subshell support as default<br />With support for background operations<br />With mouse support on xterm<br />With internationalization support<br />With multiple codepages support<br />Data types: char 8 int 32 long 64 void * 64 off_t 64 ecs_char 8<br /><br />Наслаждаемся нормальным отображением русских букв:<br /><br />Midnight Commander 4.7.0 Pre 3<br /><br />На сайте www.midnight-commander.org находим и списываем последнюю сборку mc 4.7.0-pre3<br /><br />cd ~/tmp<br />wget http://www.midnight-commander.org/downloads/14<br />mv 14 mc-4.7.0-pre3.tar.bz2<br />tar xfp mc-4.7.0-pre3.tar.bz2<br /><br />cd mc-4.7.0-pre3<br />./configure --with-screen=slang --with-libiconv-prefix=/usr/local --with-slang-includes=/usr/local --with-slang-libs=/usr/local<br /><br />Configuration:<br /> Screen library: S-Lang library (installed on the system)<br /> Support for charset: yes<br /><br />make -j 4 && sudo make install<br /><br />Информация по сборке:<br /><br />ole-mac:mc-4.7.0-pre3 ctrld$ /usr/local/bin/mc -V<br />GNU Midnight Commander 4.7.0-pre3<br />Virtual File System: tarfs, extfs, cpiofs, ftpfs, fish<br />With builtin Editor<br />Using system-installed S-Lang library with terminfo database<br />With subshell support as default<br />With support for background operations<br />With mouse support on xterm<br />With internationalization support<br />With multiple codepages support<br />Data types: char 8 int 32 long 64 void * 64 off_t 64 ecs_char 8<br /><br />И эта версия нормально отображает русский текст:<br /><br />Порты<br /><br />Можно поменять “Screen library” в порту mc с ncurses на slang, однако это не работает. Приведу описание процесса просто для сведения.<br /><br />$ cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/sysutils/mc<br />$ sudo cp Portfile Portfile.dist<br />$ sudo chown ctrld Portfile<br />$ cat Portfile.dist | sed 's/--with-screen=ncurses/--with-screen=slang/' > Portfile<br /><br />Ставим slang, gettext и libiconv<br /><br />$ sudo port install slang2<br />$ sudo port install gettext<br />$ sudo port install libiconv<br /><br />$ sudo port -dv install mc<br /><br />Информация по сборке<br /><br />bash-3.2$ /opt/local/bin/mc -V<br />GNU Midnight Commander 4.6.1<br />Using system-installed S-Lang library with terminfo database<br />With internationalization support<br />...<br /><br />Выводы<br /><br />Штатная версия Midnight Commander из MacPorts некорректно отображает русские буквы в именах файлов. Решение я продемонстрировал – можно использовать либо отдельную сборку MC 4.6.3, либо версию 4.7.0pre3, они обе работают нормально. Я остановился на последней.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-73625732655078101922009-11-11T00:35:00.000-08:002009-11-11T03:48:50.159-08:00Yota резервный канал в инет на ubuntu serverЗадолбали аварии у провайдера поэтому сделал резервный канал в инет через йоту.<br />Используем Samsung U200 Wimax<br /><br />Настройка WiMax<br />http://forum.ubuntu.ru/index.php?topic=43974.105<br />http://peter.infosreda.com/ru/projects<br /><br />Автоматом переключаем на резервный канал при падении основного<br /><br />http://www.gentoo.ru/node/12621Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-45947331715448951832009-10-18T12:03:00.000-07:002009-10-18T12:08:36.996-07:00MySQL при малом объеме озу<p><a href="http://itbg.davnozdu.ru/?p=486">взято отсюда</a><br /></p><p>Всем привет!<br />Сегодня я решил написать статью про оптимизацию<strong> MySQL 5.x</strong> для запуска и работы в условиях малого объёма ОЗУ</p> <p>Проблема стоит особенно остро на VDS/VPSсерверах, так как там ОЗУ очень немного.<br />Конкретно в моём случае я довольствуюсь лишь 64Мб и без дополнительного тюнинга MySQL отказался запускаться вообще.</p> <p>Почитав некоторое количество форумов, блогов и мануалов я вывел самый минимальный конфиг, при котором MySQL может работать.</p> <p>Вот он:</p> <blockquote> <ol><li># Main MySQL server options</li><li>[mysqld]</li><li>port = 3306</li><li>socket = /var/run/mysqld/mysqld.sock</li><li># No locking at all!</li><li>skip-locking</li><li># Set internal buffers, caches and stacks very low</li><li>key_buffer = 16K</li><li>max_allowed_packet = 16K</li><li>table_cache = 1</li><li>sort_buffer_size = 16K</li><li>read_buffer_size = 16K</li><li>read_rnd_buffer_size = 1K</li><li>net_buffer_length = 1K</li><li>thread_stack = 16K</li><li># Don’t listen on a TCP/IP port at all.</li><li># Will still work provided all access is done via localhost</li><li>skip-networking</li><li>server-id = 1</li><li># Skip Berkley and Inno DB types</li><li>skip-bdb</li><li>skip-innodb</li><li># Set the query cache low</li><li>query_cache_limit = 1048576</li><li>query_cache_size = 1048576</li><li>query_cache_type = 1</li><li># Set various memory limits very low, disable memory-hogging extras</li><li>[mysqldump]</li><li>quick</li><li>max_allowed_packet = 16K</li><li>[mysql]</li><li>no-auto-rehash</li><li>[isamchk]</li><li>key_buffer = 16K</li><li>sort_buffer_size = 16K</li><li>[myisamchk]</li><li>key_buffer = 16K</li><li>sort_buffer_size = 16K</li><li>[mysqlhotcopy]</li><li>interactive-timeout</li></ol> </blockquote> <p>Именно с ним мне получилось первый раз удачно стартовать MySQL.<br />Посмотрев результат и оценив расход ОЗУ я решил расщедриться и увеличить кэш, заодно и пометь некоторые параметры.</p> <p>Вот что у меня получилось в итоге:</p> <blockquote> <ol><li>[mysqld]</li><li>datadir=/var/lib/mysql</li><li>socket=/tmp/mysql/mysql.sock</li><li>user=mysql</li><li>port = 3306</li><li>bind-address = 127.0.0.1</li><li># No locking at all!</li><li>skip-locking</li><li># Set internal buffers, caches and stacks very low</li><li>key_buffer = 16K</li><li>max_allowed_packet = 16K</li><li>table_cache = 1</li><li>sort_buffer_size = 16K</li><li>read_buffer_size = 16K</li><li>read_rnd_buffer_size = 1K</li><li>net_buffer_length = 1K</li><li>thread_stack = 16K</li><li># Don’t listen on a TCP/IP port at all.</li><li># Will still work provided all access is done via localhost</li><li>skip-networking</li><li>server-id = 1</li><li># Skip Berkley and Inno DB types</li><li>skip-bdb</li><li>skip-innodb</li><li># Set the query cache low</li><li>query_cache_limit = 500K</li><li>query_cache_size = 3M</li><li>query_cache_type = 1</li><li># Set various memory limits very low, disable memory-hogging extras</li><li>[mysqldump]</li><li>quick</li><li>max_allowed_packet = 16K</li><li>[mysql]</li><li>no-auto-rehash</li><li>[isamchk]</li><li>key_buffer = 16K</li><li>sort_buffer_size = 16K</li><li>[myisamchk]</li><li>key_buffer = 16K</li><li>sort_buffer_size = 16K</li><li>[mysqlhotcopy]</li><li>interactive-timeout</li></ol> </blockquote> Пока что пользуюсь без проблем этим конфигом, при моих ресурсах ОЗУ он вполне меня устраивает.<br />Все опции прокомментированы прямо в конфиге и очень понятны.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-48654060798630978322009-07-07T22:59:00.000-07:002009-07-07T23:00:55.238-07:00irb readline support on Leopard<p class="subtitle"> Written March 22, 2008 at 22:40 CET. Tagged <a href="http://henrik.nyh.se/tag#ruby">Ruby</a> and <a href="http://henrik.nyh.se/tag#os-x">OS X</a>. <span id="edit"></span> </p> <p>The <code>irb</code> (Interactive Ruby) that ships with OS X Leopard does not have <code><a href="http://en.wikipedia.org/wiki/GNU_readline">readline</a></code> support. Instead it uses <a href="http://www.thrysoee.dk/editline/">libedit</a>.</p> <p>This means that things like <code>⌃R</code> for reverse history search don't work. More importantly to me, you can't use non-ASCII characters like Swedish "å", "ä" and "ö".</p> <p>Compiling your own Ruby (with readline) is one solution. If you just want ctrl+R, <a href="http://www.macosxhints.com/article.php?story=20080313113705760">macosxhints has another</a>.</p> <p>The solution I'm currently using is the work of jptix, a regular on the <a href="irc://irc.freenode.net/##textmate">##textmate</a> IRC channel. He asked me to blog about it, so here it is.</p> <p><a name='more'></a></p> <p>Get <a href="http://www.macports.org/">MacPorts</a> and install <code>readline</code> (you must specify <code>+universal</code>, even on Intel):</p> <div class="highlight"><pre>sudo port install readline +universal</pre> </div> <p>Get the Ruby extension for <code>readline</code>:</p> <div class="highlight"><pre>svn co http://svn.ruby-lang.org/repos/ruby/tags/v1_8_6_111/ext/readline/ readline</pre> </div> <p>Apply <a href="http://pastie.textmate.org/168767">a small patch</a> to <code>readline/extconf.rb</code>:</p> <div class="highlight"><pre>curl http://pastie.textmate.org/pastes/168767/download | patch readline/extconf.rb</pre> </div> <p>Compile and install the extension. You likely need the <a href="http://developer.apple.com/tools/download/">OS X developer tools</a>, or have a C compiler from elsewhere:</p> <div class="highlight"><pre><span class="nb">cd </span>readline<br />ruby extconf.rb<br />make<br />sudo make install</pre> </div> <p>All döne. Håppy häcking.</p> <strong></strong>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3622801626169945037.post-63700065355885552692009-07-07T11:50:00.000-07:002009-07-09T04:27:36.306-07:00Используем Google maps Directions<%= button_to_function "как проехать", "window.open(\"http://maps.google.com/maps?saddr=#{URI.escape('москва нахимовский проспект 50')}&daddr=#{URI.escape('москва мичуринский проспект 10 ')}&hl=ru\")" %><br /><br /><br />+ смотри plugin <a href="http://github.com/mcdba/ym4r-gm/tree/master">ym4r-gm</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-46196082420071358742009-06-24T23:45:00.000-07:002009-09-03T02:07:27.401-07:00Обновляем Ruby on rails на Leopard 10.5.6в терминале проверяем что надо обновить из гемов<div><blockquote>gem outdate</blockquote></div><div>обновляем сам гем</div><div><blockquote>sudo gem update --system</blockquote></div><div><br /></div><div>ставим Xcode tools</div><div>и обновляем все гемы<br /></div><div><blockquote>sudo gem update</blockquote></div><div><br /></div><br />если нужно ставим mysql и соответственно ставим гем<blockquote>sudo env ARCHFLAG="=arch i386" gem install mysql --\--with-mysql-include=/usr/local/mysql/include \--with-mysql-lib=/usr/local/mysql/lib<br /></blockquote>для sqlite3<br /><blockquote>sudo env ARCHFLAGS="-arch i386" gem install sqlite3-ruby</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-14038594804373537632009-06-08T22:04:00.000-07:002009-06-08T22:06:50.717-07:00Менеждер обновлений в Ubuntu 9.04 и его раздражающее поведение<div class="snap_preview"><p style="text-align: justify;"><a href="http://ossru.wordpress.com/2009/06/07/%D0%BC%D0%B5%D0%BD%D0%B5%D0%B6%D0%B4%D0%B5%D1%80-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-ubuntu-9-04-%D0%B8-%D0%B5%D0%B3%D0%BE-%D1%80%D0%B0%D0%B7%D0%B4%D1%80%D0%B0%D0%B6/">отсюда взято</a><br /></p><p style="text-align: justify;">В прошлый раз мы остановились на том, что после установки системы сразу же появилось свернутое окно менеджера обновлений. Именно о его поведении и пойдёт речь в этой статье.</p> <p style="text-align: justify;">Не знаю из каких соображений, но способ уведомлений о доступных обновлениях системы в 9.04 был изменён. По-умолчанию, раз в неделю проверяются обновления, и если такие есть, то внезапно появляется окно со списком этих пакетов. Не знаю как вас, а меня это сильно раздражает.</p> <div id="attachment_436" class="wp-caption aligncenter" style="width: 430px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_002.png"><img class="size-full wp-image-436" title="Внезапно появляется окно со списком обновлений" src="http://ossru.files.wordpress.com/2009/06/screenshot_002.png?w=420&h=316" alt="Внезапно появляется окно со списком обновлений" width="420" height="316" /></a><p class="wp-caption-text">Внезапно появляется окно со списком обновлений</p></div> <p style="text-align: justify;">К счастью есть возможность вернуть способ уведомления об обновлениях так, как это происходило в 8.10 или 8.04 (на панели просто появлялся желтый значок, сообщающий об обновлениях программ).</p> <p style="text-align: justify;">Всё что для этого нужно, это программа <strong>Терминал</strong> и пару команд. Только не нужно пугаться и убегать. Это можно сделать и через графическую систему, но через Терминал намного быстрее.</p> <p style="text-align: justify;">Запускаем <strong>Терминал</strong>:</p> <div id="attachment_437" class="wp-caption aligncenter" style="width: 430px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_0031.png"><img class="size-full wp-image-437" title="Запускаем Терминал" src="http://ossru.files.wordpress.com/2009/06/screenshot_0031.png?w=420&h=338" alt="Запускаем Терминал" width="420" height="338" /></a><p class="wp-caption-text">Запускаем Терминал</p></div> <p style="text-align: justify;">Эта команда как раз и отключает внезапное появление окна со списком доступных обновлений (просто скопируйте эту команду в <strong>Терминал</strong> и нажмите <strong>Enter</strong>):</p> <pre style="text-align: left;"><strong>gconftool -s --type bool /apps/update-notifier/auto_launch false</strong></pre> <p style="text-align: justify;">На этом можно было бы и остановиться, но есть ещё парочка полезных опций, включать их или нет – решать Вам.</p> <p style="text-align: justify;">Следующая команда задаёт интервал проверки доступных обновлений. По-умолчанию он равен 7 дней, мы же поставим 1 день (просто скопируйте эту команду в <strong>Терминал</strong> и нажмите <strong>Enter</strong>):</p> <pre style="text-align: left;"><strong>gconftool -s --type int /apps/update-notifier/regular_auto_launch_interval 1</strong></pre> <p style="text-align: left;">И ещё одна полезная опция, которая будет отображать с какой и на какую версию будут обновлены пакеты (просто скопируйте эту команду в <strong>Терминал</strong> и нажмите <strong>Enter</strong>):</p> <pre style="text-align: left;"><strong>gconftool -s --type bool /apps/update-manager/show_versions true</strong></pre> <p style="text-align: justify;">У меня это выглядит так:</p> <div id="attachment_442" class="wp-caption aligncenter" style="width: 430px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_007.png"><img class="size-full wp-image-442" title="После ввода команд" src="http://ossru.files.wordpress.com/2009/06/screenshot_007.png?w=420&h=95" alt="После ввода команд" width="420" height="95" /></a><p class="wp-caption-text">После ввода команд</p></div> <p style="text-align: justify;">После чего можно закрыть Терминал и продолжить работу. Через некоторое время в панели задач появится значок, сообщающий о наличии уведомлений.</p> <p style="text-align: justify;">Для чистоты эксперимента я перезагружу Ubuntu (хотя это делать не обязательно, это не Windows).</p> <div id="attachment_449" class="wp-caption aligncenter" style="width: 275px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_0093.png"><img class="size-full wp-image-449" title="Перезагружаю компьютер" src="http://ossru.files.wordpress.com/2009/06/screenshot_0093.png?w=265&h=201" alt="Перезагружаю компьютер" width="265" height="201" /></a><p class="wp-caption-text">Перезагружаю компьютер</p></div> <p style="text-align: justify;">После загрузки системы и прошествии нескольких минут, на панели возле часов появился значок, показывающий о наличии обновлений. Никаких внезапно появляющихся окон. Что и требовалось показать:</p> <p style="text-align: justify;"><em>Значок – красный, а не жёлтый – т.к. имеются критические обновления системы</em></p> <div id="attachment_450" class="wp-caption aligncenter" style="width: 257px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_0101.png"><img class="size-full wp-image-450" title="Значок, уведомляющих об обновлениях" src="http://ossru.files.wordpress.com/2009/06/screenshot_0101.png?w=247&h=49" alt="Значок, уведомляющих об обновлениях" width="247" height="49" /></a><p class="wp-caption-text">Значок, уведомляющих об обновлениях</p></div> <p style="text-align: justify;">Если щелкнуть по этому значку левой кнопкой мыши, то появиться окно со списком доступных обновлений:</p> <div id="attachment_451" class="wp-caption aligncenter" style="width: 430px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_0121.png"><img class="size-full wp-image-451" title="Список доступных обновлений" src="http://ossru.files.wordpress.com/2009/06/screenshot_0121.png?w=420&h=314" alt="Список доступных обновлений" width="420" height="314" /></a><p class="wp-caption-text">Список доступных обновлений</p></div> <p style="text-align: justify;">Рассмотрим, например, пакет <strong>apport-gtk</strong>:</p> <div id="attachment_452" class="wp-caption aligncenter" style="width: 402px;"><a href="http://ossru.files.wordpress.com/2009/06/screenshot_0131.png"><img class="size-full wp-image-452" title="Пакет apport-gtk" src="http://ossru.files.wordpress.com/2009/06/screenshot_0131.png?w=392&h=62" alt="Пакет apport-gtk" width="392" height="62" /></a><p class="wp-caption-text">Пакет apport-gtk</p></div> <p style="text-align: justify;">Видите подпись под пакетом?:</p> <p style="text-align: left;"><strong>С версии … на … (Размер: …)</strong></p> <p style="text-align: justify;">Именно для отображения этой информации и вводилась последняя команда в терминале. Иногда эта информация бывает полезной.</p> <p style="text-align: justify;">Надеюсь эта статья будет полезной для вас. До встречи!</p> </div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-12156248219107397152009-05-29T01:25:00.000-07:002009-05-29T01:27:52.600-07:00Ruby → Настрой собственный VPS в течение обеденного перерыва!Перед погружением в технические аспекты системного администрирования,<br />обозначу несколько принципиальных вещей:<br />1) системное администрирование -- в 80% случаев -- тривиальные задачи,<br />ответ на которые ждут вас на первой странице поисковой системы<br />2) настройка удаленного сервера принципиально ничем не отличается от<br />конфигурирования рабочей станции. настраивать последюнюю приходится<br />каждому из нас, согласитесь -- занятие приятное и довольно простое<br />3) благодаря высокой популярности vps, вероятность того, что вы<br />окажетесь в тупике по любому вопросу -- ничтожна мала<br /><p>sudo apt-get -y install build-essential libssl-dev libreadline5-dev<br />zlib1g-dev vim wget curl<br />sudo apt-get -y install mysql-server libmysqlclient15-dev mysql-client<br /></p><p>adduser demo<br />visudo (demo ALL=(ALL) ALL)<br /></p><p>---SSH (local pc)------------<br />mkdir ~/.ssh<br />ssh-keygen -t rsa<br />scp ~/.ssh/id_rsa.pub d<a target="_parent" href="http://groups.google.com/groups/unlock?_done=/group/ror2ru/browse_thread/thread/cbf4f7bb095e3f43&msg=bf36516335dc76c6">...</a>@12.12.12.12:~<br /></p><p>---SSH (remote pc)-----------<br />mkdir /home/demo/.ssh<br />mv /home/demo/id_rsa.pub /home/demo/.ssh/authorized_keys<br />chown -R demo:demo /home/demo/.ssh<br />chmod 700 /home/demo/.ssh<br />chmod 600 /home/demo/.ssh/authorized_keys<br /></p><p>---locales-----------------------<br />sudo locale-gen en_GB.UTF-8<br />sudo /usr/sbin/update-locale LANG=en_GB.UTF-8<br /></p><p>---Ruby ----Passenger------------<br />mkdir ~/temp && cd ~/temp<br />wget rubyforge.org/frs/download.php/57097/ruby-<br />enterprise-1.8.6-20090520.tar.gz<br />tar xzvf ruby-enterprise-1.8.6-20090520.tar.gz<br />sudo ./ruby-enterprise-1.8.6-20090520/installer<br />export PATH=/opt/ruby-enterprise-1.8.6-20090520/bin:$PATH<br />sudo /opt/ruby_ee/bin/passenger-install-nginx-module<br /></p><p>---Nginx-------------------------<br />sudo useradd -s /sbin/nologin -r www-data<br />sudo usermod -a -G www-data demo<br /></p><p>mkdir ~/public_html<br />mkdir ~/public_html/01_project<br /></p><p>sudo su<br />chgrp -R www-data ~/public_html/<br />chmod -R 2750 ~/public_html/<br />mkdir /opt/nginx/sites-available<br />mkdir /opt/nginx/sites-enabled<br />wget railsgeek.com/vps/vhost01 -P /opt/nginx/sites-available<br />ln -s /opt/nginx/sites-available/vhost01 /opt/nginx/sites-enabled<br />wget railsgeek.com/vps/nginx.conf -P /opt/nginx/conf<br />wget railsgeek.com/vps/nginx -P /etc/init.d<br />chmod +x /etc/init.d/nginx<br />/etc/init.d/nginx start<br /></p>пояснения и комментарии на хабре<br /><a target="_blank" rel="nofollow" href="http://habrahabr.ru/blogs/ruby/60676/">http://habrahabr.ru/blogs/ruby/60676/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-7082555714484729232009-03-10T10:36:00.000-07:002009-03-10T10:37:43.131-07:00Как вызывать openOffice из vbahttp://www.google.ru/url?sa=t&source=web&ct=res&cd=5&url=http%3A%2F%2Fdocumentation.openoffice.org%2FHOW_TO%2Fvarious_topics%2FVbaStarBasicXref.pdf&ei=w6K2SbrFLdiS_gaWxKW3Cw&usg=AFQjCNE85vEjxVyXU4ppgx2NDvYqd4kmeA&sig2=1sd8qqOOEwBGocr_rnMixwUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3622801626169945037.post-38599886019817939092009-02-09T09:49:00.000-08:002009-02-09T09:50:54.419-08:00установка ruby on Rails в Ubuntu 8.10<pre><br /><blockquote># General/Pre-requisite packages<br />aptitude install \<br /> build-essential \<br /> screen \<br /> subversion \<br /> mysql-client \<br /> telnet \<br /> meld \<br /> vim \<br /> vim-gnome \<br /> exuberant-ctags \<br /> tk8.5 \<br /> apache2-prefork-dev \<br /> rcov<br /><br /># mysql server<br /># use apt-get to avoid installing exim4<br />DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes \<br /> mysql-server mysql-client \<br /> libmysqlclient15-dev libmysql-ruby1.8<br /><br /><br /># git<br />mkdir gitcore<br />cd gitcore<br />wget http://kernel.org/pub/software/scm/git/git-1.6.0.3.tar.gz<br />apt-get build-dep git-core --assume-yes<br />tar xzvf git-1.6.0.3.tar.gz<br />cd git-1.6.0.3/<br />./configure<br />make<br />make install<br />cd<br /><br /># Ruby<br />aptitude --assume-yes install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 \<br /> irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby<br />ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby;<br />ln -s /usr/bin/ri1.8 /usr/local/bin/ri;<br />ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc;<br />ln -s /usr/bin/irb1.8 /usr/local/bin/irb;<br />ln -s /usr/local/bin/ruby /usr/bin/ruby<br /><br /># Rubygems. You REALLY don't want to let aptitude install rubygems.<br />wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz<br />cd rubygems-1.3.1<br />ruby setup.rb<br />ln -s /usr/bin/gem1.8 /usr/bin/gem<br />for g in rails rake capistrano capistrano-ext hpricot treetop ruby-debug term-ansicolor mongrel cheat passenger annotate-models rak; do gem install $g; done</blockquote><br /></pre>Unknownnoreply@blogger.com0