Никогда не думал, что забуду сортировку пузырьком.
Вот пишу себе напоминалку, чтобы помнить что даже такие элементарные вещи можно забыть
$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; } }
Паттерны: Оглавление
Мастерство состоит в том, чтобы двигаться от земли к небу и обратно
Александра Волкова
Оглавление
- Registry (Реестр)
- Singleton (Одиночка)
Log - Factory Method — Фабричный метод порождает объекты одного и того же типа
- Simple Factory
- Abstract Factory
- Цепочка обязанностей
___
- Iterator
- Observer
- Decorator
- Wrapper
- Composer
- Pool
- Multiton (Пул одиночек)
- Prototype
- Adapter
- Template Method
- Specification
- 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
JSON-pure API справляется с большинством проблем RESTful API
- Использует только один метод для передачи данных — обычно POST для HTTP и SEND в случае использования Web Sockets
- Механизм передачи и содержимое запроса полностью независимы. Все ошибки, предупреждения и данные передаются в теле запроса, в формате JSON
- Используется лишь один код ответа, чтобы подтвердить успешную передачу, обычно это 200 ОК
- Механизм передачи и содержимое ответа полностью независимы. Все ошибки, предупреждения и данные передаются в теле ответа, в формате JSON
- Гораздо проще дебажить, ведь все данные находятся в одном месте в легко-читаемом формате JSON
- Легко перенести на любой канал связи, например, HTTP/S, WebSockets, XMPP, telnet, SFTP, SCP, or SSH
SQL: Важность учёта
Задачка: Важность учёта
Дана таблица поступлений товаров на склады компании следующего формата:
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: включаемая область
из файла
<? $APPLICATION->IncludeComponent("bitrix:main.include","",Array( "AREA_FILE_SHOW" => "file", "PATH"=>"address.php" ) );?>
Bitrix: Информационный портал
Новости
Новости-деталка
Публикация текста статьи в соц. сетях.
WebServices
CSS: Текст статьи в две колонки
Текст статьи в 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 исключения
в d7 исключения бросаются так
throw new Exception("Сообщение иключения");
Git : Введение
Git : Введение
Сохранение в лоток
Получаем список удалённых реп
git remote -v
Проставляем пароль в явном виде
git remote set-url origin https://username:password@bitbucket.org/username/repo.git
Git: удобный вывод состояния
краткая форма
\> 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 объяснения и тонкости
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
Задание: Рекурсия
Дано
Нужно написать код, который из массива выведет то что приведено ниже в комментарии.
$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));
Вывод
Задание: Анаграмма
Дано:
Число 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
lazy var context: NSManagedObjectContext = { [unowned self] in return self.persistentContainer.viewContext }()
AngularJs: GET запрос
var hostApi = "http://domain.ru/local/api/"; $http.get(hostApi).then(function(answer){ });
PanGesture
@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
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
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
я познакомился с BEM в июне 2015 в проекте stmegi.com.
В чем разница между БЭМ и Bootstrap?
В терминах БЭМ Bootstrap — это набор сверстанных блоков. БЭМ — не библиотека элементов интерфейса, а методология, позволяющая:
создавать архитектуру проекта;
разрабатывать веб-приложения независимыми блоками;
упрощать поддержку проектов.
Библиотека блоков, сделанных на БЭМ — bem-components. Существуют также и другие БЭМ-библиотеки.
памятка
имя-блока__имя-элемента_имя-модификатора имя-блока_имя-модификатора
