Бесплатные домены третьего уровня



Вы можете, попросить, любой домен третьего уровня, вот с этого списка.

  • 1nya.ru
  • kofeyko.ru
  • 2me.be
  • a404.ru
  • csnsk.ru
  • time2kill.ru
  • Nixe.me
  • nyanyu.ru
  • tsunddere.ru
  • animeotaku.ru
  • nyashechka.ru
  • 1010011010.ru
  • a2k.in
  • a13.in

Т.е. например, вы хотите olesya.1nya.ru, пишите это в комментах, указываете NS сервера, или ip хостинга. И я его создаю ;)

Просьбы направлять на alice2k@abcd.bz

Бесплатные DNS хостинги

Решил, тут написать обзоров.
Можно получить бесплатный dns хостинг, у хостеров.

Потом, в будущем, буду дописывать в комменты, еще подобные места.
Выбор за вами. Какой менеджер, для управления вам нравится, тем и пользуйтесь.
Раньше я был всецело за yandex, но даже он упал, как вы знаете. Так что, идеальности не существует.

Мегаплан. Появление халявных тарифов



Как вы знаете, до этого там были только платные продукты.
Но теперь, они запустили пару бесплатных тарифов.
Таск-менеджер Free: совместная работа, постановка и контроль задач и проектов, планирование дел, управление структурой компании и другие фишки.
CRM Free: клиенты и продажи, воронки продаж и другие отчеты, совместная работа и задачи, счета и финансовый учет.
Вообщем, все как и раньше. Но с ограничениями.
  • 3 лицензии (три человека одновременно могут быть в системе);
  • 200 активных сделок;
  • 100 выставленных счетов;
  • 500 активных задач;
  • 50 активных проектов;
  • 7 активных сотрудников (уволенные в расчет не берутся)
Регаться, читать и вникать тута

2ns.info - листинг доменов

2ns.info


Плюшки

Самое полезное, это блокнот доменов. С ним вы никогда не забудете продлить или перехватить освободившейся домен. ;)

domains.alice2k.ru

domains.alice2k.ru

По партнерке от domaincontext.com, так что не проебутся. (если партнер отчаливает даже, через 5 лет, то через их оф сайт можно всегда получить доступ)
Оформлено, через Михея, с бывшего zloy.org еще(ну с 2009 там .bz, когда Терминатор продал Злой).
регистрация доменов

Собсно панели как обычно. Управление зоной присутствует. Разве что для нубов проще.




Класс для загрузки файлов на сервер

Пример как использовать:
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = '/public/galery/';
$upload = new Upload(str_replace('//', '/', $targetPath));

if ($upload->uploads($_FILES['Filedata'])) {
$fileInfo = $upload->getFilesInfo();
$fileInfo["nameTranslit"];// новое имя файла, можно записать в БД
}
}

Ну и собственно сам класс
class Upload {

    private $dir = "/";
    private $name;
    private $FILES;
    private $allowedType = array("jpg", "gif", "bmp", "jpeg", "png", "pps","doc","docx","xls","pdf","txt","rar","zip");
    private $errors;
    private $errorsMessage = array(1 => "Размер загружаемого файла превышает допустимый размер.",
        2 => "Размер загружаемого файла превышает допустимый размер.",
        3 => "Файл был загружен лишь частично.",
        4 => "Файл не был загружен.",
        6 => "Файл не был загружен.",
        7 => "Файл не был загружен.",
        8 => "Файл не был загружен.");

    function __construct($dir="/") {
        $this->dir = $dir;
    }

    /**
     * устанавливаем дирректорию загрузки файла
     */
    function setDir() {
        $this->dir = $dir;
    }

    /**
     * Устанавлиаем доступные расширения
     * @param <type> $type
     */
    function setAllowedType($type) {
        if (is_array($type)) {
            $this->allowedType = $type;
        } else {
            $this->allowedType = explode(",", $type);
        }
    }

    /**
     * загрузка файла
     * @param $tmpName
     * @param $name
     * @param $replacement
     */
    private function upload($tmpName, $name) {
        $name = $this->substitute(self::translit($name));

        if ($this->typeChecking($name))
            if (move_uploaded_file($tmpName, $this->dir . $name)) {
                return $name;
            } else {
                return false;
            }
        return false;
    }

    function uploads($FILES) {
        $this->FILES = $FILES;

        if (!is_array($this->FILES['name'])) {
            return $this->uploadsOneFile();
        } else {
            return $this->uploadsManyFiles();
        }
    }

    /**
     * загрузка одного файла
     */
    function uploadsOneFile() {

        if ($this->FILES['error'] != 0) {
            $this->errors[] = $this->errorsMessage[$this->FILES['error']];
            return false;
        }

        $result = $this->upload($this->FILES['tmp_name'], $this->FILES['name']);
        if ($result != false) {
            $this->FILES['nameTranslit'] = $result;
            return true;
        }
        return false;
    }

    /**
     * загрузка нескольких файлов
     */
    function uploadsManyFiles() {
        $coutFiles = count($this->FILES['name']);
        for ($i = 0; $i < $coutFiles; $i++) {
            if ($this->FILES['error'][$i] == 0) {
                $result = $this->upload($this->FILES['tmp_name'][$i], $this->FILES['name'][$i]);

                if ($result != false) {
                    $this->FILES['nameTranslit'][$i] = $result;
                } else {
                    $this->errors[] = $this->FILES['name'];
                }
            } else {
                $this->errors[] = $this->errorsMessage[$this->FILES['error']];
            }
        }

        return true;
    }

    /**
     * проверяем, разрешен ли данный файл к загрузке
     */
    function typeChecking($fileName) {
        preg_match("#([\w()-_]+)\.([\w]{1,4})$#i", $fileName, $arrayNameFiles);
        $nameEnd = strtolower($arrayNameFiles[2]);
        if (in_array($nameEnd, $this->allowedType)) {
            return true;
        } else {
            $this->errors[] = "Файлы с расширением (<b>{$fileName}</b>) не разрешенны к загрузке.";
        }
        return false;
    }

    /**
     * ищет в каталоге файлы с таким же названием дописывает номер(равный количеству файлов с таким названием) в конец
     * @param $name
     */
    function substitute($name) {

        $files = scandir($this->dir);
        unset($files[0]);
        unset($files[1]);

        $i = 0;
        $newName = $name;

        preg_match("#([\w()-_]+)\.([\w]{1,4})#i", $name, $arrayNameFiles);
        $nameStart = $arrayNameFiles[1];
        $nameEnd = $arrayNameFiles[2];

        while (in_array($newName, $files)) {
            $newName = "{$nameStart}({$i}).{$nameEnd}";
            $i++;
        }
        return $newName;
    }

    /**
     * возвращаем информацию о файле
     */
    function getFilesInfo() {
        return $this->FILES;
    }

    /**
     * возвращаем ошибки
     */
    public function errors() {
        return $this->errors;
    }

    /**
     * переводим текст в транслит
     * @param $text
     */
    public static function translit($text) {
        $rus = array("а", "б", "в",
            "г", "ґ", "д", "е", "ё", "ж",
            "з", "и", "й", "к", "л", "м",
            "н", "о", "п", "р", "с", "т",
            "у", "ф", "х", "ц", "ч", "ш",
            "щ", "ы", "э", "ю", "я", "ь",
            "ъ", "і", "ї", "є", "А", "Б",
            "В", "Г", "ґ", "Д", "Е", "Ё",
            "Ж", "З", "И", "Й", "К", "Л",
            "М", "Н", "О", "П", "Р", "С",
            "Т", "У", "Ф", "Х", "Ц", "Ч",
            "Ш", "Щ", "Ы", "Э", "Ю", "Я",
            "Ь", "Ъ", "І", "Ї", "Є", " ");
        $lat = array("a", "b", "v",
            "g", "g", "d", "e", "e", "zh", "z", "i",
            "j", "k", "l", "m", "n", "o", "p", "r",
            "s", "t", "u", "f", "h", "c", "ch", "sh",
            "sh'", "y", "e", "yu", "ya", "_", "_", "i",
            "i", "e", "A", "B", "V", "G", "G", "D",
            "E", "E", "ZH", "Z", "I", "J", "K", "L",
            "M", "N", "O", "P", "R", "S", "T", "U",
            "F", "H", "C", "CH", "SH", "SH'", "Y", "E",
            "YU", "YA", "_", "_", "I", "I", "E", "_");
        $text = str_replace($rus, $lat, $text);
        return(preg_replace("#[^a-z0-9._-]#i", "", $text));
    }

}

HTML карта сайта на WordPress

Существует достаточно много плагинов, которые строят карту сайта HTML. Но, может быть, вы хотите добавить какие-то специфические особенности для карты вашего сайта. Например, включить или исключить определенные типы заметок и страниц, показать таксономию, и так далее. Поэтому будет полезно создать шаблон карты сайта в своей теме и использовать его.

В действительности, очень полезно использовать карту сайта HTML как часть темы. В таком случае карту сайта можно использовать и на странице WordPress для ошибки 404. Чтобы сделать карту сайта HTML частью темы надо создать папку partials в папке вашей темы. В папке partials создаем создаем файл с именем sitemap.php.

Копируем в него следующий код и правим его в соответствии со структурой своего сайта:
<h2 id="authors">Authors</h2>
<ul>
<?php 
wp_list_authors( 
  array(
    'exclude_admin' => false,
  )
); 
?>
</ul>
 
<h2 id="pages">Страницы</h2>
<ul>
<?php
// Страницы, которые надо исключить из карты сайта добавляем к exclude здесь
wp_list_pages( 
  array(
    'exclude' => '',
    'title_li' => '',
  )
);
?>
</ul>
 
<h2 id="posts">Заметки</h2>
<ul>
<?php
// Категории, которые надо исключить, добавляем к exclude здесь
$cats = get_categories('exclude=');
foreach ($cats as $cat) {
  echo "<li><h3>".$cat->cat_name."</h3>";
  echo "<ul>";
  query_posts('posts_per_page=-1&cat='.$cat->cat_ID);
  while(have_posts()) {
    the_post();
    $category = get_the_category();
    // Ссылку на заметку выводим только один раз, даже если она указана в нескольких категориях
    if ($category[0]->cat_ID == $cat->cat_ID) {
      echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
    }
  }
  echo "</ul>";
  echo "</li>";
}
?>
</ul>

Теперь там, где нужно вывести HTML карту сайта в теме WordPress вставляем следующий код:
<?php get_template_part('/partials/sitemap'); ?>



Чтобы сделать шаблон для карты сайта нужно скопировать файл page.php и переименовать копию в page-sitemap.php. Затем открываем его и ниже вызова функции the_content(); добавляем упомянутый ранее вызов get_template_part(). Теперь переходим в начало файла и после открывающего тега <?php (но перед вызовом get_header()), добавляем комментарий:
/*
Template Name: Карта сайта HTML
*/

Конвертация Movable Type 2 wordpress

Заходим в наш MT, в админку.
Копируем все что нада.
В вордпресе импортируем.
Но, не все просто ;)

Первое. Это проблема с конвертором. Весь текст в одну строку получается. Чтобы от этого избавиться вот:
Открываем установленный плагин. (не важно, даже самый обновленный официальный косячил)
wp-content/plugins/movabletype-importer/movabletype-importer.php
Ищем:
\n

Заменяем на:
\n \n


Еще. Символы не меняются. Были "-", стали "_". В названиях записей.
Это исправляется вот так:
SQL #
UPDATE `wp_posts` SET `post_name` = REPLACE(`post_name`, '-', '_');

thx keXek за это.

Еще возможно, понадобится людям почитать про markdown, кто его юзал.
оригинальный синтаксис daringfireball.net/projects/markdown/syntax
вот перевод если трудно вникать markdown.pp.ru/

Полезности по редиректам.
.htaccess
redirect.php in your WP root directory
<?php
require('wp-config.php');
header('Content-type: text/plain');
?>
<MTEntries lastn="999999">
Redirect Permanent /archives/<$MTEntryID$>.html http://www.example.org/archives/<$MTArchiveDate format="%Y/%m/%d"$>/
   <?php echo sanitize_title("<$MTEntryTitle$>"); ?>
</MTEntries>


If your entry IDs in MovableType are padded with zeroes (0), then change the line above to
Redirect Permanent /archives/<$MTEntryID pad="1"$>.html http://www.example.org/archives/<$MTArchiveDate format="%Y/%m/%d"$>/
   <?php echo sanitize_title("<$MTEntryTitle$>"); ?>


Also, if your used the «dirify» option, for example, when in MT, if you had:
  • Archive Type: Individual,
  • Archive File Template: .php,
    quotes in title etc,
  • Use:
    Redirect Permanent /archives/<MTEntryTitle dirify="1">.php 
     http://www.example.com/index.php?s=<$MTEntryTitle encode_url="1"$>
    or if the extension for the pages were ".html", instead of the ".php" above, use:
    Redirect Permanent /archives/<$MTEntryID$>.html 
     http://www.example.com/index.php?s=<$MTEntryTitle encode_url="1"$>
    .htaccess and mod_rewrite
    RewriteEngine on
    RewriteRule archives/0*(\d+).html /uri/to/blog/index.php?p=$1
    RewriteRule index.rdf /uri/to/blog/index.php?feed=rdf
    RewriteRule index.rss /uri/to/blog/index.php?feed=rss
    RewriteRule index.xml /uri/to/blog/index.php?feed=rss2

Загрузка файлов с помощью SWFUpload и PHP

Индексная
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 
<head>
    <title>SWFUpload</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <h1>SWFUpload</h1>
    <div id="uploadButton"></div>
    <div id="status"></div>
    <div id="images"></div>
    <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="js/swfupload.js"></script>
    <script type="text/javascript" src="js/plugins/swfupload.queue.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
</body>
</html>

uploadButton – предназначен для размещения кнопки загрузчика.
status – здесь мы будем выводить сообщения о процессе загрузки.
images – в этом блоке будут показаны загруженные картинки.

В конце страницы подключены 4 js файла.
  • Первый – библиотека jquery (ее использовать необязательно).
  • Второй – swfupload.js. Это основной скрипт библиотеки SWFUpload. Именно он создает кнопку загрузки.
  • Третий – plugins/swfupload.queue.js. Тоже входит в состав библиотеки. Позволяет загружать несколько файлов одновременно.
  • Четвертый – main.js. Здесь находится код настройки библиотеки и обработчики событий. Его мы сейчас и рассмотрим.
Настраиваем SWFUpload
Для того, чтобы подключить библиотеку, нужно создать объект SWFUpload и передать ему хеш с настройками.
Делается это следующим образом (код из файла main.js).
var swfu = new SWFUpload(
    {
        upload_url : "upload.php",
        flash_url : "swfupload.swf",
        button_placeholder_id : "uploadButton",
       
        file_size_limit : "2 MB",
        file_types : "*.jpg; *.png; *.jpeg; *.gif",
        file_types_description : "Images",
        file_upload_limit : "0",
        debug: false,
 
        button_image_url: "button.png",
        button_width : 100,
        button_height : 30,
        button_text_left_padding: 15,
        button_text_top_padding: 2,
        button_text : "<span class=\"uploadBtn\">Обзор…</span>",
        button_text_style : ".uploadBtn { font-size: 18px; font-family: Arial; background-color: #FF0000; }",
       
        file_dialog_complete_handler : fileDialogComplete,
        upload_success_handler : uploadSuccess,
        upload_complete_handler : uploadComplete,
        upload_start_handler : uploadStart,
        upload_progress_handler : uploadProgress
    }
);

В параметре upload_url мы указываем адрес php скрипта, который принимает файлы.

С помощью параметров flash_url и button_placeholder_id указываем адрес флеш ролика, который создаёт кнопку загрузки и id элемента на странице, в котором эта кнопка будет размещена.

Затем идет несколько параметров, устанавливающих ограничения на загрузку файлов. Здесь указаны допустимые разрешения файлов, их максимальный размер и количество файлов, которые можно загрузить за один раз (0 – любое количество).

После этого указываем параметры, настраивающие внешний вид кнопки загрузки. Эта часть обязательная, т.к. по-умолчанию кнопка имеет размер 1х1 пиксель, и пользоваться ей будет невозможно.

Т.к. кнопка представляет собой флеш ролик, оформить её напрямую с помощью CSS не получится, но с помощью этих параметров вы можете указать фоновую картинку, шрифт и положения текста.

Оставшиеся параметры устанавливают обработчики событий. Рассмотрим их подробнее.
function uploadSuccess(file, serverData) {
    $('#images').append($(serverData));
}
 
function uploadComplete(file) {
    $('#status').append($('<p>Загрузка ' + file.name + ' завершена</p>'));
}
 
function uploadStart(file) {
    $('#status').append($('<p>Начата загрузка файла ' + file.name + '</p>'));
    return true;
}
 
function uploadProgress(file, bytesLoaded, bytesTotal) {
    $('#status').append($('<p>Загружено ' + Math.round(bytesLoaded/bytesTotal*100) + '% файла ' + file.name + '</p>'));
}
 
function fileDialogComplete(numFilesSelected, numFilesQueued) {
    $('#status').html($('<p>Выбрано ' + numFilesSelected + ' файл(ов), начинаем загрузку</p>'));
    this.startUpload();
}

upload.php
<?php
 
$uploadDir = 'uploads/'; //папка для хранения файлов
 
$allowedExt = array('jpg', 'jpeg', 'png', 'gif');
$maxFileSize = 2 * 1024 * 1024; //1 MB
 
//если получен файл
if (isset($_FILES)) {
    //проверяем размер и тип файла
    $ext = end(explode('.', strtolower($_FILES['Filedata']['name'])));
    if (!in_array($ext, $allowedExt)) {
        return;
    }
    if ($maxFileSize < $_FILES['Filedata']['size']) {
        return;
    }
    if (is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
        $fileName = $uploadDir.$_FILES['Filedata']['name'];
        //если файл с таким именем уже существует…
        if (file_exists($fileName)) {
            //…добавляем текущее время к имени файла
            $nameParts = explode('.', $_FILES['Filedata']['name']);
            $nameParts[count($nameParts)-2] .= time();
            $fileName = $uploadDir.implode('.', $nameParts);
        }
        move_uploaded_file($_FILES['Filedata']['tmp_name'], $fileName);
        echo '<img src="'.$fileName.'" alt="'.$fileName.'" />';
    }
}

AJAX загрузка файлов на сервер

Создадим папку там, где у нас установлен CodeIgniter, папка будет именоватся uploads, так же выставим ей права доступа 777. Затем создадим отображение в папке с видами, назвав файл upload.php:
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>AJAX загрузка файлов на сервер.</title>
    <script src="jquery.js"></script>
    <script src="jquery.ocupload-1.1.2.packed.js"></script>
    <script language="javascript">
    $(document).ready(function() {
      $('#upload').upload({
        name: 'userfile',
        method: 'post',
        enctype: 'multipart/form-data',
        action: 'upload/do_upload',
        onSubmit: function() {
          $('#result').text('Uploading...');
        },
        onComplete: function(data) {
          $('#result').text(data);
        }
    });
    });
    </script>
  </head>
  <body>
  <a id="upload" style="font-family: Verdana; color: #000" href="#">Выберите файл</a>
  <span id="result"></span>
  </body>
</html>

jQuery и One Click Upload, должны быть уже на вашем сервере. Файл отображения должен загружатся из основного контролёра например так:
function index() {
    $this->load->view('upload');
  }

Имя основного контролёра задаётся в конфиге routes.php, в строке $route['default_controller'].
После этого в папке с контролёрами создадим файл c таким же именем как и в папке с отображениями – upload.php:
<?php
class Upload extends Controller {
  
  function __construct() {
    parent::Controller();
    $this->load->helper(array('form', 'url'));
  }
  
  function index() {}

  function do_upload() {
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size']  = '100';
    $config['max_width']  = '1280';
    $config['max_height']  = '1024';
    $config['remove_spaces']  = TRUE;
    $this->load->library('upload', $config);
    if (!$this->upload->do_upload()) {
      echo $this->upload->display_errors();
    }else {
      $data = $this->upload->data();
      echo "File name: $data[file_name]. File size: $data[file_size]";
    }
  }
  
}
?>

Код обоих фалов достаточно прост, о дополнительних настройках плагина и библиотеки, читайте на соответствующих ресурсах. Отмечу лишь, что в jQuery скрипте:
$(document).ready(function() {
  $('#upload').upload({
    name: 'userfile',
    method: 'post',
    enctype: 'multipart/form-data',
    action: 'upload/do_upload',
    onSubmit: function() {
      $('#result').text('Uploading...');
    },
    onComplete: function(data) {
      $('#result').text(data);
    }
  });
});

значение поля «name» можно установить своё, например «some_field», передав её в контролёре в качестве параметра функции do_upload:
$this->upload->do_upload('some_field')