Git Hub
коротко
Ctrl + ↑ Позднее

Никогда не думал, что забуду сортировку пузырьком.

3 июня 2016, 13:41

Вот пишу себе напоминалку, чтобы помнить что даже такие элементарные вещи можно забыть

$size = count($arr)-1;
for ($y= $size; $y>=0; $y--) {
    for ($x = 0; $x<=($y-1); $x++)
        if ($arr[$j] > $arr[$x+1]) {
            $e = $arr[$x];
            $arr[$x] = $arr[$x+1];
            $arr[$x+1] = $e;
        }
}

Алгоритмы:

3 июня 2016, 13:40

Тут планирую разместить свои комментарии различных алгоритмов.

Алгоритмы

Паттерны: Оглавление

2 июня 2016, 0:58

Мастерство состоит в том, чтобы двигаться от земли к небу и обратно

Александра Волкова

Оглавление

  1. Registry (Реестр)
  2. Singleton (Одиночка)
    Log
  3. Factory Method — Фабричный метод порождает объекты одного и того же типа
  4. Simple Factory
  5. Abstract Factory
  6. Цепочка обязанностей

___

  1. Iterator
  2. Observer
  3. Decorator
  4. Wrapper
  5. Composer
  6. Pool
  7. Multiton (Пул одиночек)
  8. Prototype
  9. Adapter
  10. Template Method
  11. Specification
  12. Dependency Injection

Книги по теме

  • Банда Четырёх
  • Мэт Зандстра (Matt Zandstra): PHP. Объекты, шаблоны и методики программирования (Objects, Patterns, and Practice)

Паттерны на Swift

http://proswift.ru/shablony-programmirovaniya-na-swift-abstract-factory/
https://habrahabr.ru/company/badoo/blog/281162/
https://github.com/ochococo/Design-Patterns-In-Swift

Ссылки по теме

Серия статей о шаблонах проектирования на PHP
Примеры на PHP
Patterns PHP

JSON-pure API

1 июня 2016, 23:59

JSON-pure API справляется с большинством проблем RESTful API

  • Использует только один метод для передачи данных — обычно POST для HTTP и SEND в случае использования Web Sockets
  • Механизм передачи и содержимое запроса полностью независимы. Все ошибки, предупреждения и данные передаются в теле запроса, в формате JSON
  • Используется лишь один код ответа, чтобы подтвердить успешную передачу, обычно это 200 ОК
  • Механизм передачи и содержимое ответа полностью независимы. Все ошибки, предупреждения и данные передаются в теле ответа, в формате JSON
  • Гораздо проще дебажить, ведь все данные находятся в одном месте в легко-читаемом формате JSON
  • Легко перенести на любой канал связи, например, HTTP/S, WebSockets, XMPP, telnet, SFTP, SCP, or SSH

SQL: Важность учёта

29 мая 2016, 19:01

Задачка: Важность учёта

Дана таблица поступлений товаров на склады компании следующего формата:

create table incoming (
    storage_id integer not null,
    category_id integer not null,
    quantity integer not null,
    time datetime not null
);

Напишите запрос, который выведет список последнего поступившего количества для каждого склада и категории товара. Таблица должна быть отсортирована по номеру склада (по возрастанию) и категории товара (по возрастанию). Например, для следующей таблицы:

storage_id | category_id | quantity | time
-----------------------------------------------------
1 | 32 | 3 | 2015-03-17 13:55:32
1 | 32 | 8 | 2015-03-17 13:15:22
3 | 32 | 23 | 2015-03-17 14:45:57
1 | 7 | 13 | 2015-03-17 15:56:12
1 | 32 | 7 | 2015-03-17 17:05:37
2 | 17 | 1 | 2015-03-18 13:13:22
1 | 7 | 13 | 2015-03-19 21:53:17

запрос должен возвращать

storage_id | category_id | quantity
----------------------------------------------
1 | 7  | 13
1 | 32 | 7
2 | 17 | 1
3 | 32 | 23

Решение

select storage_id,category_id,quantity
from (select *, DATE_FORMAT(`time`,'%Y%m%d%H') as sortOnTime,  CONCAT(DATE_FORMAT(`time`,'%Y%m%d'), storage_id ) as days 
from incoming  ORDER BY sortOnTime DESC )s 
GROUP BY days
ORDER BY storage_id , category_id

в запросах для production запросы вида select *,.. лучше не использовать а перечислять жёстко все необходимые поля

Bitrix: включаемая область

29 мая 2016, 3:11

из файла

<? $APPLICATION->IncludeComponent("bitrix:main.include","",Array(
        "AREA_FILE_SHOW" => "file", 
        "PATH"=>"address.php"
    )
);?>

Bitrix: Информационный портал

28 мая 2016, 16:53

Новости

Новости-деталка

Текст в 2 колонки

Публикация текста статьи в соц. сетях.

WebServices

WebServices

CSS: Текст статьи в две колонки

28 мая 2016, 16:47

Текст статьи в 2 колонки

Задача

вывести контент в два столбца

Решение

.new_detail__text {
    -webkit-column-width: 450px;
    -moz-column-width: 450px;
    column-width: 450px;
    -webkit-column-count: 2;
    -moz-column-count: 2;
    column-count: 2;
    -webkit-column-gap: 50px;
    -moz-column-gap: 50px;
    column-gap: 50px;
    -webkit-column-rule: 1px solid #ccc;
    -moz-column-rule: 1px solid #ccc;
    column-rule: 1px solid #ccc;
}

Результат

Bitrix исключения

28 мая 2016, 16:36

в d7 исключения бросаются так

throw new Exception("Сообщение иключения");

Git : Введение

28 мая 2016, 16:35

Git : Введение
Сохранение в лоток

удобный вывод состояния

Получаем список удалённых реп

git remote -v

Проставляем пароль в явном виде

git remote set-url origin https://username:password@bitbucket.org/username/repo.git

Git: удобный вывод состояния

28 мая 2016, 16:34

краткая форма

\> git status -sb

Подробная форма

\> git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Подробный вывод лучше повесить на alias git lg

SQL: JOINS объяснения и тонкости

27 мая 2016, 12:39

JOIN

выборки с объединениями справа и слева одни из любимых вопросов которые задают соискателям на технических интервью.

Левый

SELECT * FROM authors a LEFT JOIN rooms r ON a.`room-id`=r.id

в таблице authors я сделал имя поле room-id через дефис, чего в реальной практике проектирования баз данных я бы категорически не делал.
одна из причин что в нативных запросах вам придётся каждый раз оборачивать имя этого поля в `- апострофы.

Правый

SELECT * FROM authors a RIGHT JOIN rooms r ON a.`room-id`=r.id

Прямое связываение через WHERE и без JOIN

SELECT * FROM authors a, rooms r WHERE a.`room-id` = r.id

SQL FIDDLE

Задание: Рекурсия

25 мая 2016, 14:02

Дано

Нужно написать код, который из массива выведет то что приведено ниже в комментарии.

$x = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
/*


print_r($x) - должен выводить это:
Array
(
    [h] => Array
        (
            [g] => Array
                (
                    [f] => Array
                        (
                            [e] => Array
                                (
                                    [d] => Array
                                        (
                                            [c] => Array
                                                (
                                                    [b] => Array
                                                        (
                                                            [a] =>
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

);*/

Решение

$x = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');

function d($arg){
    echo '<pre>';
    print_r($arg);
    echo '</pre>';
}

class Recurse{
    public static function get($x){
        $y = array_pop($x);

        if (!empty($x)){
            return  array( $y=>self::get($x));
        }
        else {
            return array($y=>false);
        }
    }

}

d(Recurse::get($x));

Вывод

Задание: Анаграмма

24 мая 2016, 12:24

Дано:

Число 128574 примечательно тем, что, будучи удвоенным, образует число 257148, которое состоит из тех же цифр, только в другом порядке.

Напишите программу, которая находит и выводит минимальное натуральное число, которое, будучи умноженным на 2, 3, 4, 5 и 6, образует числа, состоящие из тех же цифр, что и исходное.

Решение:

<?php

set_time_limit(0);


function dr($arg){
    echo '<pre>';
    echo var_dump($arg);
    echo '</pre>';
}

/**
 * Class Anagramm
 * класс поиска "анаграмм"
 */
class Anagramm {


    const MIN_LIMIT = 999;
    const MAX_LIMIT = 99999;

    /**
     * основной метод поиска анаграмм
     * @return возвращает наименьшую анаграмму из найденных
     */
    public static function search(){

        $arOperands = array(2,3,4,5,6);
        $arResult  = array();

        for ($in = self::MIN_LIMIT; $in <= self::MAX_LIMIT;$in++){

            foreach($arOperands as $operand)
            {
                $result = self::get($in,$operand);
                if (self::isCorrect($in,$result)){
                    $arResult[] = $in;

                }

            }
        }

         return min($arResult);
    }

    protected  static function  get($in,$operand){
        return ($in*$operand);
    }

    /**
     * метод проверки анаграммы на корректность
     * @param $in
     * @param $out
     * @return bool
     */
    protected  static function isCorrect($in, $out){

        $arIn = str_split($in);
        $arOut = str_split($out);

        sort($arIn);
        sort($arOut);

        $resultIn =  implode($arIn);
        $resultOut = implode($arOut);

        if (strcasecmp($resultIn,$resultOut)==0)
            return true;
        else
            return false;
    }

}



dr(Anagramm::search()); // выводим найденную анаграмму

lazy var

21 мая 2016, 10:41
lazy var context: NSManagedObjectContext = {
        [unowned self] in
        return self.persistentContainer.viewContext
    }()

AngularJs: GET запрос

16 мая 2016, 18:22
var hostApi = "http://domain.ru/local/api/";
      
     $http.get(hostApi).then(function(answer){
        
      });

PanGesture

11 мая 2016, 18:58
@IBAction func handlePan(_ sender: UIPanGestureRecognizer){
        let translation = sender.translation(in: self.view)
        self.view.center.x += translation.x
        sender.setTranslation(CGPoint.zero, in: self.view)
    }

Сравниваем даты из NSDate

22 апреля 2016, 21:56
var dateComparisionResult:NSComparisonResult = currentDate.compare(endDate)
 
    if dateComparisionResult == NSComparisonResult.OrderedAscending {
        //  Текущая дата currentDate меньше конечной даты endDate
    }
    else if dateComparisionResult == NSComparisonResult.OrderedSame {
        //  Текущая дата currentDate и конечная дата endDate одинаковы
    }
    else if dateComparisionResult == NSComparisonResult.OrderedDescending {
        //  Текущая дата currentDate больше конечной даты endDate
    }

CoreData: Create Read Update Delete

13 апреля 2016, 15:30

https://habrahabr.ru/post/303798/

//
//  DataHelper.swift
//  DaysList
//
//  Created by Kirill on 13/03/2016.
//  Copyright © 2016 Kirill. All rights reserved.
//

import Foundation
import UIKit
import CoreData

class DataHelper{
    
    var context:NSManagedObjectContext
    
    init(context _context:NSManagedObjectContext){
        self.context = _context
    }
    
    class func addRecord(_ _comment:String) -> Int64 {
        
        let newId:Int64 = (getLastId()+1)
        let context = persistentContainer.viewContext
        let day = Day(context: context)
        day.id = newId
        day.comment = _comment
        print("added day id=\(day.id):\(day.comment)")
        
        DataHelper.saveContext()
        
        return day.id
    }
    
    class func getAll(){
        
    }
    
    /// Изменяем элемент
    ///
    /// - Parameters:
    ///   - id: <#id description#>
    ///   - _comment: <#_comment description#>
    class func updateById(id: Int64, comment _comment:String){
      
        let day = getById(id: id)
        
        if (day != nil && (day?.id)! > 0){
            day?.comment = _comment
            saveContext()
        }

    }
    
    
    
    class func deleteById(_ id:Int64){
        let context = persistentContainer.viewContext
        let day = getById(id: id)
        
        if ((day?.id)! > 0){
            context.delete(day!)
        }
    }
    
    class func delete<T>(item:T){
        let context = persistentContainer.viewContext
        context.delete(item as! NSManagedObject)
    }
    
    
    class func getById(id:Int64)-> Day?{
        let context = persistentContainer.viewContext
        let request: NSFetchRequest<Day> = Day.fetchRequest()
        
        request.predicate = NSPredicate(format: "id == %@",
                                        argumentArray: [id])
       
        
        
        var days:[Day] = []
        do{
            days = try context.fetch(request) as [Day]
        }
        catch{
            print("getById error")
        }
        
       let day =  days.first
       return day
    }
    
    
    class func getLastId()-> Int64 {
        let context = persistentContainer.viewContext
        let request: NSFetchRequest<Day> = Day.fetchRequest()
        
        request.predicate = NSPredicate(format: "id == max(id)",
                                        argumentArray: [])
        
        var days:[Day] = []
        do{
            days = try context.fetch(request) as [Day]
        }
        catch{
            print("getLastId error")
        }
        
        let day =  days.first
        return (day?.id)!
    }
    
    static var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "DaysList")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {

                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
    
    class func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
    
}
let resultId =  DataHelper.addRecord("текстовая строка")

Памятка

Обычно файл базы данных лежит где-то здесь

/Users/<USER>/Library/Developer/CoreSimulator/Devices/<DEVICE_ID>/data/Containers/Data/Application/<APPLICATION_ID>/Documents/<FileName>.sqlite

BEM

3 апреля 2016, 12:17

я познакомился с BEM в июне 2015 в проекте stmegi.com.

В чем разница между БЭМ и Bootstrap?

В терминах БЭМ Bootstrap — это набор сверстанных блоков. БЭМ — не библиотека элементов интерфейса, а методология, позволяющая:
создавать архитектуру проекта;
разрабатывать веб-приложения независимыми блоками;
упрощать поддержку проектов.

Библиотека блоков, сделанных на БЭМ — bem-components. Существуют также и другие БЭМ-библиотеки.

памятка

имя-блока__имя-элемента_имя-модификатора
имя-блока_имя-модификатора

Виталий Харисов — История создания БЭМ

Ctrl + ↓ Ранее