Многие, кто писал приложение на yii 1.x, (на самом деле как я понимаю все нижеописанное актуально и для yii 2.x) и если проект достаточно сложный,n в какой то момент приходил к ситуации, что модели становились толстые, что, количество сценариев в модели растет, методы beforeSave, beforeValidate, afterValidate становятся неуправляемые и все это превращается в нетестируемый, неуправляемый код. И тут появляется то самое чувство, что ты делаешь что-то не так.
/** | |
* Функция для склонения русских слов | |
* Пример использования: ruDeclination(5,'комментари|й|я|ев') | |
* | |
* @author Павел Белоусов <pafnuty10@gmail.com> | |
* | |
* @param {number} number Число, для которого будет расчитано окончание | |
* @param {string} words Слово и варианты окончаний для 1|2|1 (1 комментарий, 2 комментария, 100 комментариев) | |
* @return {string} Cлово с правильным окончанием | |
*/ |
Обычно после написания кода его проверяют. Если речь о какой-то функции, то можно написать простой скрипт, который будет вызывать ее с разными аргументами, и смотреть, что она вернет. Если вы сделали сайт или приложение, то вы открываете его, жмете ссылки и кнопки, проверяете что все отображается верно. Это называется ручное тестирование или QA (Quality Assurance — контроль качества) — человек проверяет работу программы. Если мы попробуем автоматизировать этот процесс, и написать программу, которая проверяет правильность другой программы, то это называется автоматизированное тестирование.
Главный плюс автоматических тестов — то, что они выполняются намного быстрее, чем ручное тестирование, и вам не надо тратить на это свое время (или время тестировщика). Это позволяет запускать их хоть после каждого изменения в коде.
Также, тесты позволяют «защитить» написанный код. Если кто-то в команде (или вы сами) нечаянно «сломал» ваш код, тесты это обнаружат и укажут, что именн
These ideas are WORK IN PROGRESS!
The core idea with this workflow is that we end up with a self contained docker image of your application. This image will not only contain our code, but also all the dependencies that are neccessary to run the code. This image can then be used for both, easy deployment in production and as basis for ongoing development.
The image is not a static, though. In fact, it will see many revisions over time - which is supported nicely through dockers inheritance approach. We basically
(function(undefined) { | |
'use strict'; | |
// Check if dependecies are available. | |
if (typeof XLSX === 'undefined') { | |
console.log('xlsx.js is required. Get it from https://github.com/SheetJS/js-xlsx'); | |
return; | |
} | |
if (typeof _ === 'undefined') { | |
console.log('Lodash.js is required. Get it from http://lodash.com/'); |
<html> | |
<head> | |
<title>RSS Feed Reader</title> | |
</head> | |
<body> | |
<?php | |
//Feed URLs | |
$feeds = array( | |
"http://maxburstein.com/rss", | |
"http://www.engadget.com/rss.xml", |
#!/bin/bash | |
# From http://tech.serbinn.net/2010/shell-script-to-create-ramdisk-on-mac-os-x/ | |
# | |
ARGS=2 | |
E_BADARGS=99 | |
if [ $# -ne $ARGS ] # correct number of arguments to the script; | |
then |
var options = new FileUploadOptions(); | |
options.fileKey="fileupload"; | |
var time = new Date().getTime(); | |
var userId = getUserId(); // In my case, Parse.User.current().id; | |
var fileName = userId+"-"+time+".jpg"; | |
options.fileName = fileName; | |
options.mimeType ="image/jpeg"; | |
options.chunkedMode = false; | |
var uri = encodeURI("https://BUCKET_NAME.s3.amazonaws.com/"); |