программирование

Подписаться на эту метку по RSS

Here is how you can find all files newer than a certain date, excluding directories from the search ("doc" and "misc", in my case) and printing the modified time along with the file name.

find -L . -newermt "Dec 5, 2015 22:00" -not -path './doc/*' -not -path './misc/*' -printf "%TY-%Tm-%Td %TH:%TM:%TS %Tz %p\n"  | less

This oneliner will also follow symlinks (thanks to -L option).

Drupal 7, после создания очередной ноды или комментария, выводит сообщение, что-то вроде «Forum topic %title has been created.» (пример для форумного топика). Вы, конечно же, хотите написать здесь что-то своё. А что, если текст зависит от того опубликована нода или отправлена на подтверждение администратору? Это как-раз мой случай, потому что я использую модуль Simple Regex Filter, чтобы отсеивать подозрительные сообщения на форумах.

Самое простое решение, позволяющее изменить все сообщения вида «@type %title has been created.», — установить модуль Strings Override, и вперёд. Для сложных случаев, когда нужна какая-то логика: устанавливается модуль Disable Messages, а затем используется экшн Rules «Set a message».

Однако в моем теме Disable Message ломает стили, да и не слишком гибкое это решение.

Поэтому вот ещё версия. Если комментарии на английском вам не понятны, пишите ниже, я постараюсь объяснить или помочь переделать код ваши нужды.

/**
 * We customize 'Forum topic ... has been created.' message when
 * it goes to the approval queue. This is done in two steps:
 *
 * 1. Add new status messages implementing hook_node_insert().
 *    This is done for both Published and Unpublished nodes.
 *    For Published nodes we just duplicate the old message.
 *    For Unpublished nodes we inform that the message is waiting for approval.
 *
 * 2. Remove old status message implementing hook_form_FORM_ID_alter().
 *    We override 'submit' action where we remove old messages in case it
 *    matches the pattern '@type %title has been created.'.
 *    We only remove a single match, so even if we duplicate a message
 *    on the first step, one of them will still be displayed.
 *
 * We customize also the Drupal behavior when a Forum Topic was updated and
 * the new revision goes to the Approval Queue. Now it redirects a user to
 * the Forum Category and shows the similar status message to inform the user.
 * We use hook_node_update() for that.
 */
 
/**
 * Implements hook_node_insert()
 */
function MY_MODULE_node_insert($node) {
  /**
   * Add custom status messages when a node is inserted
   */
  if ($node->type == 'forum') {
    if ($node->status == NODE_NOT_PUBLISHED) {
      drupal_set_message(t('Your forum topic has been queued for review by site administrators and will be published after approval.'));
    }
    elseif ($node->status == NODE_PUBLISHED) {
      $message = t('@type %title has been created.', array('@type' => node_type_get_name($node), '%title' => $node->title));
      drupal_set_message($message, 'status', TRUE);
    }
  }
}
 
/**
 * Implements hook_node_update()
 */
function MY_MODULE_node_update($node) {
  /**
   * If a Forum Topic was updated and the new revision goes to the Approval Queue
   * we redirect a user to the Forum Category and show a message to keep him informed.
   */
  if ($node->type == 'forum') {
    if ($node->status == NODE_NOT_PUBLISHED) {
      drupal_set_message(t('Your forum topic has been queued for review by site administrators and will be published after approval.'));
      drupal_goto('forum/' . $node->forum_tid);
    }
  }
}
 
/**
 * Implements hook_form_FORM_ID_alter().
 * @see MY_MODULE_node_insert()
 */
function MY_MODULE_form_forum_node_form_alter(&$form, &$form_state, $form_id) {
  /**
   * Override 'submit' action for 'forum_node_form' form
   */
  $form['actions']['submit']['#submit'][] = '_MY_MODULE_form_forum_node_form_submit';
}
 
/**
 * @see MY_MODULE_form_forum_node_form_alter()
 */
function _MY_MODULE_form_forum_node_form_submit($form, &$form_state) {
  /**
   * Remove the old status message 'Forum topic ... has been created.'
   */
  if (!empty($_SESSION['messages']['status'])) {
    $node = $form_state['node'];
    $old_message = t('@type %title has been created.', array('@type' => node_type_get_name($node), '%title' => $node->title));
    $old_message_key = array_search($old_message, $_SESSION['messages']['status']);
    
    if ($old_message_key !== FALSE) {
      unset($_SESSION['messages']['status'][$old_message_key]);
      
      // Reset array indexes. Otherwise it doesn’t work with some theme templates.
      $_SESSION['messages']['status'] = array_values($_SESSION['messages']['status']);
      
      // Remove the empty status message wrapper if no other messages have been set.
      if (empty($_SESSION['messages']['status'])) {
        unset($_SESSION['messages']['status']);
      }
    }
  }
}

Есть такая распространенная задача в Git — выделение некоторой (суб)директории в отдельный проект, т.е. в новый репозиторий.

При этом вы можете оставить папку в старом проекте, добавить её в .gitignore и работать с ней как с отдельным репозиторием (альтернатива git submodules), либо полностью удалить её из старого проекта.

В последних версиях Git это тривиальные задачи. Я опишу первый вариант.

 

1. Заходим в директорию, находящуюся под версионным контролем и выполняем команду:

git subtree split -P <path-to-folder> -b <name-of-new-branch>

Этим мы отделяем нужную директорию со всей историей её изменений в новую ветку <name-of-new-branch> . Обратите внимание, что <path-to-folder> не должен начинаться или оканчиваться какими-либо специальными символами вроде «/» или «.».

К примеру если наш репозиторий лежит в «D:\projects\my-project» и мы желаем отделить папку «D:\projects\my-project\modules\my-module», то пишем так:

cd D://projects/my-project
git subtree split -P modules/my-module -b my-module-branch

Новая ветка будет «висеть» отдельно, взгляните на пример реального проекта:

 

 

2. Создадим новый репозиторий

читать дальше »

Коммиты в Git можно объединять в один несколькими способами (git rebase -i , git merge --squash ) и они неплохо работают, если вам нужно объединить ревизии где-то из середины ветки.

Если всё, что требуется, это объединенить последние N коммитов, есть другой, изящный способ. Например для последних 3-х коммитов:

git reset --soft HEAD~3
git commit

Пишите новый текст коммита и всё!

Игра «Вирус»

Рубрика: Блог
Метки: | |
Дата: 28/08/2014 00:09:42

Друг написал игру, мы с женой её за два вечера прошли.

 

 

Потом, правда, выяснилось, что были невнимательны при чтении правил, играли по своим, усложнённым, и не реализовали весь наш мозг.

Однако игра получилась интересная. Зрелый такой, коммерческий продукт. Вы даже найдете ссылки на бесплатное скачивание с Google play & App Store в конце этой заметки.

 

читать дальше »

It would seem there is no problem to find all symbolic links within the directory recursively like find . -type l . This is exactly how I hoped to make it, but got not the result I expected.

Actually, this way we don't get those symbolic links that are located within the directories which, in its turn, are pointed by the symbolic links that are found in the directory of initial search. It is complicated enough, but I think you see the issue :)

So this is how to solve it:

1. You can use ls recursively and so that this command will follow all the symbolic links found and search new links there.

ls -lR . | grep ^l

2. Another way is to take advantage of find command, but note, firstly, there must be -l option which will allow us to follow symbolic links already found, and secondly, pay attention that I use -xtype instead of -type. This is due to the fact that:

l    symbolic link; this is never true if the -L option or the
     -follow option is in effect, unless the symbolic link  is
     broken.  If you want to search for symbolic links when -L
     is in effect, use -xtype.

(from man find )

Thus, the second solution:

find -L . -xtype l

This is my solution on how to control disk space usage on a server. The solution is a simple one-line shell script that is executed by cron and sends an e-mail alert each time your disk space gets low.

First of all, let's create a shell file.

vi /home/username/bin/check-disk-space.sh

#!/bin/sh
df -Pl|grep "^/dev"|awk '{sub("%","",$5);if($5 > 95) print $5"%%\t"$6}'|xargs -0 sh -c 'test "$1" && printf "`hostname -f` is running low on disk space:\nUse%%\tMounted on\n$1"' $0

As you can see it's simple enough. You can adjust the parameter in percent (in our case it is 95% ) on after overbrim of which you'll get an email alert like:

<hostname> is running low on disk space:
Use%	Mounted on
95%	/

At last, you must set a crontab task:

crontab -e u username

MAILTO=your-email@example.com
15 */2 * * * /home/username/bin/check-disk-space.sh

This cron task will check disk space every 2 hours.

Hope this helps you :)