Задачи по MYSQL

Иногда самые лёгкие задачки имеют достаточно тривиальное решение. В голову пришла задачка ответ на которую я написал через join в чём был глубоко не прав. В MySql надо избегать Join в запросах, так как это может значительно увеличить нагрузку на базу.

Задача следующая.

Есть таблица(TABLE) в соц сети.

t s
5 6
6 7
7 15
12 7
15 19
5 19

Эта таблица представляет из себя взаимосвязь дружбы между различными пользователями.
Скажем пользовать под номером 5 дружит с пользователем под номером 6 и 19, 6 дружит с 5 и 7 и так далее.

Например мы знаем что есть пользователь 5 и необходимо найти всех друзей с которыми дружит этот пользователь.

SELECT * FROM TABLE WHERE t=5 OR s=5

Второй вопрос:

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

Если мы ищем пользователя 5, то мы должны вывести пользователя 15 и 7

SELECT * FROM  users where s IN (SELECT s FROM users WHERE t = 7 ) 
OR t IN (SELECT t FROM users WHERE   s = 7 );

 

json_encode не работает при отправке координат геолакации

Если с базы отправлять координаты геолокации через json на клиент в том фиде который хранится на сервере, то json_encode перестаёт их обрабатывать.

Ошибка глупая, но убил несколько дней когда столкнулся с подобной проблемой.

 

Странный код на 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
                )

        )

)