tag:blogger.com,1999:blog-24093638806807820062024-03-13T10:33:34.230+05:00Web 2.0 Site - Website Builder for DevelopersUnknownnoreply@blogger.comBlogger95125tag:blogger.com,1999:blog-2409363880680782006.post-12143479629538754952017-12-19T10:42:00.000+05:002018-12-08T13:56:37.792+05:00.NET App: Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration informationПервое что нужно сделать - это проверить файл <span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;">App.config</span></span> на наличие следующей секции:<br />
<pre><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
</pre>
Если она есть, то нужно проверить копируется ли <span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;">App.config</span></span> в директорию с exe-шником программы. Нужно искать следующий файл:<span style="font-family: "courier new" , "courier" , monospace;"> </span><span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;">your-app-name.exe.config</span></span><span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;"><yourappname></yourappname></span></span>. В моем случае его не было. Открываем файл проекта <span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;">*.csproj</span></span> тесктовым редактором и ищем в нем блок в котором подключен файл <span style="background-color: #eeeeee;"><span style="font-family: "courier new" , "courier" , monospace;">App.config</span></span>. В моем случае Visual Studio его исковеркала до такого вида:
<pre>
<EmbeddedResource Include="App.config">
<SubType>Designer</SubType>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
</pre>
и по-этому он не копировался. Я вернул блоку корректный вид (ниже) и все заработало:
<pre>
<None Include="App.config" />
</pre>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2409363880680782006.post-48205124052915034292017-07-06T01:01:00.001+05:002017-07-06T01:01:35.276+05:00ElasticSearch: move data to another directoryhttps://discuss.elastic.co/t/how-to-move-data-and-logs-to-new-directory/28382/2Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-23305299789991336102017-05-05T10:46:00.001+05:002017-05-05T10:46:52.797+05:00CSS: Font weights<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">100</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Thin (Hairline)</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">200</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Extra Light (Ultra Light)</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">300</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Light</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">400</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Normal</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">500</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Medium</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">600</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Semi Bold (Demi Bold)</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">700</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Bold</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">800</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Extra Bold (Ultra Bold)</dd>
<dt style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; font-weight: 700; margin: 0px; padding: 0px;"><code style="border: 0px; font-family: consolas, "Liberation Mono", courier, monospace; font-style: inherit; font-weight: inherit; margin: 0px; padding: 0px; word-wrap: break-word;">900</code></dt>
<dd style="background-color: white; border: 0px; color: #3b3c40; font-family: "Open Sans", arial, sans-serif; font-size: 14px; margin: 0px 0px 24px; padding: 0px 0px 0px 20px;">Black (Heavy)</dd>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-44726241443625388952017-03-14T17:24:00.001+05:002017-03-14T17:24:49.453+05:00Ubuntu: Install Oracle Java 8https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-58105113284495942242017-02-04T21:39:00.002+05:002018-12-08T13:59:05.043+05:00Ubuntu Live: Restore partitions<p>
Download and install <b>gpart</b>:<br />
<pre style="white-space: pre-line;">
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gpart/gpart_0.3-3_amd64.deb
sudo dpkg -i gpart_0.3-3_amd64.deb
sudo apt-get install -f
</pre>
View partition table on the drive:<br />
<pre>
sudo fdisk -l /dev/sda
</pre>
If OK, write partition table to the drive:<br />
<pre>
sudo gpart -W /dev/sda /dev/sda
</pre>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-29191009083097440202016-12-24T20:47:00.001+05:002016-12-24T20:49:29.246+05:00Bitbucket: использование нескольких ssh ключей на одном компе<ul>
<li><a href="http://denguk.tumblr.com/post/143309759972/generate-ssh-key">Генерируем новый ssh ключ</a> (при этом указать имя не id_rsa, а например <b>work</b>)</li>
<li>Создаем файл конфигурации <b>~/.ssh/config</b> и добавляем в него:
<pre>
Host work
HostName bitbucket.org
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/work
</pre>
</li>
<li>Клонируем или добавляем в remote с использованием домена <b>work</b> вместо <b>bitbucket.org</b>. Например:
<pre>
git clone git@work:fiftin/winformspopupalerts.git
</pre>
</li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-60464332220276740082016-12-17T13:28:00.002+05:002016-12-24T20:33:10.333+05:00Ubuntu: как перопределить кнопку на клавиатуреКупил для работы компактную клавиатуру Logitech Keyboard K230, а у неё кнопка Enter очень неудобная — в неё хрен попадешь.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpIcXZnA7hPR2NPAZO1m3Xf-n8C78W31X5MrJl1vVhKKV3ILojq-nBtOgYzIG8ZU8Y66zdvOSW-xu7ebuCm2xdjglSFTIplJc9V23QxjlzhE1aX4z3DgnNlw_7KwxJNS2oGc7WNf20CiA/s1600/maxresdefault.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpIcXZnA7hPR2NPAZO1m3Xf-n8C78W31X5MrJl1vVhKKV3ILojq-nBtOgYzIG8ZU8Y66zdvOSW-xu7ebuCm2xdjglSFTIplJc9V23QxjlzhE1aX4z3DgnNlw_7KwxJNS2oGc7WNf20CiA/s1600/maxresdefault.jpg" width="500" /></a></div>
<br />
Вначале я выковырял кнопку радом с Enter'ом потому что постоянно тыкал в нее:
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC3bJm5RyLzuyIF9sbXJ6XIvYJw6yE_dQ29d_aSY_0ChwX4W_FzlUfkPWvWFIDhBeJxfa030iXf_pUSNSyIzjTYvC5bAFuLkquMjppr6pHo93EAmffPdwzgKPcjiCCjfObn_F6o2wJZms/s1600/IMG_20161217_130922.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC3bJm5RyLzuyIF9sbXJ6XIvYJw6yE_dQ29d_aSY_0ChwX4W_FzlUfkPWvWFIDhBeJxfa030iXf_pUSNSyIzjTYvC5bAFuLkquMjppr6pHo93EAmffPdwzgKPcjiCCjfObn_F6o2wJZms/s400/IMG_20161217_130922.jpg" width="300" height="400" /></a></div>
<br />
Стало лучше - тепепь я не втыкал / вместо Enter, но и Enter тоже. По-этому я решил поискать как переопределить кнопку <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBlKHhGI4nyKYXmoD0RdOzNzvLTekxu3ys7WZxClAIzCieMrTUTV4RnaE_e8OoEbfObHGLxErudlPLkoGvx6ffFDKNLl5U4eTJM4m3F9jxOkmabiXt6oo1ypwEpBQIB0zi_be8a2wGb-Y/s200/IMG_20161217_130850.jpg" width="30" style="padding: 0; margin-bottom: -15px" /> на Enter. И вот что я нашел <a href="http://askubuntu.com/a/24930">тут</a>:
<br />
<ul>
<li>Устанавливать ничего не нужно.</li>
<li>В терминале запускаем утилиту xev и жмем кнопку, которую хотим переопределить. В выводе программы ищем "Keycode" и запоминаем. В моем случае это 51.</li>
<li>Выполняем в терминале следующую команду:
<pre>
xmodmap -e "keycode 51 = Return"
</pre>
</li>
</ul>
Все. Терерь по при нажатии на <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBlKHhGI4nyKYXmoD0RdOzNzvLTekxu3ys7WZxClAIzCieMrTUTV4RnaE_e8OoEbfObHGLxErudlPLkoGvx6ffFDKNLl5U4eTJM4m3F9jxOkmabiXt6oo1ypwEpBQIB0zi_be8a2wGb-Y/s200/IMG_20161217_130850.jpg" width="30" style="padding: 0; margin-bottom: -15px" /> будет вводиться Enter. Можно её добависть в .profile чтоб выполнялась при открытии сеанса.
<hr />
<a href="http://wiki.linuxquestions.org/wiki/List_of_Keysyms_Recognised_by_Xmodmap">Список символов Xmodmap</a>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2409363880680782006.post-77444984003795230632016-04-07T13:16:00.002+05:002016-12-17T13:40:40.836+05:00Где хранить видео и фотографии, если их много<p>
Я не люблю удалять фотографии. Потому что сложно оценить насколько та или иная фотография окажется интересной через 10 лет. По-этому у меня очень много фотографий.
</p><p>
И я боюсь их потерять. И чем больше фотографий становится тем больше я боюсь. Я использовал платный аккаунт на Flickr, покупал пространство на Google Drive и OneDrive. И везде меня одолевала ощущение что мои фотографии может кто-то увидеть кроме меня. Почему? Да потому что Flickr создан чтобы делиться фотографиями, Google Drive и OneDrive использует общий аккаунт Google и Microsoft под которым я залогинен и на работе и на телефоне, возможно где-то еще. А я хочу чтобы мои фотографии были надежно спрятаны, как бумажные фотографии в ящике. А не чтобы они светились у меня и у того кто стоит рядом перед глазами когда я захожу в аккаунт Google или Microsoft. Я не хочу чтобы Google делал коллаж из моих фотографий. Чтобы Windows делал из них слайд шоу на начальном экране.
<cut />
</p><p>
По-этому у меня не получалось долго хранить фотографии в облачных хранилищах. В конце концов я удалял фотографии и хранил их только у себя на компьютере.
</p><p>
Возможно это паранойя, но я не могу от нее избавиться.
</p><p>
А потом я узнал про <a href="http://aws.amazon.com/ru/glacier">Amazon Glacier</a>. Я понял, это то что я так долго искал: нет web-интерфейса, нет кнопки Поделиться. Что там, чтобы скачать фото или увидеть список файлов нужно ждать 4 часа. Amazon выстроил кучу преград для использования этого сервиса обычными пользователями. Для кого-то это покажется ужасно, но для меня это было то что нужно.
</p><p>
И всего <a href="https://aws.amazon.com/ru/glacier/pricing/">$0.004</a> за Гб. Это дешевле любого облачного хранилища которое я знаю (Google Photos и Flickr не в счет). Вы можете сказать что Google Drive стоит всего $9.99 за 1Тб, а на Glacier это будет $7, не на много дешевле (а с учётом платного трафика еще и дороже). Но если построить график, то преимущество Glacier становится более очевидным (горизонтальная шкала взята по экспоненте для наглядности).
</p><p>
<img src="https://habrastorage.org/files/257/8a4/a64/2578a4a64d36498588920134688d889f.png" width="95%" />
Этот график вызывет ощущение что Google нас где-то пывается обмануть.
<br><br>
<img src="https://habrastorage.org/files/b76/023/6dc/b760236dca354464940815fb6c17845d.png" width="95%" />
<br>
А этот график говорит, что если данные занимают больше 15Гб, намного выгоднее хранить их в Amazon Glacier. Если усреднить цену 1Гб для Google Drive, то получится около 4 центов за Гб против 0.7 цента на Amazon Glacier.
<br><br>
Итак, узнав про Amazon Glacier я начал искать программу-клиент для него, так как сервис предоставляет только API. Из существующих я нашел только Fast Glacier с ограниченной бесплатной версией. Классная программа. Но не то что мне было нужно.
</p><p>
Тогда я начал писать свой клиент.
</p><p>
Я задумывал программу которая сможет синхронизировать фотографии на различных хранилищах (я остановился на Google Drive и локальном диске) и бекапить их в Amazon Glacier.
</p><p>
Итак:
<ul>
<li>Я хотел иметь возможность выбрать интересные фотографии на диске и отправить их на Google Drive чтобы они были под рукой когда я захочу их пересмотреть или поделиться с кем-нибудь.</li>
<li>Также я хотел чтобы фотографии оставались у меня на компьютере.</li>
<li>Чтобы все это синхронизировалось с Amazon Glacier в том числе фотографии с телефона сохраненные на Google Drive.</li>
<li>И чтобы все это делалось из одной программы.</li>
</ul>
<p>
Я сделал такую программу (ну почти такую) и назвал её <a href="http://fiftin.github.io/oblqo/">Oblqo</a>. Исходники программы доступны на <a href="https://github.com/fiftin/oblqo">github</a>.
</p><p>
Сейчас её использую наверное только я. По ходу использования я добавляю в нее фичи в которых у меня появляется необходимость: поддержка нескольких Google аккаунтов, сохранение уменьшенной копии фотографии и др.
</p><p>
Надеюсь что статья будет полезна и возможно подтолкнет кого-то к использованию Amazon Glacier который на мой взгляд необоснованно обходят стороной.
</p><p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-23539185734051030432015-07-23T22:12:00.001+05:002018-12-08T18:37:53.295+05:00Изучаем Devise 2: Аутентификация по номеру телефнаЭто не обязательно должен быть номер телефона, это может быть username или еще что-нибудь. Но в дальнейшем планируется сделать подтверждение по номеру телефона с помощью SMS, по-этому здесь выбран именно номер телефона. <br /><br />
<b>1)</b> Вначале добавим колонку <b>phone_number</b> в таблицу <b>users</b> с помощью миграции:
<pre style="color:brown; font-size: x-small;">rails g migration AddPhoneNumberToUsers phone_number:string:uniq:index</pre>
<pre style="color:brown; font-size: x-small;">rake db:migrate</pre>
<b>2)</b> Внесем следующие изменения в модель (класс User):<br />
<ul>
<li>Добавим опцию <span style="font-family: Courier New"> authentication_keys: [:login]</span> в вызов метода <b>devise</b>:
<pre class="brush:ruby"> devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:validatable, :confirmable,
authentication_keys: [:login]</pre>
</li>
<li>Добавим поле <b>login</b>:
<pre class="brush:ruby">
def login=(login)
@login = login
end
def login
@login || self.phone_number || self.email
end
</pre>
</li>
<li>
Перегрузим метод отвечающий за поиск модели в базе данных:
<pre class="brush:ruby"> def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions.to_h).where(["lower(phone_number) = :value OR lower(email) = :value", { value: login.downcase }]).first
else
where(conditions.to_h).first
end
end</pre>
</li>
</ul>
<b>3)</b> Добавим следующий код в контроллер <b>ApplicationController</b>:
<pre class="brush:ruby"> before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:phone_number, :email, :password, :password_confirmation) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :phone_number, :email, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:phone_number, :email, :password, :password_confirmation, :current_password) }
end
</pre>
Этот код указыает Devise какие поля формы следует сохранить в моделе. Для понимания этот код был бы аналогичен такому коду в контроллере <b>SessionsController</b>:
<pre class="brush:ruby">
def sign_in
permit_params = params.required(:user).permit(:phone_number,
:email, :password, :password_confirmation)
@user.attributes=permit_params
end
</pre>
<b>5)</b> Далее нужно внести изменения в представления. По-умолчанию представления берутся из gem'а. Приведенная ниже команда генерирует представляения в вашем проекте. Они перегружают представления из gem'а:
<pre style="color:brown">rails generate devise:views</pre>
В форму регистрации (представление <b>views/devise/registrations/new.html.erb</b>) добавляем поле <b>phone_number</b>. Также вы можете добавить поле <b>phone_number</b> в представление редактирования данных пользователя <b>views/devise/registrations/edit.html.erb</b>.
В форме аутентификации(представление <b>views/devise/sessions/new.html.erb</b>) заменяем поле <b>email</b> на поле <b>login</b>.
<br /><br />
<b>6)</b> Не уверен обязательно ли это, но в <b>config/initializers/devise.rb</b> <strike>нужно</strike> желательно указать:
<pre class="brush:ruby">config.authentication_keys = [ :login ]</pre>
<b>7)</b> Перезапускаем сервер, пробуем.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-79789839653153705122015-07-19T17:16:00.000+05:002015-07-23T23:29:56.552+05:00Ruby on Rails: Настройка отправки сообщений через GMailВ конфигурационном файле config/environments/development.rb прописать следующие настройки:
<br />
<pre class="brush:ruby"> config.action_mailer.delivery_method :smtp
config.action_mailer.smtp_settings = {
openssl_verify_mode: 'none',
tls: false,
enable_starttls_auto: true,
address: 'smtp.gmail.com',
domain: 'gmail.com',
port: 587,
authentication: 'login',
user_name: 'login@gmail.com',
password: 'password'
}
</pre>
Перезапустить сервер. Если при попытке отправить сообщение возникнет ошибка:
<br />
<pre style="color:brown;">Net::SMTPAuthenticationError in Devise::RegistrationsController#create
534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=...
def check_auth_response(res)
unless res.success?
raise SMTPAuthenticationError, res.message
end
end
</pre>
то необходимо изменить натройки безопасности аккаунта гугл. Как, написано <a href="http://denguk.tumblr.com/post/124481032842/534-5-7-14">здесь</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-83786306004605652512015-07-19T02:34:00.004+05:002015-07-19T02:58:03.088+05:00HTML: Перенос длинных словОригинальный текст можно прочесть <a href="http://denguk.tumblr.com/post/119419439117/how-to-word-wrap-long-text-in-html">здесь</a>.<br />
Я нагуглил следующие способы решения проблемы с длинными словами, которые ломают верстку:<br />
1) <a href="http://slopjong.de/2013/06/18/how-to-word-wrap-text-in-html/">http://slopjong.de/2013/06/18/how-to-word-wrap-text-in-html/</a><br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">div {</span> </blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Courier New, Courier, monospace;"> white-space: pre-wrap; /* CSS3 */</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Courier New, Courier, monospace;"> white-space: -moz-pre-wrap; /* Firefox */</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Courier New, Courier, monospace;"> white-space: -pre-wrap;</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Courier New, Courier, monospace;"> word-wrap: break-word;</span> </blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Courier New, Courier, monospace;">}</span></blockquote>
2) Использовать специальные символы для разделения длинных слов на более короткие. Вот эти символы: <span style="font-family: Courier New, Courier, monospace;">&shy; &#8203; <wbr></span><br />
Пример спользования в Ruby on Rails <a href="https://gist.github.com/fiftin/004b70ac0fc0a72738f8">https://gist.github.com/fiftin/004b70ac0fc0a72738f8</a>.<br />
Каждый из этих сиволов имеет свои недостатки:
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">&#8203;</span> - представляют собой невидимый пробел который разделяет слово на отдельные слова. По-этому при двойном щелчке мыши по слову, выделяется не полностью слово, а только его часть</li>
<li><span style="font-family: Courier New, Courier, monospace;">&shy; &#8203;</span> - копируются вместе с тектом хоть и невидимы для пользователя. Проблема может возникнуть, если пользовтель пытается использовать скопированный текст (содержащий один из этих символов) для поиска.</li>
<li><span style="font-family: Courier New, Courier, monospace;"><wbr></span> - не имеет описанных выше недостатков, но он не поддерживается Internet Explorer'ом.</li>
</ul>
<div>
3) Если ширина div'ки с тектом фиксирована, то достаточно использовать для нее такой стиль:</div>
<div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">div {<br /> width: 100px;<br /> word-wrap: break-word;<br />}</span></blockquote>
</div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-45866656265365897772015-07-15T12:57:00.000+05:002015-07-19T12:48:49.572+05:00Изучаем Devise 1: Настройка подтвержденияУстановка Devise описана <a href="https://github.com/plataformatec/devise">здесь</a> и <a href="http://habrahabr.ru/post/208056/">здесь</a>.<br />
<br />
После установки мы хотим добавить подтверждение учетной записи по email. Для этого служит модуль <a href="http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Confirmable">confirmable</a>.<br />
<br />
<h3>
Настройка подтверждения</h3>
Devise сгенерировал нам такой класс модели:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">class User < ActiveRecord::Base<br /> # Include default devise modules. Others available are:<br /> # :confirmable, :lockable, :timeoutable and :omniauthable<br /> devise :database_authenticatable, :registerable,<br /> :recoverable, :rememberable, :trackable, :validatable</span> </span></blockquote>
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">end</span></span></blockquote>
В ней перечислены задействованные модули, confirmable среди них нет. Добавляем:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">class User < ActiveRecord::Base<br /> # Include default devise modules. Others available are:<br /> # :confirmable, :lockable, :timeoutable and :omniauthable<br /> devise :database_authenticatable, :registerable,<br /> :recoverable, :rememberable, :trackable, :validatable, <b>:confirmable</b><br />end</span></span></blockquote>
Теперь нужно добавил необходимые поля в таблицу <span style="font-family: Arial,Helvetica,sans-serif;">users</span>. Для этого создадим миграцию:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">rails g migration add_confirmable_to_users</span></blockquote>
Пишем код миграции:<br />
<blockquote class="tr_bq">
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">class AddConfirmableToUsers < ActiveRecord::Migration<br /> def change<br /> add_column :users, :confirmation_token, :string<br /> add_column :users, :confirmed_at, :datetime<br /> add_column :users, :confirmation_sent_at, :datetime<br /> # add_column :users, :unconfirmed_email, :string # Only if using reconfirmable<br /> add_index :users, :confirmation_token, unique: true<br /> # User.reset_column_information # Need for some types of updates, but not for update_all.<br /> # To avoid a short time window between running the migration and updating all existing<br /> # users as confirmed, do the following<br /> end<br /><br /> def down<br /> remove_columns :users, :confirmation_token, :confirmed_at, :confirmation_sent_at<br /> # remove_columns :users, :unconfirmed_email # Only if using reconfirmable<br /> end<br /><br />end</span></span></span></blockquote>
Применяем миграцию:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">rake db:migrate</span></blockquote>
Также нам нужно добавить миграцию для добавления поля <span style="font-family: "Courier New",Courier,monospace;">unconfirmed_email</span>:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">class AddUnconfirmedEmailToUsers < ActiveRecord::Migration<br /> def change<br /> add_column :users, :unconfirmed_email, :string<br /> end<br />end</span></span></blockquote>
<br />
Всё. <a href="https://github.com/fiftin/mymp/tree/base">Ссылка</a> на исходники примера.<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-50350239643860203882014-02-20T10:29:00.003+06:002014-02-20T10:29:43.874+06:00error: RPC failed; fatal: The remote end hung up unexpectedly<a href="https://confluence.atlassian.com/display/STASHKB/Git+Push+Fails+-+fatal%3A+The+remote+end+hung+up+unexpectedly">https://confluence.atlassian.com/display/STASHKB/Git+Push+Fails+-+fatal%3A+The+remote+end+hung+up+unexpectedly</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-53401370323929070862014-01-11T20:06:00.001+06:002014-01-11T20:31:57.728+06:00Сборка KeePassX под Ubuntu 13.10Скачиваем исходники <a href="http://www.keepassx.org/">KeePassX</a> <a href="http://www.keepassx.org/releases/keepassx-0.4.3.tar.gz">отсюда</a>:<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">wget http://www.keepassx.org/releases/keepassx-0.4.3.tar.gz</span></div>
Распаковываем архив:<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">tar -xzf keepassx-0.4.3.tar.gz</span></div>
Для сборки с терминале переходим в директорию с исходниками и вызываем:<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">make</span> </div>
<br />
<span style="font-family: inherit;">Если при сборке выскакивает ошибка:</span><br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">fatal error: X11/extensions/XTest.h: No such file or directory</span></div>
<span style="font-family: inherit;">то устанавливаем нужный пакет:</span><br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install libxtst-dev</span></div>
<br />
<span style="font-family: inherit;">Если при сборике </span><span style="font-family: inherit;">выскакивает ошибка</span><br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">error: ‘getpid’ was not declared in this scope</span></div>
<span style="font-family: inherit;">то нужно внести следующите изменения в файл </span><span style="font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace;">src/lib/random.cpp</span>:</span>
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: #444444;">#include "random.h"</span><br /><span style="color: #38761d;">+#include <unistd .h=""></unistd></span><br /><span style="color: #444444;">#if defined(Q_WS_X11) || defined(Q_WS_MAC)</span></span><br />
<span style="font-family: inherit;"></span>
<span style="font-family: inherit;">то есть добавить сторку </span><span style="font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace;"><span style="color: #38761d;">#include <unistd .h=""></unistd></span></span> и повтирить вызов <span style="font-family: "Courier New",Courier,monospace;">make</span>.</span><br />
<br />
<span style="font-family: inherit;">После того как сборка прошла успешно, вызываем:</span><br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">make install </span></div>
<span style="font-family: inherit;">для установки KeePassX. </span><span style="font-family: inherit;"><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-84882250345839624492014-01-11T19:38:00.000+06:002014-01-11T19:40:27.817+06:00E: The package mywm:i386 needs to be reinstalled, but I can't find an archive for it.После неудачной попытки установить WebMomey на Ubuntu x64, apt-get стал выдавать шибку:<br />
<span style="font-family: "Courier New",Courier,monospace;"><br />E: The package mywm:i386 needs to be reinstalled, but I can't find an archive for it.</span><br />
<br />
Чтобы её устранить нужно вызвать команду:<br />
<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">sudo dpkg --remove --force-remove-reinstreq mywm:i386</span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-60710788356944607862014-01-08T13:46:00.002+06:002014-01-12T01:41:11.797+06:00Сборка Qt из исходников под Ubuntu<code>sudo apt-get install build-essential zlib1g-dev libssl-dev</code> <br />
<a href="http://help.ubuntu.ru/wiki/qt_static">http://help.ubuntu.ru/wiki/qt_static</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-69174347089587754612014-01-08T00:44:00.003+06:002014-01-08T00:56:16.401+06:00Skype: problem with audio playback<pre><span style="font-family: "Courier New",Courier,monospace;"><code>sudo apt-get install libpulse0:i386</code></span></pre>
<pre><span style="font-family: Arial,Helvetica,sans-serif;"><code>Ссылки: </code></span></pre>
<pre><span style="font-family: Arial,Helvetica,sans-serif;"><code><a href="https://help.ubuntu.com/community/SkypeTroubleshooting">https://help.ubuntu.com/community/SkypeTroubleshooting</a></code></span></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-12441770506413167042014-01-08T00:16:00.000+06:002014-01-08T00:55:36.458+06:00Установка *.deb в Ubuntu<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">dpkg -i имя_файла.deb</span></div>
<br />
Если в процессе установки возникла ошибка зависимостей (dependency problems), то нужно вызвать команду:<br />
<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get -f install</span></div>
<br />
Эта команда разрешит все зависимости при установке deb-пакета. <br />
<br />
Ссылки:<br />
<a href="http://askubuntu.com/questions/222090/cannot-install-skype-due-to-dependency-errors-dpkg-doesnt-install-dependencies">http://askubuntu.com/questions/222090/cannot-install-skype-due-to-dependency-errors-dpkg-doesnt-install-dependencies</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-507419561404221782014-01-07T23:58:00.003+06:002014-01-08T00:50:52.558+06:00Подключение Bluetooth-гарнитуры к ПК под *ubunutuДля того чтобы Bluetooth-гарнитура была доступна как аудио устройство, нужно уснатовить необходимые пакеты:<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install "pulseaudio-*"</span></div>
также хуже не будет<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install pavucontrol </span></div>
и перезапустить <b>pulseaudio</b>:<br />
<div style="text-align: center;">
<span style="font-family: "Courier New",Courier,monospace;">pulseaudio -k</span></div>
<br />
Вот полезные ссылки:<br />
<a href="http://askubuntu.com/questions/239209/no-sound-from-bluetooth-headset-but-its-detected">http://askubuntu.com/questions/239209/no-sound-from-bluetooth-headset-but-its-detected</a><br />
<br />
<a href="http://askubuntu.com/questions/223136/pavucontrol-doesnt-show-bluetooth-headset">http://askubuntu.com/questions/223136/pavucontrol-doesnt-show-bluetooth-headset</a><br />
<br />
<a href="http://itshaman.ru/articles/123/podklyuchenie-bluetooth-naushnikov-i-garnitury-dlya-proslushivaniya-muzyki-v-ubuntu">http://itshaman.ru/articles/123/podklyuchenie-bluetooth-naushnikov-i-garnitury-dlya-proslushivaniya-muzyki-v-ubuntu</a><br />
<br />
<a href="http://askubuntu.com/questions/14077/how-can-i-change-the-default-audio-device-from-command-line">http://askubuntu.com/questions/14077/how-can-i-change-the-default-audio-device-from-command-line</a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2409363880680782006.post-8973323681416737522014-01-07T21:26:00.000+06:002014-01-07T21:26:55.973+06:00Ubuntu 13.10 и Radeon 9600Есть старый компьютер с видеокартой <b>Radeon 9600</b>. На нем установил <b>Xubuntu 13.10</b>. Она вроде бы работает, хоть и тормозит, но подходящее для монитора разрешение <span style="font-family: Courier New, Courier, monospace;">1280x1024 </span>не выставляется. Ранее в посте <a href="http://mega-mozg.blogspot.ru/2013/09/ubuntu-1304.html">про настройку разрешения второго монитора</a> я писал как справлялся с этой проблемой. Но тут эта методика не подошла. Наоборот, все стало еще хуже. На экране теперь отображается полная ерунда и вернуть все назад я не знаю как.<br />
<div>
Что я уже узнал пока разбирался.</div>
<h3>
Попытка 1</h3>
<div>
Я перешел на другую консоль сочетанием клавиш <span style="font-family: Courier New, Courier, monospace;">Ctrl+Alt+F1</span>. В ней вбил команду:</div>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">xrandr -s 1024x768</span></div>
<div>
Но в ответ получил сообщение: <b>Can't open display</b>.</div>
<div>
Чтобы указать монитор выполнил команду:</div>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">export DISPLAY=:0</span></div>
<div>
Теперь при вызове первой команды получаю ошибку: <b>Failed to change the screen configuration!</b></div>
<div>
Так же я пробовал перезапускать X сервер командой:</div>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">sudo /etc/init.d/lightdm restart</span></div>
<div>
Так же безуспешно.</div>
<div>
<h3>
Попытка 2</h3>
</div>
<div>
Раньше настройки видео хранились в файле <span style="font-family: Courier New, Courier, monospace;">/etc/X11/xorg.conf</span>, но в новых версиях этот файл отсутствует. Но если его создать, то с помощью его можно устанавливать настройки. Создается он командой:</div>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">sudo X -configure</span></div>
<div>
или</div>
<div style="text-align: center;">
<span style="font-family: Courier New, Courier, monospace;">sudo X :1 -configure</span></div>
<div>
После этого в каталоге пользователя вы найдете файл <span style="font-family: Courier New, Courier, monospace;">xorg.conf.new</span>.</div>
<div>
Далее его нужно скопировать в директорию <span style="font-family: Courier New, Courier, monospace;">/etc/X11/</span> под именем <span style="font-family: Courier New, Courier, monospace;">xorg.conf</span>.<br />
<br />
Итак, после всех этих манипуляций X-ы у меня вообще перестали загружаться.<br />
<br />
Как оказалось, ATI больше не выпускает драйверов для старых видеокарт. Единственным драйвером для этой видюхи является свободный драйвер <b>Gallium</b>.<br />
<h3>
Попытка 3</h3>
Xubuntu 13.10 я заменил на Lubuntu 13.10 т.к. она шустрее работает на моем компе. Далее я установил Gallium3D:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get install mesa-utils</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo add-apt-repository ppa:oibaf/graphics-drivers</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get update</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get install libg3dvl-mesa</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
Так же я вызвал команду:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">sudo dpkg-reconfigure xserver-xorg</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
Не знаю насколько это было нужно.<br />
Посмотреть настройки видюхи можно командой <span style="font-family: Courier New, Courier, monospace;">glxinfo</span>.<br />
Теперь можно повторить действия с <b>xrandr</b> описанные выше. Если теперь всё заработало, нужно добавить вызов этих команд в файл <span style="font-family: Courier New, Courier, monospace;">~/.xprofile</span> чтобы при следующей загрузке применялись эти настройки. В моем случае содержимое этого файла выглядит так:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">xrandr --newmode "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync</span><br />
<span style="font-family: Courier New, Courier, monospace;">xrandr --addmode VGA-0 1280x1024_60.00</span><br />
<span style="font-family: Courier New, Courier, monospace;">xrandr -s 1280x1024_60.00</span><br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-71687559291818496482013-12-30T19:36:00.002+06:002013-12-30T19:36:32.483+06:00Git: Обновление подмодулей<pre>git submodule init
git submodule update
</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-45093068744853356772013-11-26T12:25:00.002+06:002018-12-08T14:11:59.212+05:00SQL Developer: ORA-12705: Cannot access NLS data files or invalid environment specified<br />
При попытке подключиться с помощью <b>SQL Developer 4.0.0.13</b> к БД Oracle, получаю ошибку:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://cf7c821a-a-62cb3a1a-s-sites.googlegroups.com/site/megamozgosite/home/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9.png?attachauth=ANoY7coNDLwU9KvTnrpl28hhLWHHsg8T9eDLtGwnWDnsph0SG286sLQsJQQGjr5jjeOYx4aDqSlRxA8R8-1gXZ9sFqQCxgVBpt-yW4ikiIc6vbRUFbXK3QunEmmxNTQRqfZljQTQ0UrB3G7REt7WOe2ssDroWnHQgwfV-2bZ8iMMueKyKiPlEDCgfjCtYfwepMDF-UlVPU1LoqTpJ1Y4MItJC5_gbU9kDsxqKhm-4tTfNww9WSryzos146aiMH3dkOYtgENRoLlgZkM1geeNM35ghO_Ydn5t8RfeIeTMSsAlcPhk6Ud5l9g%3D&attredirects=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="https://cf7c821a-a-62cb3a1a-s-sites.googlegroups.com/site/megamozgosite/home/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9.png?attachauth=ANoY7coNDLwU9KvTnrpl28hhLWHHsg8T9eDLtGwnWDnsph0SG286sLQsJQQGjr5jjeOYx4aDqSlRxA8R8-1gXZ9sFqQCxgVBpt-yW4ikiIc6vbRUFbXK3QunEmmxNTQRqfZljQTQ0UrB3G7REt7WOe2ssDroWnHQgwfV-2bZ8iMMueKyKiPlEDCgfjCtYfwepMDF-UlVPU1LoqTpJ1Y4MItJC5_gbU9kDsxqKhm-4tTfNww9WSryzos146aiMH3dkOYtgENRoLlgZkM1geeNM35ghO_Ydn5t8RfeIeTMSsAlcPhk6Ud5l9g%3D&attredirects=0" width="320" /></a></div>
<pre style="white-space: normal;">Status : Failure -Test failed: ORA-00604: error occurred at recursive SQL level 1
ORA-12705: Cannot access NLS data files or invalid environment specified
</pre>
<b>NLS </b>- расшифровывается как <b>National Language Support</b>. Проблема связана с кодировкой. Причем при подключении через SQL*Plus никаких проблем с кодировкой не возникает. Это значит что проблема в самом SQL Developer. Поисказ в инете нашел вот <a href="http://notes84.blogspot.ru/2013/07/oracle-sql-developer-ora-12705-cannot.html">эту</a> заметку. Выполнив приведенные в ней дейвтвия решил пролбему:<br />
<ul>
<li>открыть файл <span style="font-family: "Courier New",Courier,monospace;">sqldeveloper\ide\bin\ide.conf</span>;</li>
<li>в конец добавил строки:<pre>AddVMOption -Duser.region=us
AddVMOption -Duser.language=en
</pre>
</li>
<li>перезапустил SQL Developer.</li>
</ul>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-2409363880680782006.post-46517180461205334202013-11-25T13:21:00.007+06:002013-11-25T13:21:51.356+06:00ORA-12638: Credential retrieval failedПри попытке подключиться к Oracle из под учетной записи пользователя Windows не состоящего в группе ORA_DBA, получаю ошибку:<div>
<span style="font-family: Courier New, Courier, monospace;">ORA-12638: Credential retrieval failed</span></div>
<h3>
Решение</h3>
<div>
Вот <a href="http://www.dba-oracle.com/t_ora_12638_credential_retrieval_failed.htm">тут </a>написано, что нужно в файле sqlnet.ora (у меня он находится по пути c:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\sqlnet.ora) заменить строку:</div>
<div>
<span style="font-family: Courier New, Courier, monospace;">SQLNET.AUTHENTICATION_SERVICES = (<span style="color: red;">NTS</span>)</span></div>
<div>
на </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">SQLNET.AUTHENTICATION_SERVICES = (<span style="color: red;">NONE</span>)</span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-16510239889160263532013-11-21T15:26:00.001+06:002013-11-21T15:31:24.599+06:00Изучаю Oracle: Пользователи и их праваВ предыдущем посте в п. 2 я писал как исправить проблемы с некорректно установленным Oracle'ом. Как оказалось, то что я написал не полностью решает проблему, по-этому я его снес и установил заново уже под локальной учетной записью. Теперь все работает как надо и можно продолжить изучение.<br />
<br />
При установке Oracle по умолчанию создаются два пользователя/схемы - <b>SYS </b>и <b>SYSTEM</b>. Я написал "пользователя/схемы" потому, что при создании нового пользователя для него создается одноименная схема. Не сразу понятно чем понятие "пользователь" отличается от понятия "схема". Чтобы понять представьте пользователя Windows (Unix). Пользователь имеет имя <span style="font-family: Courier New, Courier, monospace;">ИмяПользователя </span>и принадлежащую ему папку -<span style="font-family: Courier New, Courier, monospace;"> C:\Users\ИмяПользователя</span> (<span style="font-family: Courier New, Courier, monospace;">/home/ИмяПользователя</span>). Так вот пользователь Oracle аналогичен пользователю Windows, а схема - аналогична папке пользователя. Точно так же как у пользователя Windows, у пользователя Oracle есть набор прав. Так же как папка пользователя Windows содержит различные файлы, также и схема Oracle содержит различные объекты - таблицы, последовательности, триггеры и др. Если продолжать аналогию, то пользователей <b>SYS </b>и <b>SYSTEM </b>можно считать Администратором Windows или root-пользователем Unix. Они имеют неограниченные права. И работать под ними не рекомендуется. По-этому сначала нужно создать еще одного пользователя.<br />
<br />
<h3>
1. Создание пользователя и предоставление ему прав</h3>
<br />
Создадим пользователя, например <span style="font-family: Courier New, Courier, monospace;">fiftin</span>:<br />
<pre>CREATE USER fiftin IDENTIFIED BY 123456;
</pre>
Мы создали пользователя <span style="font-family: Courier New, Courier, monospace;">fiftin </span>с паролем <span style="font-family: Courier New, Courier, monospace;">123456</span>. Он не имеет абсолютно никаких прав. Вы даже не сможете под ним зайти:<br />
<pre>SQL> connect fiftin
Enter password:
ERROR:
ORA-01045: user FIFTIN lacks CREATE SESSION privilege; logon denied</pre>
Для наделения пользователя правами существует команда <span style="font-family: Courier New, Courier, monospace;">GRANT</span>. Например дадим права пользователю fiftin на вход:
<br />
<pre>GRANT CREATE SESSION TO fiftin;
</pre>
Если теперь вы попробуете подключиться как пользователь fiftin у вас это получится. Но это все что разрешено пользователю fiftin. Наделим пользователя правами администратора:
<br />
<pre>GRANT dba TO fiftin WITH ADMIN OPTION;
</pre>
Теперь вы можете подцепиться к БД под fiftin'ом как админ:
<br />
<pre>connect fiftin/fiftin
</pre>
Создадим таблицу:
<br />
<pre>CREATE TABLE table1(id INT, column1 INT);
</pre>
Вставим данные:
<br />
<pre>INSERT INTO table1(id, column1) VALUES (0, 1)</pre>
<pre></pre>
<h3>
</h3>
<h3>
2. Права на создание таблиц</h3>
<br />
Создадим еще одного пользователя - test:
<br />
<pre>CREATE USER test IDENTIFIED BY 123;
</pre>
Дадим ему права:
<br />
<pre>GRANT create session, <span style="background-color: black;"><span style="color: white;">create table</span></span> TO test;
</pre>
Теперь пользователь test может подключаться и создавать таблицы. Попробуем создать таблицу (не забудьте зайти под test'ом):
<br />
<pre>CREATE TABLE tbl_test(id int, column1 INT);</pre>
Получаем ошибку:
<br />
<pre>ORA-01950: no privileges on tablespace 'SYSTEM'
</pre>
Почему так? Оказывается для того чтобы обычный пользователь (не админ) мог что-либо создать в БД, ему нужно выделить для этого место. Зайдем снова под fiftin'ом и выполним команду:
<br />
<pre>ALTER USER test QUOTA 50m ON system;
</pre>
Этой командой мы выделяем пользователю test 50Мб под его нужды. Попробуйте теперь зайти под пользователем test и создать таблицу и у вас получится.<br />
<br />
<h3>
3. Права на доступ к таблицам из другой схемы</h3>
<br />
Теперь предположим что пользователь test должен брать данные из таблицы table1t. По-идее для этого нужно вызвать команду:
<br />
<pre>SELECT * FROM table1;</pre>
Но это не работает. Все потому, что таблица table1 находится в схеме fiftin и пользователь test её не видит (test видит таблицы только в своей схеме). Чтобы test увидел таблицу table1 нужно явно указать что она находится в схеме test - fiftin.table1. Но если вы сейчас попробуете обратиться к таблице fiftin.table1 вы её все равно не увидите. Потому что у пользователя test нет прав на доступ к данным из другой схемы (так же как пользователь Windows не может увидеть файлы другого пользователя, если у него нет на это прав).<br />
Чтобы дать пользователю test права на чтение данных из таблицы fiftin.table1 нужно вызвать команду:
<br />
<pre>GRANT SELECT ON fiftin.table1 TO test
</pre>
Теперь повторим попытку чтения из fiftin.table1 под пользователем test. Ура, получилось!<br />
<br />
<h3>
4. Синонимы</h3>
<br />
Чтобы не писать каждый раз "fiftin.table1" Oracle предоставляет возможность создавать <b>синонимы</b>. Мы можем создать синоним таблицы table1 в схеме test и обращаться к ней по короткому имени.<br />
Для начала дадим права пользователю test на создание синонимов:
<br />
<pre>GRANT CREATE SYNONYM TO test
</pre>
А теперь создадим сам синоним:
<br />
<pre>CREATE SYNONYM table1 FOR fiftin.table1;
</pre>
Все.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2409363880680782006.post-68207044431959715132013-11-20T15:16:00.000+06:002013-11-20T15:22:21.858+06:00Изучаю Oracle: НачалоOracle предоставляет бесплатную (express) версию своей СУБД, которую можно скачать на официальном сайте (потребуется зарегистрироваться).
<br />
<br />
Если ваш компьютер/сервер находится в домене, то чтобы корректно установить oracle потребуется зайти под локальной учетной записью с правами администратора. СУБД установится и под доменной учетной записью, но при этом сам экземпляр БД (instance) будет создана некорректно и его придется пересоздавать и перенастраивать. Как это сделать будет написано дальше.
<br />
<br />
<span style="color: #666666;">Что такое "экземпляр БД"? Это отдельная БД со своим именем, пользователями, таблицами, настройками, правами. В Oracle могут быть созданы и работать несколько экземпляров БД. Экземпляр можно остановить, создать, удалить и это никак не будет влиять на другие экземпляры. По умолчанию создается только один экземпляр.</span><br />
<br />
<h3>
1. Проверка работы БД
</h3>
<div>
<br /></div>
Для управления БД в комплекте идет консольное приложение SQL*Plus, с помощью которой можно как настраивать БД, так и получать доступ к данных хранящимся в ней. Запустив её вы увидите:
<br />
<pre>SQL*Plus: Release 11.2.0.2.0 Production on ******************
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL>
</pre>
На данный момент вы просто запустили её. Но к БД доступа, на данный момент, вы не имеете. Чтобы получить доступ к БД нужно к ней подключиться. Для этого существует команда <b>CONNECT</b>. <span style="background-color: black;"><span style="color: white;">Чтобы с помощью неё подключиться к БД с правами администратора без логина и пароля, необходимо чтобы учетная запись пользователя под которой запущен SQL*Plus была в группах Администраторы и ORA_DBA.</span></span> В этом случае команда для подключения выгладит так:
<br />
<pre>CONNECT / AS SYSDBA
</pre>
Теперь проверим запущен ли экземпляр БД командой:
<br />
<pre>STARTUP
</pre>
Эта команда запускает экземпляр БД. Если экземпляр уже запущен, то вы увидите:
<br />
<pre>ORA-01081: cannot start already-running ORACLE - shut it down first
</pre>
Если не был запущен, но успешно запустился:
<br />
<pre>ORACLE instance started.
Total System Global Area ********* bytes
Fixed Size ******* bytes
Variable Size ********* bytes
Database Buffers ********* bytes
Redo Buffers ******* bytes
Database mounted.
Database opened.
</pre>
Если же не был запущен и при попытке запустить возникла ошибка, вы увидите сообщение об ошибке:
<br />
<pre>ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file 'C:\oraclexe\app\oracle\product\11.2.0\serv
er\dbs\spfileXE.ora'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) ?? ??????? ????? ????????? ????.
</pre>
Если у вас на данном этапе не возникло проблем, то теперь вы можете делать с БД все что захотите: останавливать, запускать, создавать таблицы, добавлять данные и пункт 2 вы можете пока не читать.
<br />
<br />
<h3>
2. Что делать если вы устанавливали СУБД Oracle из под доменной учетной записи и теперь не можете запустить БД</h3>
<div>
<br />
<span style="color: #666666;">* Ниже будет использоваться абсолютный путь расположения директории Oracle, у меня это <span style="font-family: Courier New, Courier, monospace;">C:\ORACLEXE</span>. Название экземпляра БД - XE.</span><br />
<span style="color: #666666;"><br /></span>
Начнем с того, что восстановил главный настоечный файл БД - <b>spfile</b>. Он должен располагаться здесь - <span style="font-family: Courier New, Courier, monospace;">C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\</span> и иметь имя - <span style="font-family: Courier New, Courier, monospace;">spfile<имя_экземпляра_БД>.ora</span>, в нашем случае <span style="font-family: Courier New, Courier, monospace;">spfileXE.ora</span>. Но его там нет. Но зато есть файл <span style="font-family: Courier New, Courier, monospace;">init.ora</span>. С помощью него мы получим spfile.<br />
Откроем init.ora:
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># Change '<ORACLE_BASE>' to point to the oracle base (the one you specify at</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># install time)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">db_name='ORCL'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">memory_target=1G</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">processes = 150</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">audit_file_dest='<ORACLE_BASE>/admin/orcl/adump'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">audit_trail ='db'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">db_block_size=8192</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">db_domain=''</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">db_recovery_file_dest='<ORACLE_BASE>/flash_recovery_area'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">db_recovery_file_dest_size=2G</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">diagnostic_dest='<ORACLE_BASE>'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">open_cursors=300 </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">remote_login_passwordfile='EXCLUSIVE'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#undo_tablespace='UNDOTBS1'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># You may want to ensure that control files are created on separate physical</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># devices</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">control_files = (ora_control1, ora_control2)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">compatible ='11.2.0'</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">В нем везде заменим (перед этим можно сделать резервную копию) </span><span style="font-family: Courier New, Courier, monospace;"><ORACLE_BASE></span> на <span style="font-family: Courier New, Courier, monospace;">c:\oraclexe\app\oracle</span> и сохраняем.<br />
Далее в SQL*Plus вызываем команду:
<br />
<pre>CREATE SPFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\spfileXE.ora' FROM PFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\init.ora'
</pre>
Теперь мы имеем рабочий spfile и можем повторить попытку запустить экземпляр БД командой <span style="font-family: Courier New, Courier, monospace;">STARTUP </span>в SQL*Plus. Теперь она должна пройти но при этом выдать ошибку:
<br />
<pre>ORACLE instance started.
Total System Global Area 644468736 bytes
Fixed Size 1385488 bytes
Variable Size 192941040 bytes
Database Buffers 444596224 bytes
Redo Buffers 5545984 bytes
ORA-00205: error in identifying control file, check alert log for more info
</pre>
Связано это с тем, что на самом деле запуск экземпляра состоит из нескольких этапов:<br />
1) Запуск экземпляра.<br />
2) Монтирование (mount).<br />
3) Открытие доступа (open).<br />
Мы смогли запустить экземпляр, но смонтировать данные не смогли. Это потому, что нам нечего монтировать - файлов содержащих данные нету. Если вы загляните в директорию <span style="font-family: Courier New, Courier, monospace;">C:\oraclexe\app\oracle\oradata\XE</span>, то увидите что она пуста. Так быть не должно. Чтобы это исправить нужно вызвать команду <span style="font-family: Courier New, Courier, monospace;">CREATE DATABASE <имя_экземпляра_БД></span>, которая создаст необходимые для работы БД файлы. Синтаксис вызова такой:
<br />
<pre>CREATE DATABASE xe
USER SYS IDENTIFIED BY 123456
USER SYSTEM IDENTIFIED BY 123456
LOGFILE GROUP 1 ('c:\oraclexe\app\oracle\oradata\xe\redo01.log') SIZE 100M,
GROUP 2 ('c:\oraclexe\app\oracle\oradata\xe\redo02.log') SIZE 100M,
GROUP 3 ('c:\oraclexe\app\oracle\oradata\xe\redo03.log') SIZE 100M
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 100
MAXINSTANCES 1
CHARACTER SET US7ASCII
NATIONAL CHARACTER SET AL16UTF16
DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\system01.dbf' SIZE 325M REUSE
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\sysaux01.dbf' SIZE 325M REUSE
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE 'c:\oraclexe\app\oracle\oradata\xe\temp01.dbf'
SIZE 20M REUSE
UNDO TABLESPACE UNDOTBS1
DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
</pre>
В конце выполнения команда должна выдать <span style="font-family: Courier New, Courier, monospace;">"Database created."</span><br />
Если теперь вы заглянете в папку <span style="font-family: Courier New, Courier, monospace;">C:\oraclexe\app\oracle\oradata\XE</span>, то должны увидеть следующие файлы:<br />
<span style="font-family: Courier New, Courier, monospace;">REDO01.LOG</span><br />
<span style="font-family: Courier New, Courier, monospace;">REDO02.LOG</span><br />
<span style="font-family: Courier New, Courier, monospace;">REDO03.LOG</span><br />
<span style="font-family: Courier New, Courier, monospace;">SYSAUX01.DBF</span><br />
<span style="font-family: Courier New, Courier, monospace;">SYSTEM01.DBF</span><br />
<span style="font-family: Courier New, Courier, monospace;">TEMP01.DBF</span><br />
<span style="font-family: Courier New, Courier, monospace;">UNDOTBS01.DBF</span><br />
<br />
Все. Теперь вы можете попробовать создать таблицу:
<br />
<pre>CREATE TABLE tbl_test1(id int, col1 int);
</pre>
Вставить в нее данные:
<br />
<pre>INSERT INTO tbl_test1 VALUES(1, 1);
INSERT INTO tbl_test1 VALUES(2, 2);
INSERT INTO tbl_test1 VALUES(3, 3);
</pre>
и считать их:
<br />
<pre>SELECT * FROM tbl_test1;
</pre>
</div>
Unknownnoreply@blogger.com3