tag:blogger.com,1999:blog-75144252720824876172024-02-24T05:02:40.858+03:00de1s_how-to'sХламник, записная книжка и незабывайка в одном html-е.delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.comBlogger353125tag:blogger.com,1999:blog-7514425272082487617.post-75417543814641620842024-01-10T11:00:00.004+03:002024-01-10T11:00:33.880+03:00MacOS: кто мешает спать?<blockquote><p></p></blockquote><blockquote><blockquote><p> de1s-mbp:~ delayer$ pmset -g | grep -w sleep</p><p> sleep 1 (sleep prevented by sharingd, useractivityd)</p></blockquote><p></p></blockquote><p><br /></p><p>Кратенькая команда, которая покажет, кто в данный момент не дает макбуку уйти в сон (и в течение ночи пожрет к чертям всю батарейку). В моем случае это оказался включенный удаленный доступ к экрану. После отключения стало хорошо:</p><p></p><blockquote><p>$ pmset -g | grep -w sleep</p><p> sleep 1</p></blockquote><p>Узнал о такой штуке <a href="https://medium.com/@hinddeep.purohit007/fixing-the-dreaded-battery-drain-issue-on-a-sleeping-mac-6e153e464b13" rel="nofollow" target="_blank">отсюда</a> </p><p></p>delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-25823153685889052342022-10-15T22:00:00.004+03:002022-10-16T08:09:04.518+03:00АпТуДейт<p>Давно не заходил. </p><p>А теперь зашел - да из забугра. Занесло, а вот надолго ли, непонятно.</p>delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-25126380964898722152021-03-15T15:58:00.003+03:002021-03-15T15:58:35.848+03:00Transmission remote<p style="text-align: justify;"> <a href="https://wiki.archlinux.org/index.php/transmission" target="_blank">Пара</a> <a href="https://github.com/transmission/transmission/wiki/Editing-Configuration-Files" target="_blank">ссылок</a> для конфигурации торрент-клиента transmission в клиент-серверном виде: демон на сервере, интерфейс управления - на клиентах.</p>delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-18161612752230377832020-10-07T17:22:00.001+03:002020-10-07T17:22:19.049+03:00Экспорт паролей из Яндекс.Браузера<p style="text-align: justify;">Яндекс-браузер - таки бяка. Обиделся я на него после того, как не смог найти штатного способа забрать из него сохраненные пароли. Ребята не только написали свой менеджер паролей (который сам по себе вполне и норм), но выпилили штатные хромиумные возможности экспорт паролей. В итоге импортировать их можно практически откуда угодно, а вот экспортировать - никак. Совсем.</p><p style="text-align: justify;">Однако нашелся таки умелец на просторах интернета, который смог. Более того, результаты своей деятельности он выложил на гитхабе (<a href="https://github.com/opravdin/yandex-browser-password-export" rel="nofollow" target="_blank">тут</a>) и сопроводил инструкцией по использованию. Спасибо, Олег Правдин! Была бы спонсорская кнопка, обязательно отправил бы взнос на пиво.</p><p style="text-align: justify;">А браузер - в топку, каким бы хорошим он в остальном не был.</p>delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-14170339045002168882020-09-03T18:06:00.001+03:002020-09-03T18:06:07.379+03:00Docker overlay deep dive<p style="text-align: justify;"> Не передать словами насколько полезная нашлась <a href="https://blog.revolve.team/2017/04/25/deep-dive-into-docker-overlay-networks-part-1/" target="_blank">серия статей</a> про устройство overlay-сетей в Docker.</p>delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-61285083631196460072020-06-09T17:36:00.002+03:002020-06-15T10:22:31.053+03:00vscode - reenable settings when "exclude settings and ignore files are disabled"<div dir="ltr" style="text-align: left;" trbidi="on">
Я полчаса глаза мозолил, прежде чем понять, о чем речь уже по готовым инструкциям. Это ж надо, а... Спасибо, <em style="border: 0px; font-family: Nunito, Avenir, Helvetica, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; text-align: center; vertical-align: baseline;">Stephen Weiss,</em> за картинки <a href="https://stephencharlesweiss.com/blog/2019-08-06/vscode-enable-settings-ignore-files-disabled/" target="_blank">тут</a>.<br />
Поиск курильщика:<br />
<img alt="search with settings disabled" height="192" src="https://stephencharlesweiss.com/static/6a759ce9cb85c6f87e5172b5402aa297/0c69d/search-with-settings-disabled.png" width="400" /><br />
<br />
Поиск здорового человека:<br />
<img alt="search with settings enabled" height="183" src="https://stephencharlesweiss.com/static/e9fdebc0a4b430535d38b6172c4b8984/5fd3e/search-with-settings-enabled.png" width="400" /></div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-17316171847978350782020-05-19T22:07:00.001+03:002020-05-19T22:07:26.757+03:00psycopg2 on MacOS<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Споткнулся при создании нового virtualenv-а на установке пакета psycopg2 (нужен для работы ансибловых модулей с PostgreSQL). Для его установки требуется наличие бинарника pg_config, но найти его pip не может. Как полечить, нашел вот <a href="https://medium.com/pixel-heart/os-x-sierra-postgresql-and-psycopg2-42c0c95acb23" target="_blank">тут</a>, спасибо автору.</div>
<div style="text-align: justify;">
Краткое содержание: взять предсобранный постгрес для макоси <a href="https://postgresapp.com/downloads.html" target="_blank">тут</a> (на самом деле в оригинальной статье автор отправляет загружать постгрес неведомо куда, но по предложенной мной ссылке все проще и понятнее) и добавить в PATH </div>
<blockquote class="tr_bq" style="text-align: justify;">
export PATH="/Applications/Postgres.app/Contents/Versions/12/bin/:$PATH"</blockquote>
Далее можно собирать psycopg2.</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-8557587566589651602020-04-11T23:13:00.001+03:002020-04-11T23:13:33.259+03:00Apple Magic Keyboard and tilde button<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Пришел в редакцию вопрос, как в новой модной молодежной яблочной magic keyboard выковырять невнятную кнопку с символом параграфа и плюс-минуса (и кому они могли вовсе понадобиться?) и вернуть, как везде тильду с обратной кавычкой? </div>
<div style="text-align: justify;">
Поиски привели к прекрасному человеку по имени Dimitar Chakarov и его <a href="https://dchakarov.com/blog/macbook-remap-keys/" target="_blank">заметке</a> с решением проблемы и <a href="https://github.com/dchakarov/restore-tilde" target="_blank">репозиторию</a> со скриптиком и даже собранным приложением для макоси. Работает великолепно, коллеги довольны.</div>
<br /></div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-90418686977182925272019-10-22T18:57:00.001+03:002019-10-22T18:57:31.122+03:00MacOS 10.15 Catalina: Abort trap: 6 <div dir="ltr" style="text-align: left;" trbidi="on">
Обновление до Каталины ломает питончик: <blockquote class="tr_bq">
Abort trap: 6 </blockquote>
Воркараунд:<br />
<blockquote class="tr_bq">
$ brew install openssl<br />$ ln -s /usr/local/Cellar/openssl/1.0.2t/lib/libcrypto.1.0.0.dylib /usr/local/lib/libcrypto.dylib</blockquote>
<div>
Если версия openssl на момент выполнения команды уже иная, поменять.<br />
<br />
Источник: https://someguys.blog/2019-10-09-python-abort-on-macos-catalina/<br />
<br />
<blockquote class="tr_bq">
</blockquote>
</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-9430514714540606682019-02-06T22:47:00.003+03:002019-02-06T22:50:40.751+03:00Openvpn\Tunnelblick hide `unrecognized option` window<div dir="ltr" style="text-align: left;" trbidi="on">
Давненько ничего не приходилось записать, но вот...<br />
<br />
<div style="text-align: justify;">
На текущем рабочем месте доступ к ряду ресурсов организован через OpenVPN. Помимо прочих опций сервер выдает настройки DNS сервера, однако используются эти опции исключительно в win-среде, а мой macos-ный Tunnelblick на них ругается как на `unrecognized`:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-tgXe9-qEecs/XFs4eNIPOyI/AAAAAAAAkl0/zqRe7ymZCrw_lRw_Ua-c3b4k_I0W4oMvQCLcBGAs/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA%2B%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0%2B2019-02-06%2B%25D0%25B2%2B22.38.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="980" data-original-width="970" height="320" src="https://3.bp.blogspot.com/-tgXe9-qEecs/XFs4eNIPOyI/AAAAAAAAkl0/zqRe7ymZCrw_lRw_Ua-c3b4k_I0W4oMvQCLcBGAs/s320/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA%2B%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0%2B2019-02-06%2B%25D0%25B2%2B22.38.22.png" width="316" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Линуксовый openvpn-клиент сругнется ровно также:</div>
<blockquote class="tr_bq">
2019-02-06 22:16:04 Options error: Unrecognized option or missing or extra parameter(s) in [PUSH-OPTIONS]:1: block-outside-dns (2.4.6)<br />
<br />
2019-02-06 22:16:04 Options error: Unrecognized option or missing or extra parameter(s) in [PUSH-OPTIONS]:3: register-dns (2.4.6)</blockquote>
И если к сообщениям в логе можно отнестись спокойно (и не заметить), то всплывающее окно при каждом открытии крышки ноутбука напрягает.<br />
<br />
Однако решение есть! В <a href="https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage" target="_blank">документации</a> находим следующее:<br />
<blockquote class="tr_bq">
--pull-filter accept|ignore|reject text</blockquote>
<div>
<blockquote class="tr_bq">
Filter options received from the server if the option starts with text. Runs on client. The action flag accept allows the option, ignore removes it and reject flags an error and triggers a SIGUSR1 restart. The filters may be specified multiple times, and each filter is applied in the order it is specified. The filtering of each option stops as soon as a match is found. Unmatched options are accepted by default.<br />Prefix comparison is used to match text against the received option so that<br />--pull-filter ignore "route"would remove all pushed options starting with route which would include, for example, route-gateway. Enclose text in quotes to embed spaces.<br />--pull-filter accept "route 192.168.1."--pull-filter ignore "route "would remove all routes that do not start with 192.168.1.<br />This option may be used only on clients. Note that reject may result in a repeated cycle of failure and reconnect, unless multiple remotes are specified and connection to the next remote succeeds. To silently ignore an option pushed by the server, use ignore.</blockquote>
<br />
<dd style="background-color: white; font-family: Verdana, Arial, "Bitstream Vera Sans", Helvetica, sans-serif; font-size: 13px;"><br /></dd> Добавив в конфигурационный файл нужные строки:<br />
<blockquote class="tr_bq">
pull-filter ignore redister-dns</blockquote>
<blockquote class="tr_bq">
pull-filter ignore block-outside-dns</blockquote>
Получаем тишь и благодать:<br />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000000; background-color: #ffffff}
</style>
<br />
<blockquote class="tr_bq">
2019-02-06 22:38:37 Pushed option removed by filter: 'block-outside-dns'<br />
2019-02-06 22:38:37 Pushed option removed by filter: 'register-dns' </blockquote>
<blockquote class="tr_bq">
</blockquote>
</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-67543792250394539102018-05-30T09:46:00.001+03:002018-05-30T09:46:37.993+03:00Apple Notes -> Evernote<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Так случилось, что появился у меня Evernote Premium, ввиду чего захотелось перенести накопленные за пару лет работы заметки из Apple Notes туда. Нашелся замечательный applescript-файл, позволяющий сделать это быстро и вкусно. Спасибо перечисленным в заголовке авторам и вообще всем участникам <a href="https://discussion.evernote.com/topic/64814-apple-notes-app/" target="_blank">треда</a>.</div>
<blockquote class="tr_bq" style="text-align: justify;">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; color: #5f6060}
p.p2 {margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; color: #5f6060; min-height: 15.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color: #5f6060}
p.p4 {margin: 0.0px 0.0px 0.0px 98.2px; text-indent: -98.2px; font: 12.0px Verdana; color: #5f6060}
p.p5 {margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color: #5f6060; min-height: 15.0px}
p.p6 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #5f6060}
p.p7 {margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p8 {margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; color: #4e8f00}
p.p9 {margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; color: #000000}
p.p10 {margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p11 {margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color: #000000}
p.p12 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p13 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #0433ff}
p.p14 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #000000}
p.p15 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #012fbe}
p.p16 {margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color: #4e8f00}
p.p17 {margin: 0.0px 0.0px 0.0px 117.8px; text-indent: -117.8px; font: 12.0px Verdana; color: #4e8f00}
p.p18 {margin: 0.0px 0.0px 0.0px 157.1px; text-indent: -157.2px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p19 {margin: 0.0px 0.0px 0.0px 157.1px; text-indent: -157.2px; font: 12.0px Verdana; color: #4e8f00}
p.p20 {margin: 0.0px 0.0px 0.0px 157.1px; text-indent: -157.2px; font: 12.0px Verdana; color: #000000}
p.p21 {margin: 0.0px 0.0px 0.0px 196.4px; text-indent: -196.4px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p22 {margin: 0.0px 0.0px 0.0px 196.4px; text-indent: -196.4px; font: 12.0px Verdana; color: #5f6060}
p.p23 {margin: 0.0px 0.0px 0.0px 196.4px; text-indent: -196.4px; font: 12.0px Verdana; color: #000000}
p.p24 {margin: 0.0px 0.0px 0.0px 196.4px; text-indent: -196.4px; font: 12.0px Verdana; color: #4e8f00}
p.p25 {margin: 0.0px 0.0px 0.0px 235.7px; text-indent: -235.7px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p26 {margin: 0.0px 0.0px 0.0px 235.7px; text-indent: -235.7px; font: 12.0px Verdana; color: #5f6060}
p.p27 {margin: 0.0px 0.0px 0.0px 235.7px; text-indent: -235.7px; font: 12.0px Verdana; color: #000000}
p.p28 {margin: 0.0px 0.0px 0.0px 274.9px; text-indent: -275.0px; font: 12.0px Verdana; color: #000000; min-height: 15.0px}
p.p29 {margin: 0.0px 0.0px 0.0px 274.9px; text-indent: -275.0px; font: 12.0px Verdana; color: #4e8f00}
p.p30 {margin: 0.0px 0.0px 0.0px 274.9px; text-indent: -275.0px; font: 12.0px Verdana; color: #5f6060}
p.p31 {margin: 0.0px 0.0px 0.0px 274.9px; text-indent: -275.0px; font: 12.0px Verdana; color: #000000}
p.p32 {margin: 0.0px 0.0px 0.0px 274.9px; text-indent: -275.0px; font: 12.0px Verdana; color: #012fbe}
span.s1 {font-variant-ligatures: no-common-ligatures}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #4e8f00}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #0433ff}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #812fdc}
span.s6 {font-variant-ligatures: no-common-ligatures; color: #5f6060}
span.s7 {font-variant-ligatures: no-common-ligatures; color: #012fbe}
span.s8 {font-variant-ligatures: no-common-ligatures; color: #5730be}
span.Apple-tab-span {white-space:pre}
</style>
<div class="p1">
<span class="s1">(*</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>====================================================</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p4">
<span class="s1"><span class="Apple-converted-space"> </span>[EN] Import Apple Notes into Evernote</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>====================================================</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>DATE:<span class="Apple-converted-space"> </span>2013-10-24</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>AUTHOR: d.b.walker</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>REVISED BY:<span class="Apple-converted-space"> </span>JMichaelTX on 2016-03-28 to make BUG fix. <https: apple-notes-app="" comment-395941="" discussion.evernote.com="" topic=""></https:></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>REF:</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p4">
<span class="s1"><span class="Apple-converted-space"> </span>• Importing from Apple Mail.app's Notes - Mac Help - Evernote User Forum<span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p4">
<span class="s1"><span class="Apple-converted-space"> </span>• https://discussion.evernote.com/topic/4046-importing-from-apple-mailapps-notes/?do=findComment&comment=236445</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>Posted 24 Oct 2013</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>Modified this script to work with Mavericks Notes, which is no longer in the mail app.</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>Added the original creation and modification dates</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>Added multiple tags - replace with your own</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>Did not add the long note name fix (I needed to preserve my note names)</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>====================================================</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>FURTHER DEVELOPED BY: Nigel Garvey 2017-03-21/22/23, based on information in the Evernote fora, to allow a choice of Notes source folder(s) and to handle attachments.</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p5">
<span class="s1"><span class="Apple-converted-space"> </span></span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p3">
<span class="s1"><span class="Apple-converted-space"> </span>CAVEATS:</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p6">
<span class="s1"><span class="Apple-converted-space"> </span>1. I don't have Evernote and can't test that part of the code.</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p6">
<span class="s1"><span class="Apple-converted-space"> </span>2. (No longer relevant. Thanks to Yvan Koenig for the fix.)</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p6">
<span class="s1"><span class="Apple-converted-space"> </span>3. Any attachments are simply "appended" to the Evernote notes in the order they happen to be returned by Notes.</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p6">
<span class="s1"><span class="Apple-converted-space"> </span>4. The effect in Evernote of Notes's references to the attachments in the note HTML is unknown.</span></div>
<div class="p2">
<span class="s1"></span><br /></div>
<div class="p1">
<span class="s1">*)</span></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p8">
<span class="s1">main</span><span class="s2">()</span></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p7">
<span class="s1"></span><br /></div>
<div class="p9">
<span class="s1"><b>on</b> </span><span class="s3">main</span><span class="s1">()</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p3">
<span class="s2"><span class="Apple-tab-span"> </span></span><span class="s1">-- User choice of one or more Notes folders (by name).</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p11">
<span class="s1"><span class="Apple-tab-span"> </span><b>tell</b> </span><span class="s4"><i>application</i></span><span class="s1"> "Notes"</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p13">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1"><b>activate</b></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p14">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">folderNames</span><span class="s1"> <b>to</b> </span><span class="s5">name</span><span class="s1"> <b>of</b> </span><span class="s4"><i>folders</i></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p15">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">chosenFolderNames</span><span class="s2"> <b>to</b> (</span><span class="s1"><b>choose from list</b></span><span class="s2"> </span><span class="s3">folderNames</span><span class="s2"> <b>with</b> </span><span class="s1">multiple selections allowed</span><span class="s2">)</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p14">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>if</b> (</span><span class="s3">chosenFolderNames</span><span class="s1"> <b>is</b> </span><span class="s5"><i>false</i></span><span class="s1">) <b>then</b> <b>error</b> </span><span class="s4">number</span><span class="s1"> -128 </span><span class="s6">-- Cancel button.</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p11">
<span class="s1"><span class="Apple-tab-span"> </span><b>end</b> <b>tell</b></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p3">
<span class="s2"><span class="Apple-tab-span"> </span></span><span class="s1">-- Preset HFS and POSIX versions of a path to a folder on the desktop for storing any attachments.</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p11">
<span class="s1"><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">tempFolderPath</span><span class="s1"> <b>to</b> (</span><span class="s7"><b>path to</b></span><span class="s1"> </span><span class="s8"><i>desktop</i></span><span class="s1"> </span><span class="s7">as</span><span class="s1"> </span><span class="s4"><i>text</i></span><span class="s1">) & "Attachments from Notes:"</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p16">
<span class="s2"><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">tempFolderPosix</span><span class="s2"> <b>to</b> </span><span class="s5">quoted form</span><span class="s2"> <b>of</b> </span><span class="s5">POSIX path</span><span class="s2"> <b>of</b> </span><span class="s1">tempFolderPath</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p3">
<span class="s2"><span class="Apple-tab-span"> </span></span><span class="s1">-- Repeat with each chosen folder name:</span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p11">
<span class="s1"><span class="Apple-tab-span"> </span><b>repeat</b> <b>with</b> </span><span class="s3">i</span><span class="s1"> <b>from</b> 1 <b>to</b> (</span><span class="s4"><b>count</b></span><span class="s1"> </span><span class="s3">chosenFolderNames</span><span class="s1">)</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p6">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Get all the notes in the folder with this name.</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p17">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">thisFolderName</span><span class="s2"> <b>to</b> </span><span class="s4"><i>item</i></span><span class="s2"> </span><span class="s1">i</span><span class="s2"> <b>of</b> </span><span class="s1">chosenFolderNames</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p14">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>tell</b> </span><span class="s4"><i>application</i></span><span class="s1"> "Notes" <b>to</b> <b>set</b> </span><span class="s3">theNotes</span><span class="s1"> <b>to</b> </span><span class="s4"><i>notes</i></span><span class="s1"> <b>of</b> </span><span class="s4"><i>folder</i></span><span class="s1"> </span><span class="s3">thisFolderName</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p17">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">quotedFolderName</span><span class="s2"> <b>to</b> </span><span class="s5">quoted form</span><span class="s2"> <b>of</b> </span><span class="s1">thisFolderName</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p6">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Repeat with each note in the folder:</span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p14">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>repeat</b> <b>with</b> </span><span class="s3">j</span><span class="s1"> <b>from</b> 1 <b>to</b> (</span><span class="s4"><b>count</b></span><span class="s1"> </span><span class="s3">theNotes</span><span class="s1">)</span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p19">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">thisNote</span><span class="s2"> <b>to</b> </span><span class="s4"><i>item</i></span><span class="s2"> </span><span class="s1">j</span><span class="s2"> <b>of</b> </span><span class="s1">theNotes</span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p20">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>tell</b> </span><span class="s4"><i>application</i></span><span class="s1"> "Notes"</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p22">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Get the relevant note data.</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">myTitle</span><span class="s1"> <b>to</b> <b>the</b> </span><span class="s5">name</span><span class="s1"> <b>of</b> </span><span class="s3">thisNote</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">myText</span><span class="s1"> <b>to</b> <b>the</b> </span><span class="s5">body</span><span class="s1"> <b>of</b> </span><span class="s3">thisNote</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">myCreateDate</span><span class="s1"> <b>to</b> <b>the</b> </span><span class="s5">creation date</span><span class="s1"> <b>of</b> </span><span class="s3">thisNote</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">myModDate</span><span class="s1"> <b>to</b> <b>the</b> </span><span class="s5">modification date</span><span class="s1"> <b>of</b> </span><span class="s3">thisNote</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p24">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">myAttachments</span><span class="s2"> <b>to</b> <b>the</b> </span><span class="s4"><i>attachments</i></span><span class="s2"> <b>of</b> </span><span class="s1">thisNote</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p22">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Any attachments will need to be extracted to the folder on the desktop and attached to the Evernote note from there.</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p22">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- To preserve the attachment names and avoid confusion in the case of duplicated names, each attachment is saved to a separate subfolder in a hierarchy based on the folder/note/attachment structure.<span class="Apple-converted-space"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p24">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">attachmentFiles</span><span class="s2"> <b>to</b> {}</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p24">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">attachmentCount</span><span class="s2"> <b>to</b> (</span><span class="s4"><b>count</b></span><span class="s2"> </span><span class="s1">myAttachments</span><span class="s2">)</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>if</b> (</span><span class="s3">attachmentCount</span><span class="s1"> > 0) <b>then</b></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p26">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- If this note has any attachments, create or add to the hierarchy of the folder on the desktop to accommodate each one.</span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p27">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s7"><b>do shell script</b></span><span class="s1"> ("mkdir -p " & </span><span class="s3">tempFolderPosix</span><span class="s1"> & </span><span class="s3">quotedFolderName</span><span class="s1"> & "/'Note '" & </span><span class="s3">j</span><span class="s1"> & "/'Attachment '{1.." & </span><span class="s3">attachmentCount</span><span class="s1"> & "}")</span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p26">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Repeat with each attachment:</span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p27">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>repeat</b> <b>with</b> </span><span class="s3">k</span><span class="s1"> <b>from</b> 1 <b>to</b> </span><span class="s3">attachmentCount</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p29">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s1">thisAttachment</span><span class="s2"> <b>to</b> </span><span class="s4"><i>item</i></span><span class="s2"> </span><span class="s1">k</span><span class="s2"> <b>of</b> </span><span class="s1">myAttachments</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p30">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Put together a specifier for a file in which to save this attachment.</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p31">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">thisFile</span><span class="s1"> <b>to</b> (</span><span class="s3">tempFolderPath</span><span class="s1"> & </span><span class="s3">thisFolderName</span><span class="s1"> & ":Note " & </span><span class="s3">j</span><span class="s1"> & ":Attachment " & </span><span class="s3">k</span><span class="s1"> & ":" & </span><span class="s3">thisAttachment's</span><span class="s1"> </span><span class="s5">name</span><span class="s1">) <b>as</b> «</span><span class="s4"><i>class</i></span><span class="s1"> furl»</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p30">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Create the file before trying to save to it. (Suggested by Yvan Koenig.)</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p32">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1"><b>close access</b></span><span class="s2"> (</span><span class="s1"><b>open for access</b></span><span class="s2"> </span><span class="s3">thisFile</span><span class="s2">)</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p30">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Save the attachment to it.</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p30">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s4"><b>save</b></span><span class="s2"> </span><span class="s3">thisAttachment</span><span class="s2"> </span><span class="s4">in</span><span class="s2"> </span><span class="s3">thisFile</span><span class="s2"> </span><span class="s1">-- Now it works! Thanks, Yvan!</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p30">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span><span class="s1">-- Store the file specifier for the retrieval of the attachment below.</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p29">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> <b>end</b> <b>of</b> </span><span class="s1">attachmentFiles</span><span class="s2"> <b>to</b> </span><span class="s1">thisFile</span></div>
<div class="p28">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p27">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>repeat</b></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>if</b></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p20">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>tell</b></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p20">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>tell</b> </span><span class="s4"><i>application</i></span><span class="s1"> "Evernote"</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> </span><span class="s3">myNote</span><span class="s1"> <b>to</b> </span><span class="s4"><b>create note</b></span><span class="s1"> </span><span class="s4">with text</span><span class="s1"> </span><span class="s3">myTitle</span><span class="s1"> </span><span class="s4">title</span><span class="s1"> </span><span class="s3">myTitle</span><span class="s1"> </span><span class="s4">notebook</span><span class="s1"> "Imported From Notes" </span><span class="s4">tags</span><span class="s1"> ["imported_from_notes"]</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> <b>the</b> </span><span class="s5">HTML content</span><span class="s1"> <b>of</b> </span><span class="s3">myNote</span><span class="s1"> <b>to</b> </span><span class="s3">myText</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p24">
<span class="s2"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>repeat</b> <b>with</b> </span><span class="s1">thisFile</span><span class="s2"> <b>in</b> </span><span class="s1">attachmentFiles</span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p27">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>tell</b> </span><span class="s3">myNote</span><span class="s1"> <b>to</b> </span><span class="s4"><b>append</b></span><span class="s1"> </span><span class="s4">attachment</span><span class="s1"> </span><span class="s3">thisFile</span></div>
<div class="p25">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>repeat</b></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> <b>the</b> </span><span class="s5">creation date</span><span class="s1"> <b>of</b> </span><span class="s3">myNote</span><span class="s1"> <b>to</b> </span><span class="s3">myCreateDate</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p23">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>set</b> <b>the</b> </span><span class="s5">modification date</span><span class="s1"> <b>of</b> </span><span class="s3">myNote</span><span class="s1"> <b>to</b> </span><span class="s3">myModDate</span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p21">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p20">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>tell</b></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p18">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p14">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>end</b> <b>repeat</b></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p12">
<span class="s1"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span></div>
<div class="p11">
<span class="s1"><span class="Apple-tab-span"> </span><b>end</b> <b>repeat</b></span></div>
<div class="p10">
<span class="s1"><span class="Apple-tab-span"> </span></span></div>
<div class="p9">
<span class="s1"><b>end</b> </span><span class="s3">main</span></div>
<div class="p7">
<span class="s1"></span><br /></div>
</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-77626623394735208502018-04-27T09:19:00.002+03:002018-04-27T09:19:44.975+03:00SSH Agent auto add keys<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Когда количество ssh-ключей начинает расти, жонглировать ими становится печально. Случайно на <a href="https://www.reddit.com/r/osx/comments/52zn5r/difficulties_with_sshagent_in_macos_sierra/db71zyh/" target="_blank">реддите</a> нашелся замечательный лайфхак, как удобно работать с множеством ключей, не заморачиваясь ручным добавлением их в <b>ssh-agent</b>:</div>
<blockquote class="tr_bq">
Host *<br />UseKeychain yes<br />AddKeysToAgent yes<br />IdentityFile ~/.ssh/id_rsa<br />IdentityFile ~/.ssh/id_25519</blockquote>
<div style="text-align: justify;">
Один раз перечисляем все нужные ключи в начале <i>~/.ssh/config</i>, и все. </div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-52905612143528400442018-02-14T17:22:00.002+03:002018-02-14T17:22:20.032+03:00MacOS X High Sierra soft from unknown sources<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
В свежей макоси, которая High Sierra, из настроек безопасности (Системные настройки - Защита и безопасность - Основные - Разрешить использование программ, загруженных из:) убрали возможность установки ПО из неизвестных источников. Вернуть можно консольной командочкой: </div>
<blockquote class="tr_bq">
sudo spctl --master-disable</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-47404774638010055572018-02-07T14:36:00.003+03:002018-02-07T14:36:55.613+03:00QEMU\KVM: virtio-blk vs virtio-scsi<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Искал не так давно, а написали вот совсем недавно: отличная <a href="https://mpolednik.github.io/2017/01/23/virtio-blk-vs-virtio-scsi/" target="_blank">статейка</a> по сабжу. Последний абзац процитирую:</div>
<blockquote class="tr_bq" style="text-align: justify;">
Looking at the advantages of virtio-scsi, I believe it’s the correct choice as a default VM disk interface in oVirt. For optimized VMs, there is always the choice of manually switching to virtio-blk (or IDE, if you’re optimizing for slowness… or compatibility). For now, adding IO thread may cause more harm than good, therefore we’ll leave that for the future.</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-46221559780314917062017-12-05T09:21:00.002+03:002017-12-05T09:21:23.710+03:00Openssl: самое-самое<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Нечасто, но случается необходимость заглянуть внутрь openssl-сертификата, сгенерировать или подписать новый, сконвертировать из одного формата в другой. Отличная <a href="https://www.sslshopper.com/article-most-common-openssl-commands.html" target="_blank">подборка</a> самых частых команд.</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-9135642628090341182017-11-20T16:21:00.003+03:002017-11-20T16:21:59.070+03:00yum: a lot of duplicate packages<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Пришел сегодня коллега с проблемой: в процессе обновления завис yum, а после рестарта виртуалки случился kernel panic на старте. И если рабочую систему мы получили, просто загрузившись с предыдушей версии ядра, то проблемы с менеджером пакетов решали еще некоторое время. А проблема оказалась такая: при попытке совершить любые действия с пакетами yum находил вагон и маленькую тележку пакетов в состоянии duplicate. Аналогичный результат выдавал и yum check. Выискивать и удалять полторы сотни дубликатов руками - не вариант.</div>
<div style="text-align: justify;">
После некоторого количества изысканий пришли к следующему решению:</div>
<blockquote class="tr_bq">
# package-cleanup --cleandupes --skip-broken<br /># yum clean all<br /># yum update</blockquote>
<div>
<br /></div>
<div>
<br /></div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-54431665368152519572017-10-27T15:46:00.005+03:002017-10-27T15:46:51.424+03:00github.com/de1ayer<div dir="ltr" style="text-align: left;" trbidi="on">
Дошли руки выложить некоторые наработки за последние полгода, чтобы не забылись.</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-67638043558170767512017-10-16T10:58:00.002+03:002017-10-16T10:58:40.991+03:00YUM: установка пакета конкретной версии<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Посмотреть доступные версии пакета, причем с выводом в том виде, который скушает <b>yum</b>: </div>
<blockquote class="tr_bq">
[root@git03 gitlab]# repoquery --show-duplicates gitlab-ce | grep 9.5<br />gitlab-ce-0:8.9.5-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.0-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.1-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.2-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.3-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.4-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.5-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.6-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.7-ce.0.el7.x86_64<br />gitlab-ce-0:9.5.8-ce.0.el7.x86_64</blockquote>
<div style="text-align: justify;">
Сам бы ни в жизнь не догадался так записать О_о, тем более что установленный пакет выглядит так:</div>
<blockquote class="tr_bq" style="text-align: justify;">
[root@dpro-git03 gitlab]# yum -q list installed gitlab-ce<br />Installed Packages<br />gitlab-ce.x86_64 9.5.5-ce.0.el7 @gitlab_gitlab-ce</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-16535269996272161272017-10-12T16:16:00.000+03:002017-10-12T16:16:00.386+03:00cURL + GitHub<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Не достает времени заняться пополнением своих заметок. Оставлю пару ссылок на отличные сборники рецептов по использованию API GitHub (и любых других) с помощью <a href="https://curl.haxx.se/" target="_blank">cURL</a>. Вот <a href="https://gist.github.com/caspyin/2288960" target="_blank">одна</a>, вот <a href="https://gist.github.com/subfuzion/08c5d85437d5d4f00e58" target="_blank">вторая</a>. Спасибо авторам, пешыте исчо.</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-88515505409206794522017-09-15T13:16:00.000+03:002017-09-15T13:19:20.104+03:00Equivalent of update-grub for RHEL/Fedora/CentOS<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Неведомо почему, но в RedHat-based дистрибутивах нет команды grub-update (update-grub). Приходится для регенерации конфигурационного файла загрузчика помнить вот такое:</div>
<blockquote class="tr_bq">
grub2-mkconfig -o "$(readlink /etc/grub2.cfg)"</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-69967479598011115052017-08-07T15:03:00.001+03:002017-08-07T15:03:26.347+03:00clear bash history.<div dir="ltr" style="text-align: left;" trbidi="on">
<blockquote class="tr_bq">
history -c && history -w; exit</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-84376598241585371452017-08-05T10:23:00.001+03:002017-08-05T10:23:20.747+03:00vCenter Web Client fails to start<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
После установки очередного пакета обновлений ОС на одном из vCenter появилась проблема доступа к интерфейсу vSphere. Практически сразу стало ясно, что проблема в незапущенной службе Web Client. Ручной перезапуск службы работоспособность системы восстанавливал, но до первой перезагрузки. </div>
<div style="text-align: justify;">
Оказалось, что "это не бага, это фича"(с). Описание и решение нашлось <a href="https://communities.vmware.com/thread/544992" target="_blank">тут</a>. Если кратко, то служба стартовала слишком рано, поэтому останавливалась с ошибкой. Решение - изменить свойства запуска на Automatic (Delayed Start) и увеличить с помощью ключа в реестре время задержки с умолчальных 120 до 300 секунд.</div>
<blockquote class="tr_bq">
Create a new key 'AutoStartDelay' (DWORD (32-bit) under HKLM\SYSTEM\CurrentControlSet\services\vspherewebclientsvc and set it to decimal 300. Default delay is 120 seconds. Oh and you should check the key 'DelayedAutostart' that it is set to 1.</blockquote>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-60399304885228789872017-06-21T10:56:00.003+03:002017-06-21T10:56:46.994+03:00Lookaround assertions in Python<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Приходится по рабочим задачкам ковыряться в регулярках на питоне. И очень плохо в голову складывалась такая удобная штука как <a href="https://docs.python.org/2/howto/regex.html#lookahead-assertions" target="_blank">Lookahead\Lookbehind assertions</a>. Ясности сильно добавила вот <a href="http://www.rexegg.com/regex-lookarounds.html#stand_their_ground" target="_blank">эта статья</a>, где с примерами и пояснениями разложена как сама концепция, так и особенности практического применения.</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-4701080110487060222017-05-15T17:12:00.003+03:002017-05-15T17:12:43.812+03:00ansible host_vars<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Оказался в моем <b>inventory</b> старый-старый хост, при работе с которым даже <b>ping</b> падал.</div>
<br />
<blockquote class="tr_bq">
<b>˜# ansible -m ping old.example.com -e ansible_user=ansible</b><br /> [WARNING]: Module invocation had junk after the JSON data: usage: sudo -e [-S] [-p prompt] [-u username|#uid] file ...<br />old.example.com | FAILED! => {<br /> "changed": false,<br /> "failed": true,<br /> "module_stderr": "Shared connection to 192.168.0.1 closed.\r\n",<br /> "module_stdout": "sudo: illegal option `-n'\r\nusage: sudo -h | -K | -k | -L | -l | -V | -v\r\nusage: sudo [-bEHPS] [-p prompt] [-u username|#uid] [VAR=value]\r\n {-i | -s | <command></command>}\r\nusage: sudo -e [-S] [-p prompt] [-u username|#uid] file ...\r\n",<br /> "msg": "MODULE FAILURE",<br /> "rc": 1</blockquote>
<div style="text-align: justify;">
Дело оказалось в том, что со второй версии изменился набор опций для вызова sudo: добавился параметр -n, которого "старые" sudo могут не знать. Так как подобных хостов у меня пара штук, менять ради них настройки по умолчанию неинтересно. Вместо этого воспользуемся функционалом <a href="http://docs.ansible.com/ansible/intro_inventory.html#host-variables" target="_blank">Host Variables</a>. Идея простая, нам нужно чтобы переменная окружения <b>ansible_sudo_flags</b> не содержала в себе <b>-n</b> для хоста <b>old.example.com</b>. Решение:</div>
<blockquote class="tr_bq" style="text-align: justify;">
# cat /data/ansible/inventory/host_vars/old.example.com.yml<br />---<br />## fix ansible regression for old distros (no -n option with sudo)<br />##<br />ansible_sudo_flags: "-H"</blockquote>
Почитать о том, какая переменная и откуда важнее при выполнении заданий, можно <a href="http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable" target="_blank">тут</a>.</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com0tag:blogger.com,1999:blog-7514425272082487617.post-61468502582231265092017-05-03T16:49:00.001+03:002017-05-03T16:49:06.511+03:00ansible + cmdbuild<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Как известно, любые задачи вокруг <b>ansible</b> начинаются с перечня ресурсов, управление которыми требуется. Основным способом инвентаризации является обычный текстовый файл (по умолчанию <ansible_dir>/hosts) c перечнем имен или адресов серверов. Многие знают, что при указании в качестве пути директории <b>ansible</b> будет использовать все находящиеся внутри оной файлы как источники данных о хостах.</ansible_dir></div>
<div style="text-align: justify;">
Однако при количестве хостов более пары десятков файлы становится трудно поддерживать в актуальном состоянии, и тогда на помощь приходят различные системы инвентаризации и управления активами. В случае с виртуальными средами такой системой в первом приближении является гипервизор (или вышестоящее ПО, типа vsphere, proxmox, etc). При наличии подобной базы данных единственно правильным и удобным решением является или автоматизация процесса синхронизации локальных inventory-файлов ansible с данными этой базы, или прямое использование данных базы во время выполнения плейбука - <a href="http://docs.ansible.com/ansible/intro_dynamic_inventory.html" target="_blank">dynamic inventory</a>. Для многих случаев <a href="https://github.com/ansible/ansible/tree/devel/contrib/inventory" target="_blank">существуют</a> готовые скрипты, реализующие функционал динамического построения списка хостов. Также есть <a href="https://docs.ansible.com/ansible/dev_guide/developing_inventory.html" target="_blank">страничка</a>, где описываются основные моменты, необходимые для написания собственного решения.</div>
<div style="text-align: justify;">
Но вот с программированием (да, даже на питоне :\) у меня никак, поэтому пришлось обходиться средствами самого <b>ansible</b>, а именно: для взаимодействия с CMDBuild пришлось написать плейбук, который актуализирует локальный inventory-файл.</div>
<div style="text-align: justify;">
Далее я хочу сохранить для истории все тонкости и интересные с точки зрения изучения продукта моменты, возникшие в процессе разработки этого решения.</div>
<div style="text-align: justify;">
Итак, в качестве средства инвентаризации и хранения данных об информационных ресурсах используется <a href="http://www.cmdbuild.org/en" target="_blank">CMDBuild</a>. Для автоматизированного общения с базой данных доступен REST API, познакомиться с которым можно вот <a href="http://www.cmdbuild.org/en/documentazione/manuali/webservice-manual" target="_blank">тут</a>. </div>
<div style="text-align: justify;">
Так как неавторизованным пользователям доступ не предоставляется (401 при любом запросе), первая задача: пройти аутентификацию. <i>Замечание: как выяснилось в процессе отладки, сервисные учетные записи (в отличие от учетных записей пользователей) не могут быть использованы в веб-интерфейсе, только через API</i>.</div>
<div style="text-align: justify;">
Здесь и далее для работы с http-запросами используется ansible-модуль <b>uri</b>. Как обычно, <a href="http://docs.ansible.com/ansible/uri_module.html" target="_blank">документация</a> к модулю достаточно полна и снабжена примерами, чтобы разобраться в его использовании.</div>
<blockquote class="tr_bq" style="text-align: justify;">
- name: Get ID and open session with CMDBuild API<br /> uri:<br /> url: "{{cmdb_url}}/sessions"<br /> validate_certs: no<br /> method: POST<br /> body: "{\"username\" : \"{{cmdb_user}}\" , \"password\" : \"{{cmdb_pass}}\"}"<br /> body_format: json<br /> status_code: 200<br /> headers:<br /> Content-Type: application/json<br /> register: auth_result</blockquote>
<div style="text-align: justify;">
Стоит указать, что значение <span style="font-family: Courier New, Courier, monospace;"><b>{{cmdb_url}}</b></span> стоит подсмотреть в документации, в моем случае он выглядит примерно так: "https://cmdb.example.com/cmdbuild/services/rest/v2" , а учетные данные (<span style="font-family: Courier New, Courier, monospace;"><b>{{cmdb_user}}</b></span> и <span style="font-family: Courier New, Courier, monospace;"><b>{{cmdb_pass}}</b></span>) не следует держать в открытом виде. В случае ansible 2.3+ наиболее удобным способом будет использование in-place vault:</div>
<blockquote class="tr_bq" style="text-align: justify;">
cmdb_user: !vault |<br /> $ANSIBLE_VAULT;1.1;AES256<br /> 666239373962396262623031663239613432663366383435393634653436366133326339373735373063306464626631613765326331343364356337313432330a386164303261623339326435613862323433386361343262383432326439653235333665313666623431343532616437376163666561613737343535336533610a6234343263376465626264333630306639626137616165373066643034336262</blockquote>
<div style="text-align: justify;">
Для более ранних версий - отдельный vault-файл, который следует подгрузить через <b>include_vars</b>. Подробнее о хранилище <b>ansible-vault</b> и методах работы с ним <a href="http://docs.ansible.com/ansible/playbooks_vault.html" target="_blank">тут</a>. </div>
<div style="text-align: justify;">
Итак, задание выше отправляет POST по адресу url c учетными данными в json-формате, считается выполненным при получении http-кода 200 и записывает результат выполнения (тоже json) в переменную <span style="font-family: Courier New, Courier, monospace;"><b>{{auth_result}}</b></span>.</div>
<div style="text-align: justify;">
Результатом этого запроса будет открытая на сервере сессия с идентификатором <b><span style="font-family: Courier New, Courier, monospace;">{{auth_result.json.data._id}}</span></b>, который далее необходимо вкладывать в заголовок каждого запроса. </div>
<div style="text-align: justify;">
Далее, имея доступ к дереву ресурсов (в рамках прав учетной записи), можно запросить требуемые нам данные. В CMDBuild есть свои встроенные фильтры, которые можно передавать через http в виде параметра <b>?filter=</b>, а также свой sql-подобный язык запросов CQL, передающийся через параметр <b>?cql=</b>. Мои потребности полностью покрывались фильтрами, поэтому cql-запросы не рассматривались.</div>
<div style="text-align: justify;">
Однако с фильтрами тоже все непросто. В текущей версии документации эта тема практически не затронута. <a href="http://www.cmdbuild.it/forum/forum-in-english/304195182" target="_blank">Где-то</a> на форумах нашлось описание конструкции фильтра:</div>
<blockquote class="tr_bq" style="text-align: left;">
'{"filter": {"attribute": "Description","operator":"contain","value":["SomeValue"],"parameterType":"fixed" }}'</blockquote>
<div style="text-align: justify;">
Там же поступило предложение настраивать фильтр в веб-интерфейсе и подглядывать за передаваемыми http-параметрами в окне консоли браузера. Иных способов пока, к сожалению, нет. В общем, неким магическим для меня образом было получено несколько фильтров, с каждым из которых был создан запрос. Вот пример одного из них:</div>
<blockquote class="tr_bq">
## filter_prod: Description<br /> ## Status: Production,[03]<br /> filter_prod: "?filter=%7B%22attribute%22%3A%7B%22simple%22%3A%7B%22attribute%22%3A%22Status%22%2C%22operator%22%3A%22equal%22%2C%22value%22%3A%5B03%5D%2C%22parameterType%22%3A%22fixed%22%7D%7D%7D"</blockquote>
<blockquote class="tr_bq">
- name: Query hosts with "Production" status (filter_prod)<br /> uri:<br /> url: "{{cmdb_url}}/classes/Server/cards{{filter_prod}}"<br /> validate_certs: no<br /> method: GET<br /> status_code: 200<br /> headers:<br /> CMDBuild-Authorization: "{{auth_result.json.data._id}}"<br /> Content-Type: application/json<br /> when: auth_result.json.data._id is defined<br /> register: prod_result<br /> no_log: yes</blockquote>
<div style="text-align: justify;">
Большая часть из описания задания совпадает с вышесказанным. Из особенностей: добавлен дополнительный параметр headers, где передается токен авторизации - <b>CMDBuild-Authorization</b> (название которого тоже, как и в случае с фильтрами, не освещено в документации). Результат выполнения GET запроса - JSON с описанием карточек всех ресурсов класса "Server", подходящих под фильтр <span style="text-align: left;"><span style="font-family: Courier New, Courier, monospace;"><b>{{filter_prod}}</b></span>. Так как вывод идет в stdout, количество выпавшей в консоль информации может удивить, поэтому добавлен параметр </span><span style="text-align: left;"> </span><span style="text-align: left;"><b>no_log: yes</b>, запрещающий любой вывод результатов этого задания вне зависимости от уровня журналирования.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;">Также добавлено условие выполнения задания: </span><span style="text-align: left;"><b>when: auth_result.json.data._id is defined</b>. В случае неуспешной аутентификации плейбук не будет сыпать ошибками, а просто завершится без выполнения запросов.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;">После выполнения всех запросов хорошим тоном будет закрыть сессию:</span></div>
<blockquote class="tr_bq" style="text-align: left;">
- name: Close session with CMDBuild API<br /> uri:<br /> url: "{{cmdb_url}}/sessions/{{auth_result.json.data._id}}"<br /> validate_certs: no<br /> method: DELETE<br /> status_code: 204<br /> headers:<br /> CMDBuild-Authorization: "{{auth_result.json.data._id}}"</blockquote>
<div style="text-align: justify;">
<span style="text-align: left;"></span></div>
<div style="text-align: justify;">
Отмечу лишь, что успешный код выполнения этого запроса: 204.</div>
<div style="text-align: justify;">
Для удобства дальнейшего использования полученные списки хостов следует прогруппировать, для этого запишем названия необходимых групп в inventory-файл:</div>
<blockquote class="tr_bq">
- name: Create ansible groups<br /> lineinfile:<br /> state: present<br /> dest: "{{cmdb_inventory}}"<br /> regexp: '^{{ item|replace("[", "\[")|replace("]", "\]") }}'<br /> line: '{{ item }}'<br /> insertbefore: BOF<br /> create: yes<br /> with_items:<br /> - '[cmdb-prod]'</blockquote>
<div style="text-align: justify;">
Из особенностей здесь описание регулярки: помимо обычного указания элемента здесь последовательно используется два фильтра <b>replace</b>, подставляющих символ экранирования для квадратных скобок. Без этого изменения мы получаем не выражение для поиска, а диапазон символов, и поиск не срабатывает. За подсказку по проблеме спасибо автору <a href="https://sparanoid.com/note/ansible-advanced-lineinfile/" target="_blank">этого</a> поста.</div>
<div style="text-align: justify;">
Наконец, осталось лишь записать выгруженные хосты в файл.</div>
<blockquote class="tr_bq" style="text-align: justify;">
- name: Write '[cmdb-prod]' hosts to inventory file<br /> lineinfile:<br /> state: present<br /> dest: "{{cmdb_inventory}}"<br /> line: "{{item}}"<br /> insertafter: '^\[cmdb-prod\]'<br /> with_items: "{{ prod_result.json.data | map(attribute='HostName') | list | sort(reverse = True) }}"</blockquote>
<div style="text-align: justify;">
Стоит пояснить происходящее внутри параметра <b>with_items</b>. Если содержимое переменной в Ansible - JSON, то к ее элементам можно получить доступ через var_name.json. В выводе CMDBuild присуствуют массивы meta и data, содержимое последнего нас и интересует. Далее используется фильтр <b>map</b>, который показывает только содержимое атрибута <b>HostName</b> внутри <b>prod_result.json.data</b>. Однако вывод остается в формате JSON, поэтому используется фильтр <b>list</b>, делающий из него <b>plaintext</b>. Сортировка по убыванию используется потому, что каждый <b><span style="font-family: Courier New, Courier, monospace;">{{item}}</span></b> вставляется после <b>[cmdb-prod]</b>, и таким образом мы получаем в итоге сортированный в алфавитном порядке список.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
В процессе разработки плейбука запросы приходилось делать множество раз, поэтому очень полезным оказался проект <a href="https://github.com/micha/resty" target="_blank">resty</a>. Это обертка над curl, которая встраивается в текущий шелл и позволяет более просто делать различные http-запросы.</div>
<blockquote class="tr_bq">
</blockquote>
<div style="text-align: justify;">
:</div>
</div>
delayerhttp://www.blogger.com/profile/05936704021563775893noreply@blogger.com2