Creating a Rails admin panel from scratch, part 1: The dashboard
Генерация (скаффолдинг) админки в Ruby on Rails
четверг, 25 декабря 2014 г.
среда, 24 декабря 2014 г.
GIT. Commits. Branches
git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/thedobriy/my_cat_1.git
git push -u origin master
heroku create
git push heroku master
heroku run rake db:migrate
git co -b static-pages - создание ветки
rails g controller StaticPages --no-test-framework
git add .
git commit -m "Finish static pages"
git co master
git merge static-pages
git push
git push heroku
heroku run rake db:migrate
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/thedobriy/my_cat_1.git
git push -u origin master
heroku create
git push heroku master
heroku run rake db:migrate
git co -b static-pages - создание ветки
rails g controller StaticPages --no-test-framework
git add .
git commit -m "Finish static pages"
git co master
git merge static-pages
git push
git push heroku
heroku run rake db:migrate
понедельник, 22 декабря 2014 г.
Installing VIM
Source: http://smileart.in.ua/vim-101
$ vim --version | grep ruby
$ apt-cache search vim | grep vim-
$ sudo apt-get install vim-rails
$ sudo apt-get install exuberant-ctags
wget --no-check-certificate https://github.com/joshfng/railsready/raw/master/railsready.sh
&& bash railsready.sh
Дальше все делаем по инструкции от самого akitaonrails. Я буду следовать только ее Linux части, ведь ставлю все это, как уже говорил, под управлением Ubuntu. Практически то же актуально и для MacOS X. Владельцы других ОС могут сами подсмотреть в README.textile, что и как им делать.
Клонируем репозиторий в ту самую папку vim:
$ git clone git://github.com/akitaonrails/vimfiles.git ~/.vim
Далее переходим в нее и запускаем инициализацию/обновление модулей:
$ git submodule update --init
Теперь создаем файлик .vimrc, в который прописываем где у нас лежит .vimrc с настройками akita
$ echo "source ~/.vim/vimrc" > ~/.vimrc
Если вы планируете использовать gvim (графический вариант vim с меню и прочими понтами), то вам стоит создать и .gvimrc
echo "source ~/.vim/gvimrc" > ~/.gvimrc
$ vim --version | grep ruby
$ apt-cache search vim | grep vim-
$ sudo apt-get install vim-rails
$ sudo apt-get install exuberant-ctags
wget --no-check-certificate https://github.com/joshfng/railsready/raw/master/railsready.sh
&& bash railsready.sh
Дальше все делаем по инструкции от самого akitaonrails. Я буду следовать только ее Linux части, ведь ставлю все это, как уже говорил, под управлением Ubuntu. Практически то же актуально и для MacOS X. Владельцы других ОС могут сами подсмотреть в README.textile, что и как им делать.
Клонируем репозиторий в ту самую папку vim:
$ git clone git://github.com/akitaonrails/vimfiles.git ~/.vim
Далее переходим в нее и запускаем инициализацию/обновление модулей:
$ git submodule update --init
Теперь создаем файлик .vimrc, в который прописываем где у нас лежит .vimrc с настройками akita
$ echo "source ~/.vim/vimrc" > ~/.vimrc
Если вы планируете использовать gvim (графический вариант vim с меню и прочими понтами), то вам стоит создать и .gvimrc
echo "source ~/.vim/gvimrc" > ~/.gvimrc
четверг, 18 декабря 2014 г.
Ruby on Rails, мультиязычность
Добавить в Gemfile строчку
gem 'i18n'
(выполнить bundle install)
в config/application.rb раскомментировать строки и выбрать нужный язык:
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ru
в config/locales/en.yml прописать соответствия ключ-значение для нужных языков, например:
en:
admin_title: "Admin Panel"
user_created: "succesfully created."
.....
ru:
admin_title: "Панель администрирования"
.....
использовать можно с помощью хелпера t(:key) в контроллерах:
flash[:notice] = "#{@user.login} #{t :user_created}"
и view (haml):
%title= t :admin_title
Guide
gem 'i18n'
(выполнить bundle install)
в config/application.rb раскомментировать строки и выбрать нужный язык:
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ru
в config/locales/en.yml прописать соответствия ключ-значение для нужных языков, например:
en:
admin_title: "Admin Panel"
user_created: "succesfully created."
.....
ru:
admin_title: "Панель администрирования"
.....
использовать можно с помощью хелпера t(:key) в контроллерах:
flash[:notice] = "#{@user.login} #{t :user_created}"
и view (haml):
%title= t :admin_title
Guide
VIM keys
o to open a line BELOW the cursor and start Insert mode.
O to open a line ABOVE the cursor.
a to insert text AFTER the cursor.
A to insert text after the end of the line.
e command moves to the end of a word.
y operator yanks (copies) text, p puts (pastes) it.
R enters Replace mode until <ESC> is pressed.
Typing ":set xxx" sets the option "xxx". Some options are:
'ic' 'ignorecase' ignore upper/lower case when searching
'is' 'incsearch' show partial matches for a search phrase
'hls' 'hlsearch' highlight all matching phrases
O to open a line ABOVE the cursor.
a to insert text AFTER the cursor.
A to insert text after the end of the line.
e command moves to the end of a word.
y operator yanks (copies) text, p puts (pastes) it.
R enters Replace mode until <ESC> is pressed.
Typing ":set xxx" sets the option "xxx". Some options are:
'ic' 'ignorecase' ignore upper/lower case when searching
'is' 'incsearch' show partial matches for a search phrase
'hls' 'hlsearch' highlight all matching phrases
пятница, 12 декабря 2014 г.
Installing SQLiteBrowser
How to install SQLiteBrowser?
1) $ git clone https://github.com/sqlitebrowser/sqlitebrowser.git
2) $ qmake
3) $ make
1) $ git clone https://github.com/sqlitebrowser/sqlitebrowser.git
2) $ qmake
3) $ make
воскресенье, 14 сентября 2014 г.
Байты для 4хразрядного семисегментника
Для анодного дисплея:
первая цифра: 11000111 (читаем справа налево) = 0xE3;
вторая цифра: 10100111 = 0xE5;
третья цифра: 10010111 = 0xE9;
четвертая цифра: 10001111 = 0xF1.
Для катодного дисплея:
первая цифра: 00111000 (читаем справа налево) = 0x1C;
вторая цифра: 01011000 = 0x1A;
третья цифра: 01101000 = 0x16;
четвертая цифра: 01110000 = 0x0E.
static uint8_t digit[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
static uint8_t pos[4]= {0x1C,0x1A,0x16,0x0E};
первая цифра: 11000111 (читаем справа налево) = 0xE3;
вторая цифра: 10100111 = 0xE5;
третья цифра: 10010111 = 0xE9;
четвертая цифра: 10001111 = 0xF1.
static uint8_t pos[4]= {0xE3,0xE5,0xE9,0xF1};
static uint8_t digit[11] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
Для катодного дисплея:
первая цифра: 00111000 (читаем справа налево) = 0x1C;
вторая цифра: 01011000 = 0x1A;
третья цифра: 01101000 = 0x16;
четвертая цифра: 01110000 = 0x0E.
static uint8_t digit[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
static uint8_t pos[4]= {0x1C,0x1A,0x16,0x0E};
Arduino - скетч обратного отсчета
Скетч таймера от 0 до 9 со сдвиговым регистром и семисегментником
#include <SPI.h> //подключаем библиотеку SPI
enum { digitPin = 9 }; //выбираем линию SS регистра на 9-м пине Arduino
unsigned long timer=0, digitTimerPrev=0;
int i=0, j=0;
void setup(){
SPI.begin(); //инициализируем SPI
//переводим выбранный для передачи пин в режим вывода
pinMode(digitPin, OUTPUT);
}
void loop(){
//Заполняем массив байтами, которые будем передавать
static uint8_t digit[16] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//передаем по два байта из массива и защелкиваем регистры
timer=millis();
if (timer-digitTimerPrev>1000){
digitalWrite(digitPin, LOW);
SPI.transfer(digit[i]);
digitalWrite(digitPin, HIGH);
i<9 ? i++ : i=0;
digitTimerPrev=timer;
}
}
суббота, 13 сентября 2014 г.
Arduino + 7-мисегментные индикатор с общим катодом + сдвиговый регистр
Схема подключения как здесь: http://greenoakst.blogspot.com/2011/11/arduino-7-spi.html.
Единственное, но COM семисегментника подаем землю а не плюс.
Скетч будет для 7-мисегментные индикатор с общим катодом такой:
#include <SPI.h> // подключаем библиотеку SPI
enum { reg = 8 }; // провод CS подсоединяем к 8-му пину Arduino
void setup()
{
SPI.begin(); // инициализируем SPI
pinMode(reg, OUTPUT); // настраиваем 8-й пин как выход
}
void loop()
{
// храним в массиве все цифры
static uint8_t digit[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
// выводим цифры по одной
for (int i=0;i<16;i++){
digitalWrite(reg, LOW); // притягиваем CS к земле - начало передачи
SPI.transfer(digit[i]); // передаем байт
digitalWrite(reg, HIGH); // отпускаем CS - конец передачи
delay(1000); // ждем секунду
}
//очистим дисплей на секунду
digitalWrite(reg, LOW);
SPI.transfer(0xFF);
digitalWrite(reg, HIGH);
delay(1000);
}
Единственное, но COM семисегментника подаем землю а не плюс.
Скетч будет для 7-мисегментные индикатор с общим катодом такой:
#include <SPI.h> // подключаем библиотеку SPI
enum { reg = 8 }; // провод CS подсоединяем к 8-му пину Arduino
void setup()
{
SPI.begin(); // инициализируем SPI
pinMode(reg, OUTPUT); // настраиваем 8-й пин как выход
}
void loop()
{
// храним в массиве все цифры
static uint8_t digit[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
// выводим цифры по одной
for (int i=0;i<16;i++){
digitalWrite(reg, LOW); // притягиваем CS к земле - начало передачи
SPI.transfer(digit[i]); // передаем байт
digitalWrite(reg, HIGH); // отпускаем CS - конец передачи
delay(1000); // ждем секунду
}
//очистим дисплей на секунду
digitalWrite(reg, LOW);
SPI.transfer(0xFF);
digitalWrite(reg, HIGH);
delay(1000);
}
SPI и Ардуино
Схема:
MOSI (Master Out Slave In) или просто SI – передача данных от ведущего к ведомому.
MISO (Master In Slave Out) или просто SO – передача данных от ведомого к ведущему.
CS (Chip Select) или SS (Slave Select) – выбор ведомого устройства.
SCLK (Serial CLocK) или просто SCK – передача тактового сигнала от ведущего к ведомому.
MOSI (Master Out Slave In) или просто SI – передача данных от ведущего к ведомому.
MISO (Master In Slave Out) или просто SO – передача данных от ведомого к ведущему.
CS (Chip Select) или SS (Slave Select) – выбор ведомого устройства.
SCLK (Serial CLocK) или просто SCK – передача тактового сигнала от ведущего к ведомому.
пятница, 12 сентября 2014 г.
Ардуино + сдвиговый регистр
Отличное пособие для начинания тут: http://arduino.ru/Tutorial/registr_74HC595
VCC – питание;
GND – земля;
DS – последовательный ввод. Должен подключаться к проводу MOSI шины SPI;
Q0-Q7 – параллельные выходы;
SHCP – тактовый вход. Должен подключаться к проводу SCK шины SPI;
STCP – защелкивание выводов. Должен подключаться к проводу CS шины SPI;
OE – разрешение работы выходов. При низком уровне выходы работают;
Q7S – последовательный вывод;
MR – общий сброс. Если притянуть его к земле – входы обнулятся.
Скетч для двух регистров 74HC595 и семисегментным 4хразрядным дисплеем с общим катодом:
GND – земля;
DS – последовательный ввод. Должен подключаться к проводу MOSI шины SPI;
Q0-Q7 – параллельные выходы;
SHCP – тактовый вход. Должен подключаться к проводу SCK шины SPI;
STCP – защелкивание выводов. Должен подключаться к проводу CS шины SPI;
OE – разрешение работы выходов. При низком уровне выходы работают;
Q7S – последовательный вывод;
MR – общий сброс. Если притянуть его к земле – входы обнулятся.
Скетч для двух регистров 74HC595 и семисегментным 4хразрядным дисплеем с общим катодом:
// подключаем библиотеку SPI#include <SPI.h>// провод CS подсоединяем к 8-му пину Arduinoenum { reg = 8 };void setup(){Serial.begin(9600);Serial.println("Started");// инициализируем SPISPI.begin();Serial.println("SPI");// настраиваем 8-й пин как выходpinMode(reg, OUTPUT);}// храним в массиве все цифрыstatic uint8_t digit[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};void loop(){for (int i=0;i<11;i++){// притягиваем CS к земле - начало передачиSerial.println(digit[i]);digitalWrite(reg, LOW);// передаем катодный байтSPI.transfer(digit[i]);// передаем анодный байтSPI.transfer(0xFF);// отпускаем CS - конец передачиdigitalWrite(reg, HIGH);// ждем секундуdelay(1000);}}
пятница, 16 мая 2014 г.
Как нарисовать 7 перпендикулярных линий красного цвета, 2 из которых зелёные и 2 прозрачные?
Петров пришел во вторник на совещание. Ему там вынули мозг, разложили по блюдечкам и стали есть, причмокивая и вообще выражая всяческое одобрение. Начальник Петрова, Недозайцев, предусмотрительно раздал присутствующим десертные ложечки. И началось.
— Коллеги, — говорит Морковьева, — перед нашей организацией встала масштабная задача. Нам поступил на реализацию проект, в рамках которого нам требуется изобразить несколько красных линий. Вы готовы взвалить на себя эту задачу?
— Конечно, — говорит Недозайцев. Он директор, и всегда готов взвалить на себя проблему, которую придется нести кому-то из коллектива. Впрочем, он тут же уточняет: — Мы же это можем?
— Коллеги, — говорит Морковьева, — перед нашей организацией встала масштабная задача. Нам поступил на реализацию проект, в рамках которого нам требуется изобразить несколько красных линий. Вы готовы взвалить на себя эту задачу?
— Конечно, — говорит Недозайцев. Он директор, и всегда готов взвалить на себя проблему, которую придется нести кому-то из коллектива. Впрочем, он тут же уточняет: — Мы же это можем?
четверг, 24 апреля 2014 г.
Модуль для первой прописной буквы в каждом слове.
Недавно попался на глаза вот такой модуль-хелпер:
module StoreHelper
def capitalize_words(string)
string.split(' ').map {|word| word.capitalize}.join(' ')
end
end
По идее он преобразует каждое слово в переменной с помощью .capitalize. Как доберусь до тачанки - проверю.
module StoreHelper
def capitalize_words(string)
string.split(' ').map {|word| word.capitalize}.join(' ')
end
end
По идее он преобразует каждое слово в переменной с помощью .capitalize. Как доберусь до тачанки - проверю.
четверг, 17 апреля 2014 г.
link_to + tags
We could use html tags inside link_to with constructions like this:
<%= link_to companies_path, class: "dropdown-toggle", data: { toggle: "dropdown" } do %>
Link_Name <b class="caret"></b>
<% end %>
<%= link_to companies_path, class: "dropdown-toggle", data: { toggle: "dropdown" } do %>
Link_Name <b class="caret"></b>
<% end %>
Custom badges for Bootstrap 3
My CSS code is:
.badge {
padding: 1px 9px 2px;
font-size: 12.025px;
font-weight: bold;
white-space: nowrap;
color: #ffffff;
background-color: #007700;
-webkit-border-radius: 9px;
-moz-border-radius: 9px;
border-radius: 9px;
}
.badge {
padding: 1px 9px 2px;
font-size: 12.025px;
font-weight: bold;
white-space: nowrap;
color: #ffffff;
background-color: #007700;
-webkit-border-radius: 9px;
-moz-border-radius: 9px;
border-radius: 9px;
}
breadcrumbs_on_rails или Хлебные крошки
Не мог долго разобраться как добавлять в путь для "хлебных крошек" динамический контент (например, город). Итак у меня заработало следующее:
@city = City.find(params[:city_id])
add_breadcrumb "#{@city.name}", "#{@city.id}"
А реально помог мне этот материал: Easy and flexible breadcrumbs for Rails
@city = City.find(params[:city_id])
add_breadcrumb "#{@city.name}", "#{@city.id}"
А реально помог мне этот материал: Easy and flexible breadcrumbs for Rails
четверг, 3 апреля 2014 г.
Управление версиями GIT
Отличный учебник для начинающих - http://githowto.com/ru
git config --global alias.co checkout - создание алиасов
Для отката изменений (которые Вы не успели закомментировать):
1) git checkout master
2) git status
3) git checkout <file>
4) git status
git config --global alias.co checkout - создание алиасов
Для отката изменений (которые Вы не успели закомментировать):
1) git checkout master
2) git status
3) git checkout <file>
4) git status
пятница, 28 марта 2014 г.
Партиал выводящий ошибки заполнения форм
Для универсальности партиала ошибок, кму надо передавать объект, например вот так:
<%= render 'shared/error_messages', :object => @user %>
А сам партиал error_messages
тогда выглядит так: <% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
среда, 26 марта 2014 г.
VIM - сочетания клавиш
Команды для перемещения по тексту:
|, 0, home — в начало строки;
^ — на первый непустой символ в строке;
$, end — в конец строки.
m — на половину ширины экрана;
g — на нижнюю строку;
e — до конца слова;
- — на строку вверх и на первый не пустой символ;
+, Enter — на строку вниз и на первый не пустой символ;
G — на последнюю строку;
H — на первую строку экрана;
M — на среднюю строку экрана;
L — на последнюю строку экрана;
w — на слово вперед;
b — на слово назад;
( — на предложение назад (до точки);
) — на предложение вперед (до точки);
{ — на абзац назад (до пустой строки);
} — на абзац вперед (до пустой строки);
:ju — список переходов.
Редактирование текста:
Del, x - удаление символа под курсором;
X - удаление символа перед курсором;
u, :u — отмена последнего действия;
U — отменить все изменения, повлиявшие на текущую строку;
~ — перевести в верхний или нижний регистр в зависимости от текущего символа под курсором;
C — удалить от курсора и до конца строки с переходом в режим ввода;
D — удалить от текущего символа до конца строки;
dd — вырезать строку, на которой стоит курсор. Перед любой командой можно ввести числовой модификатор, который укажет сколько раз выполнить команду. Например: 3dd - удалит три строки начиная с текущей;
yy — копирует строку. Также можно использовать числовой модификатор;
p — вставить после текущей строки;
P — вставить перед текущей строкой;
<< — сдвиг влево текущей строки;
>> — сдвиг вправо текущей строки;
J — объединение текущей строки с последующей.
Удобный список команд: http://beget.ru/art_vim
|, 0, home — в начало строки;
^ — на первый непустой символ в строке;
$, end — в конец строки.
m — на половину ширины экрана;
g — на нижнюю строку;
e — до конца слова;
- — на строку вверх и на первый не пустой символ;
+, Enter — на строку вниз и на первый не пустой символ;
G — на последнюю строку;
H — на первую строку экрана;
M — на среднюю строку экрана;
L — на последнюю строку экрана;
w — на слово вперед;
b — на слово назад;
( — на предложение назад (до точки);
) — на предложение вперед (до точки);
{ — на абзац назад (до пустой строки);
} — на абзац вперед (до пустой строки);
:ju — список переходов.
Редактирование текста:
Del, x - удаление символа под курсором;
X - удаление символа перед курсором;
u, :u — отмена последнего действия;
U — отменить все изменения, повлиявшие на текущую строку;
~ — перевести в верхний или нижний регистр в зависимости от текущего символа под курсором;
C — удалить от курсора и до конца строки с переходом в режим ввода;
D — удалить от текущего символа до конца строки;
dd — вырезать строку, на которой стоит курсор. Перед любой командой можно ввести числовой модификатор, который укажет сколько раз выполнить команду. Например: 3dd - удалит три строки начиная с текущей;
yy — копирует строку. Также можно использовать числовой модификатор;
p — вставить после текущей строки;
P — вставить перед текущей строкой;
<< — сдвиг влево текущей строки;
>> — сдвиг вправо текущей строки;
J — объединение текущей строки с последующей.
Удобный список команд: http://beget.ru/art_vim
четверг, 20 марта 2014 г.
Добавление отладочной информации к шаблону сайта
Добавление отладочной информации к шаблону сайта.
<%= debug(params) if Rails.env.development? %>
Приглашение в командной строке в терминале Ubuntu
Моя строка :
PS1="\[\033[1;33;1;34m\]\u@:\[\033[0;32m\]\W> \[\033[0m\]\[\033[0m\]"
Приглашение в командной среде bash изменяется при помощи изменения переменных PS1, PS2, PS3, PS4 и PROMPT_COMMAND.
PS1="\[\033[1;33;1;34m\]\u@:\[\033[0;32m\]\W> \[\033[0m\]\[\033[0m\]"
Приглашение в командной среде bash изменяется при помощи изменения переменных PS1, PS2, PS3, PS4 и PROMPT_COMMAND.
- PS1 - переменная, которая
задает вид строки приглашения командной строки, которое bash выводит,
когда ожидает ввода очередной команды пользователем. - PS2 - переменная, отвечающая за вторичный тип приглашения ввода.
- PS3 - третичное приглашение, выводится тогда, когда пользователь должен сделать выбор в операторе select.
- PS4 - приглашение
четвертого уровня, выводится при отладки сценариев (скриптов) в начале
каждой строки перед командой перед исполняющейся командой. - PROMPT_COMMAND - содержимое этой переменной выполняется перед каждой строкой приглашения.
Подписаться на:
Сообщения (Atom)