Рубрика: Новости

  • Ubuntu NFS Server

    Для обмена файлами между серверами организации мне понравилось использоваться NFSv4

    Штука прикольная, но самая её радость в простоте настройке и запуске

    Ставим

    apt-get install nfs-kernel-server nfs-common portmapCode language: Bash (bash)

    Идём в файл
    /etc/exports

    А там 2 примера!
    но мы посмотрим на другие

    /mnt/files    192.168.1.1/24(rw,no_root_squash,async)Code language: Bash (bash)

    Каталог /mnt/files станет доступен с сети 192.168.1.1/24 на полный контроль, даже на файлы рутовские.

    Или еще пример:

    /home/saber/    192.168.1.12(ro,async)Code language: Bash (bash)

    Домашний каталог сабера стал доступен по чтению только с компа 192.168.1.12

    Вот и вся магия.

    теперь применяем изменения

    /etc/init.d/nfs-kernel-server restart Code language: Bash (bash)

    Теперь на втором компе ( где хотим примонтировать эту ФС) делаем так

    showmount -e 192.168.100.6Code language: Bash (bash)

    Так мы посмотрим что есть вкусного на 192.168.100.6 машине.

    Export list for 192.168.100.6:
    /mnt/1500 192.168.100.1/24Code language: Bash (bash)

    Вот нам видно, что на 6й машине есть сетевой ресурс /mnt/1500 — доступный всей сети.

    смонтируем себе его (возможно понадобится пакет nfs-common если что устанавливаем)

    Создадим каталок куда будем монтировать

    mkdir /mnt/serverCode language: Bash (bash)
    mount 192.168.100.6:/mnt/1500 /mnt/serverCode language: Bash (bash)

    и всё радуемся, кидаемся файлами и папками

  • Хороший визуальный редактор Joomla

    Этот год на сайты более горячий, чем прошлый, но хочу поделиться одним открытием, без которого мне сложно обучить красиво и быстро оформлять материалы на сайтах под управлением Jommla.

    Это сторонний визуальный редактор

    Умеет «искаропки» загружать файлы\картинки на сервер, линковаться уже существующие материалы и многое другое 🙂

    бесплатно скачать без всяких бэкдоров и шеллов можно с Официального сайта Правда, после регистрации. Но этого стоит того! 😉

  • Joomla sitemap.xml

    Для своевременного индексирования сайта гуглом, я использую плагин JCrawler
    я перепробовал много, всяких разных, но именно этот на всех хостингах без всяких проблем создаёт файл sitemap.xml

  • django + twitter

    «Мопед не мой, я лишь объяву разместил»
    У меня пока не хватает кармы, чтоб высылать за такие статьи инвайты на хабр, поэтому видимо кроме меня этого не жалает делать никто, то буду опубликовать тут. ибо информацию считаю полезной, не только для себя.

    Доброго времени суток!
    Появилась необходимость следующего характера: в движке на django, при публикации новости, чтоб создавался кросс-пост на twitter. Т.е. пишем новость, жмём сохранить и на твиттере появляется пост аля «Название статьи, bit.ly/s/ссылка_на_нашу_новость».

    Для реализации потребовались следующие пакеты:

    1. python-oauth2 | https://github.com/simplegeo/python-oauth2
    2. oauth-python-twitter2 | http://code.google.com/p/oauth-python-twitter2/
    3. simplejson | http://pypi.python.org/pypi/simplejson/
    4. oauth2 | http://pypi.python.org/pypi/oauth2/
    5. bitlyapi | http://pypi.python.org/pypi/bitlyapi/

    1-4 пакеты нужны нам для связи с twitter’ом, 5-ый для укорачивания ссылок…
    Перед тем как начать предполагаю, что у Вас есть аккаунт в twitter.com и bit.ly. Если нет, то это по минуте на регистрацию на каждом из сервисов.

    Начнём с twitter’a…

    При-python-им twitter

    Проставляем все пакеты и выполняем следующие действия (кстати они описаны выше в руководстве python-oauth2):
    Логинимся в браузере в twitter.com, и после этого переходим по ссылке http://twitter.com/apps/new. Далее мы воспользуемся инструкциями из замечательной статьи:

    1. Заполняем все поля на свое усмотрение, для Application Type выбираем Client
    2. Для Default Access type выбираем Read & Write, Use Twitter for login я оставил не выбранным
    3. Вводим капчу и сабмитим

    После этого twitter сгенерит CONSUMER_KEY, CONSUMER_SECRET.
    Следующие два параметра нам вернет такой скрипт

    from oauthtwitter import OAuthApi
    import pprint
    
    CONSUMER_KEY = "*****"
    CONSUMER_SECRET = "*****"
    
    twitter = OAuthApi(consumer_key, consumer_secret)
    temp_credentials = twitter.getRequestToken()
    print(twitter.getAuthorizationURL(temp_credentials))
    oauth_verifier = raw_input('What is the PIN? ')
    access_token = twitter.getAccessToken(temp_credentials, oauth_verifier)
    
    print("oauth_token: " + access_token['oauth_token'])
    print("oauth_token_secret: " + access_token['oauth_token_secret'])Code language: Python (python)

    В CONSUMER_KEY, CONSUMER_SECRET вводим значения полученные на предыдущем этапе, запускаем. Скрипт сгенерит url, переходим по нему и копируем PIN который нам вежливо предлагает twitter. Вставляем PIN в скрипт, он как раз его ждет.

    На выходе мы получим значения для двух последних параметров OAUTH_TOKEN и OAUTH_TOKEN_SECRET.
    Все, теперь у нас есть все что надо для oauth авторизации, осталось немного подправить скрипты.

    Готовимся сокращать ссылки вместе с bit.ly

    Предельно простой и удобный модуль bitlyapi. Схема простая:

    1. Регистрируемся на bit.ly
    2. Логинимся
    3. Переходим по ссылке
    4. Копируем username и api key

    Правим модель в Django

    Здесь мы не рассматриваем создание модели, предполагается, что Вы это умеете. В шапку добавляем:

    #twitter
    import oauth2 as oauth
    import bitlyapi
    bitly = bitlyapi.BitLy('username bitly', 'api key bitly') #вводим данные с прошлого шага
    from oauthtwitter import OAuthApi
    CONSUMER_KEY = "*****вводим свои данные*****"
    CONSUMER_SECRET = "*****вводим свои данные*****"
    OAUTH_TOKEN = "*****вводим свои данные*****"
    OAUTH_TOKEN_SECRET = "*****вводим свои данные*****"
    twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)Code language: Python (python)

    Переходим к моделе. Логика проста, есть boolean поле twitter_export, если галочка ставится, то новость публикуется при сохранении на твиттере. Если не понятно, то сейчас всё увидите и поймёте ))

    class News(models.Model):
        title = models.CharField(max_length=300)
        content = models.TextField()
        twitter_export = models.BooleanField(default=False)
    
    def save(self):
        link = bitly.shorten(longUrl='http://example.com/news/' + str(self.id) + '/') #формируем ссылку, которая будет сокращенна
        if self.twitter_export:   #если стоит галочка на twitter_export
            twit = u'%s... | Читать %s' % (self.title[:70], link['url'])  #формируем, что писать в твиттер.. учтите, что длина сообщения в твиттере 160 символов
            twitter.UpdateStatus(twit) #публикуем наш твит
            self.twitter_export = False #убираем галку twitter_export
        super(News, self).save()Code language: Python (python)

    Всё готово! Можно тестировать!

    Источники

    1. Пишем twitter-бота на python
    2. Twitter Three-legged OAuth Example

  • Создание панели для Django Debug Toolbar

    Велосипед не мой, я лишь объяву разместил.

    У меня пока не хватает кармы на хабре, чтоб раздавать инвайты за полезные статьи, так что приходится, пока просто копировать в «бложик», ибо они совсем выпадут из выдачи гугла.


    Создание панели для Django Debug Toolbar

    При отладке джангопроектов становиться необходимостью просмотр различной отладочной информации.
    На вопрос отладки в полной мере отвечает приложение Django Debug Toolbar. Воспользуемся возможностью расширения функционала DDT и создадим панель для собственных нужд.

    Создание панели

    Так как системы контроля версий повсеместно используются для работы над проектами, время от времени возникает необходимость проверить когда тот или иной коммит был добавлен.
    По причине того, что я использую git, данная панель будет взаимодействовать именно с этой vcs.
    Примером при написании панели послужило приложение django-git, созданное с целью замены gitweb.
    В качестве обертки для git был использован модуль GitPython.
    Сначала напишем модуль с производным классом от DebugPanel (к примеру, в директории с каким-нибуть из приложений), назовем его panels.py:

    import os
    import time
    
    from git import *
    from debug_toolbar.panels import DebugPanel
    from django.template.loader import render_to_string
    
    class GitStatusPanel(DebugPanel):
    	name = 'Git'
    	has_content = True
    
    	def nav_title(self):
    		return self.name
    
    	def title(self):
    		return self.name
    
    	def url(self):
    		return ''
    
    	def content(self):
    		repo_path = '../GitPython'
    		repo = Repo(repo_path)
    		return render_to_string('debug_toolbar/panels/commits.html', {'commits': repo})Code language: Python (python)

    repo_path — относительный путь к репозиторию.
    Так как GitPython возвращает время добавления коммита в формате unixtime, напишем templatetag для конвертации даты в нужную форму.

    app_name/templatetags/cdate.py:

    import time
    
    from django import template
    
    register = template.Library()
    
    @register.filter
    def cdate(value):
    	date = time.strftime("%d.%M.%Y, %H:%M:%S", time.localtime(value))
    	return dateCode language: Python (python)

    Затем, создадим шаблон страницы в директории с остальными шаблонами DDT (templates/debug_toolbar/panels/commits.html) следующего содержания:

    	{% load i18n %}
    	{% load cdate %}
    	 <table>
    		 <thead>
    			 <tr>
    				 <th>Commit </th>
    				 <th>Date </th>
    				 <th>Author </th>
    			 </tr>
    		 </thead>
    		 <tbody>
    			{% for commit in commits.iter_commits %}
    				 <tr class="{% cycle 'djDebugOdd' 'djDebugEven' %}">
    					 <td><a href="/__debug__/commit/{{commit}}" class="remoteCall">{{commit}} </a></td>
    					 <td>
    						{{commit.committed_date|cdate}}
    					 </td>
    					 <td>
    						{{commit.committer.name}}, {{commit.committer.email}}
    					 </td>
    				 </tr>
    			{% endfor %}
    		 </tbody>
    	 </table>Code language: HTML, XML (xml)

    В результате получилась панель со списком коммитов:

    Так как задачей было также отобразить список действий в рамках коммитов, напишем соответствующую страницу.
    Правим urls.py:

    urlpatterns = patterns('',
    	...
    	(r'^__debug__/commit/([a-z0-9]+)$', show_commit),
    )Code language: Python (python)

    Добавим функцию show_commit к вьюхам приложения app_name (app_name/views.py) или к вьюхам проекта (views.py):

    def show_commit(request, commit):
    	repo_path = '../GitPython'
    	repo = Repo(repo_path)
    	commit_item = repo.commit(commit)
    	commit_diffs = commit_item.diff()
    	changes = []
    	for blob in commit_item.tree:
    		try:
    			changes.append({'path': blob[0].path, 'content': blob[0].data_stream.read()})
    		except:
    			changes.append({'path': blob.path, 'content': blob.data_stream.read()})
    	return render_to_response('debug_toolbar/panels/commit.html', {'commit': commit, 'commit_item': commit_item, 'commit_diffs': commit_diffs, 'changes': changes})Code language: Python (python)

    Воспользовавшись API модуля GitPython получили список изменений, а с помощью свойств объекта blob — путь к модифицированным файлам и их raw-содержимое.
    И наконец, создадим шаблон, templates/debug_toolbar/panels/commit.html:

    {% load i18n %}
    <div class="djDebugPanelTitle">
    	<a class="djDebugClose djDebugBack" href="">{% trans "Back" %}</a>
    	<h3>Commit {{commit}}</h3>
    </div>
    <div class="djDebugPanelContent">
    	<div class="scroll">
    	{% for diff in commit_diffs %}
    		<code><pre>{{diff}}
    
    
    {% if diff.deleted_file %}
    File was removed.
    {% endif %}
    {% if diff.new_file %}
    File was created.
    {% endif %}
    {% if diff.rename %}
    File was renamed: {{diff.rename_from}} → {{diff.rename_to}}
    {% endif %}
    {% endfor %}
    {% if commit_diffs %}
    Modified files
    
    {% for change in changes %}
    file: {{change.path}}
    
    {% autoescape off %}{{change.content}}{% endautoescape %}
    
    
    {% endfor %}
    {% endif %}Code language: Python (python)

    На данной странице будет отображен комментарий к коммиту, список изменений в рамках коммита, а также список путей и содержимого файлами, которые подверглись изменениям.
    Результат:

    При необходимости, можно добавить подсветку синтаксиса с помощью pygments.

    Материалы

    Страница проекта на github — https://github.com/robhudson/django-debug-toolbar,
    статья о создании своей панели — http://blog.akei.com/post/3600587187/creating-a-custom-panel-for-the-django-debug-toolbar.
    страница модуля GitPython — https://github.com/gitpython-developers/GitPython,
    страница приложения django-git — https://github.com/sethtrain/django-git.

    PS Песочница хабра