Странный код на java

http://developer.alexanderklimov.ru/android/theory/asynctask.php#newtask

http://metanit.com/java/tutorial/3.12.php

 

 

package ru.uber_remont.uber;

import android.app.Activity;
import android.os.AsyncTask;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;


import android.view.View;

import java.util.concurrent.TimeUnit;


public class Uber extends Activity  implements OnClickListener {





     CatTask cattask;
     TextView tvInfo;


    TextView tvOut;
    Button reg;
    Button search;
    Button about;
    Button inLogin;



    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uber);

        tvInfo = (TextView) findViewById(R.id.tvInfo);

        // найдем View-элементы
        reg = (Button) findViewById(R.id.reg);
        search = (Button) findViewById(R.id.search);
        about = (Button) findViewById(R.id.about);
        inLogin = (Button) findViewById(R.id.inLogin);


        reg.setOnClickListener(this);
        search.setOnClickListener(this);
        inLogin.setOnClickListener(this);
        about.setOnClickListener(this);



        // создание обработчика
        OnClickListener oclBtn = new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            }
        };
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_uber, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onClick(View v){

        cattask = new CatTask();
        cattask.execute();


        switch (v.getId()) {
            case R.id.reg:
            {

                Intent intent = new Intent(Uber.this, Registration.class);
                startActivity(intent);
            }
            break;
            case R.id.inLogin:
            {
                Intent intent_login = new Intent(Uber.this, Login.class);
                startActivity(intent_login);
            }
            break;
            case R.id.about:
            {
                Intent intent_about = new Intent(Uber.this, A_about.class);
                startActivity(intent_about);
            }
            break;
        }
    }




    class CatTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tvInfo.setText("Полез на крышу");
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            tvInfo.setText("Залез");
        }
    }
}

рабочий код потоков

Растягивание фонового изображение на android

Долго мучился и не мог понять как сделать так чтобы изображение растягивалось во весь экран без потери качества и обрезания.

Вот готовый пример:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragme1nt"
    android:name="ru.uber_remont.uber.UberFragment"
    tools:layout="@layout/fragment_uber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:background="@drawable/imagesback" />

Здесь мы выбираем

drawable/imagesback"

Изображение которое будем растягивать с помощью свойств

android:layout_width="wrap_content"
android:layout_height="wrap_content"

Ошибка git

root@koras-work:/var/www/uber/www# git pull
error: The following untracked working tree files would be overwritten by merge:
vendor/behat/mink-browserkit-driver/LICENSE
Aborting
root@koras-work:/var/www/uber/www# git fetch –all
Fetching origin
root@koras-work:/var/www/uber/www# git reset –hard origin/master

HEAD is now at 62b6fbc Добавлен конфиг на OAuth авторизацию. Добавлен виджет на страницу регистрации. Сделано тестовое подключенние VK.

 

Задачка в SQL

Задача:

Необходимо составить запрос, который из таблицы вытащит отсутствующие поля, при условии что поле которое отсутствует может быть только +1 от поля существующего.

Таблица пример

 

s
1
2
3
4
6
7
8
9
11
12

Запрос ответ

SELECT * FROM `t` left join t t1 on t.s = t1.s + 1 where t.s is null and  t1.s is null

 

Правильный маркетинг отписки от подписки на новости

Правильный маркетинг отписки от подписки на новости

Заметил, что avito отслеживает прочтение писем подписчиком и при этом отписывает подписчика от подписки в случае если пользователь не переходит к прочтению писем.

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

Я рекомендовал так бы делать всем крупным ресурсам. Большинство писем мне приходит годами, даже оказавшись в папке спам.

trait в php

Очень часто на примерах и прототипах приходится разбирать какую-то задачу которая может произойти в боевой ситуации при разборе чужого кода. Ситуации бывают разные и сложность кода достаточно объёмная. Ладно если код большой, так он может быть и вовсе не читабельным который может превратиться в полный #говнокод.

Изучая различные ошибки с которыми придётся столкнутся в будущем или изучая определённую тему я разбирался с трейтами(http://php.net/manual/ru/language.oop5.traits.php) (#trait). Тема достаточно обширная и интересная. Сам трейты появились в ветке #php5.4 Трейты позволяют повторно использовать код php что даёт достаточно большие возможности для php.

 

Самый просто пример трейтов:

 

Я решил его расширить и сделал сложный пример с наследованием а так же переопределением конфликтов.

Все методы у меня публичные но имеют одни и те-же имена что вызывает фатальную ошибку при неявном описании:

<?php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

trait C {
    public function g() {
        echo __METHOD__;
    }

} 
trait R {
    public function g() {
        echo __METHOD__;
    }

}

/**
 * parent Class::method 
 */
class B {
    use  C, R {
        R::g insteadof C;        
    }

    public function g() {
        echo __METHOD__;
        $this -> g();
    }
}
/**
 * node Class::method 
 */
class A extends B {
    use  R, C {
        C::g insteadof R;  
    }
    public function f() {
        echo __METHOD__;
        B::g();
    }

}

$a = new A;
$a -> f();

В итоге мы получим

A::fB::gC::g

 

многомерное меню на php

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

Я не стал описывать интерфейс класса, т.к. и так понятно что и как, для опытных программистов.

 

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

/*
 * Second test task
 * @autor Glazyrev Konstantin
 * */
class Tree {

    /*
     * input array
     * */
    public $arr_tree = array();

    /*
     * output array
     */
    public $a = array();
    public function __construct() {
        $this -> arr_tree = array( 
                    array('node_id' => 1, 'parent_id' => NULL, 'title' => 'Node 1'), 
                    array('node_id' => 2, 'parent_id' => '1', 'title' => 'Node 2'), 
                    array('node_id' => 3, 'parent_id' => '2', 'title' => 'Node 3'), 
                    array('node_id' => 4, 'parent_id' => '2', 'title' => 'Node 4'), 
                    array('node_id' => 5, 'parent_id' => NULL, 'title' => 'Node 5'), 
        );
    }

    public function building_tree() {
        // node_id parent_id title

        if ($this -> arr_tree['0'])
            return $this -> build($this -> arr_tree);

    }

    /**
     * @param array $arr - array of data to send to the method
     * @param array $node_array - array of data to send to the method of repetition menu
     * @param  int|bool $parent_id $parent_id - value parent id
     * @param  int $node_id value parent
     * @param  int|bool $parent_id $parent_id - key parent id
     * @param  int $node_id key node
     */
    private function build($arr, &$node_array = array(), 
                                 $parent_id = NULL, 
                                 $node_id = 0, 
                                 $node = 'node_id', 
                                 $parent = 'parent_id') {
        // многомерный родительский массив перебираем
        foreach ($arr as $value) {
            if ($value[$parent] == $parent_id) {
                $node_array['array'][$value[$node]] = $value;
            }
        }
        if (isset($node_array['array'])) {
            foreach ($node_array['array'] as $val) {

                $this -> build($arr, $node_array['array'][$val[$node]], $val[$node]);
            }

        }
        $this -> a = $node_array;
        return $node_array;
    }

}

$obj = new Tree;
$obj -> building_tree();
print_r($obj -> a);

В итоге должно получится что-то вроде такого на выходе

Array
(
    [array] => Array
        (
            [1] => Array
                (
                    [node_id] => 1
                    [parent_id] => 
                    [title] => Node 1
                    [array] => Array
                        (
                            [2] => Array
                                (
                                    [node_id] => 2
                                    [parent_id] => 1
                                    [title] => Node 2
                                    [array] => Array
                                        (
                                            [3] => Array
                                                (
                                                    [node_id] => 3
                                                    [parent_id] => 2
                                                    [title] => Node 3
                                                )

                                            [4] => Array
                                                (
                                                    [node_id] => 4
                                                    [parent_id] => 2
                                                    [title] => Node 4
                                                )

                                        )

                                )

                        )

                )

            [5] => Array
                (
                    [node_id] => 5
                    [parent_id] => 
                    [title] => Node 5
                )

        )

)

 

использование curl в yii2

В одном из проектов мне пришлось использовать сурл для парсинга внешних ресурсов и сохранение данных на свое стороне. Обычно я использую встроенное расширение php, которое достаточно очень гибкое и на которое жаловатся у меня нет причины, но всё же решил использовать расширение для yii2.

Экстеншен можно взять здесь http://www.yiiframework.com/extension/yii2-curl/

В принципе в документации и так всё доступно и понятно, но всё же я повторюсь.

Установка осуществляется полностью из composer

Достаточно набрать команду

root@kostiahome:/var/www/wap/www# composer  require   --prefer-dist "linslin/yii2-curl:*"

Сразу хочу упомянуть, что composer у меня как встроенная команда и запускается из любого места.

После в контролёр или в модель необходимо прописать подключение нэймспейса curl после строчки namespase

use linslin\yii2\curl;

Метод будет выглядеть так

    
       public function actionCurl($value =0)
       {
           $url = 'http://yandex.ru/search/';
        $curl = new curl\Curl();
        //post http://example.com/, reset request before
        $response = $curl->reset()->setOption(
                CURLOPT_POSTFIELDS,
                http_build_query(array(
                    'text' => $value
                )
            ))->post($url);
            return $curl->response;
       }

 

Работа в консоли в yii2

В yii2 реализована очень удобная возможность разделение среды работы на консоль и среду которая обрабатывается через запрос в браузере.

Для этого в yii2 есть специальный раздел который так и называется console находящийся в папке /console/. По файловой структуре раздел ни чем не отличается от frontend или backend. На самом деле их можно наплодить любое количество, для удобства developer(а).

По реализации работы console ни чем не отличается от других разделов, ну только запускается она на прямую с консоли в корне фреймворка командой

root@kostiahome:/var/www/wap/www# ./yii

This is Yii version 2.0.3.

The following commands are available:

- asset     Allows you to combine and compress your JavaScript and CSS files.
- cache     Allows you to flush cache.
- fixture   Manages fixture data loading and unloading.
- getlib    
- gii       This is the command line version of Gii - a code generator.
- help      Provides help information about console commands.
- message   Extracts messages to be translated from source files.
- migrate   Manages application migrations.

To see the help of each command, enter:

  yii help <command-name>

Для реализации определённого контроллера необходимо его создать файл в папке controllers

Я для примера создал файл GetlibController.php с содержанием

<?php
namespace console\controllers;

class  GetlibController extends \yii\console\Controller {

    public function actionIndex() {
        echo "Index \n";
    }
    
       public function actionTest() {
        echo "Test\n";
    }

}

Теперь можно вызывать метод контролёра yii2 из консоли по примеру

root@kostiahome:/var/www/wap/www# ls -alh console/controllers
total 12K
drwxrwxrwx 2 root   root   4,0K мая   10 12:31 .
drwxrwxrwx 7 root   root   4,0K марта  1 09:22 ..
-rw-rw-r-- 1 kostia kostia  239 мая   10 13:06 GetlibController.php
-rwxrwxrwx 1 root   root      0 марта  1 09:22 .gitkeep
root@kostiahome:/var/www/wap/www# ./yii getlib/test
Test
root@kostiahome:/var/www/wap/www#