Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Чем нарисовать структуру приложения php? [закрыт]

#php #laravel


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Есть приложение в моем случае laravel, в процессе его модификации оно сильно разрастается,
и становится не удобно работать с кучей файлов и все это в голове держать, если какой
то инструмент чтобы можно было отобразить как то структуру приложения в виде блоксхемы
например, то есть по всем затронутым и используемым функциям классам итд рисовался
график или mindmap?
    


Ответы

Ответ 1



Я умаю стоит попробовать Microsoft Visio. Ну или Dia под Ubuntu.

Обработка ошибки в функции в MS SQL Server

#sql_server


Как Обработать ошибки в пользовательской функции в MS SQL Server? try...catch в ней
не разрешены, а что надо делать?
    


Ответы

Ответ 1



Сформировать ошибку Raise-ом не получится. Но! Можно сделать специально ошибку. Например, сделать SELECT CAST('<Маркер_сообщения>Сообщение' AS Int), что приведет к ошибке CAST-а. А уже выше уровнем, где ловится ошибка обработать следующее сообщение: Conversion failed when converting the varchar value '<Маркер_сообщения>Сообщение' to data type int. Естественно, придется исходное сообщение вырезать и сделать снова RaisError уже с исходным сообщением. Если у вас стандартная процедура обработки ошибок и используется во всех(!) CATCH-ах, то такой подход вполне может сработать.

Расширение для Chrome DevTools

#javascript #google_chrome #chrome_extension


Подскажите, каким образом добавить свой пункт меню к меню DevTools?

Суть в следующем, при инспектировании кода, при клике правой кнопкой мыши появляется
контекстное меню 


Хотелось бы добавить в него свой пункт, и отловить событие клика по нему.
    


Ответы

Ответ 1



Из консоли можно обращаться к выделенному элементу через $0. Соответственно, если ты добавишь нужную функцию на страницу, то сможешь передать ей элемент руками из консоли.

Ответ 2



Скорее всего никак, в оф. доках нигде не указана возможность работы с контекстным меню вызванным из devTools хрома. Весь интерфейс для расширения ограничивается только: inspectedWindow network panels Panels, как сначала может показаться, доступа к контекстному меню не предоставляет. network - работа с сетью. inspectwindow - доступ к текущему окну, в котором открыт devTools. Почитать, поразбираться UPD: Я вот что подумал, последний выделенный элемент в консоли доступен по ссылке $0, может быть попробовать воспользоваться ею? Что бы получить код, можете сделать так $0.outerHtml

iptables https перенаправление на nodejs (правило)

#linux #nodejs #iptables #маршрутизация


Здравствуйте! подскажите как указать правило для iptables перенаправлять все https
запросы на nodejs?

для http сделано так

iptables

sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to 127.0.0.1:3000


nodejs

app.route('/*').get(function(req, res) {
  logreq(req);
  //res.send("");
});

function logreq(req){

  var method  = req.method
    , len = 10 - +method.length
    , met = new Array(len).join(" ");

  console.log("\n \033[32m ",me+met,"\033[42m\033[0m",
              "\033[33m hostname: \033[42m\033[0m",req.headers.host,
              "\033[32m Pathname: \033[42m\033[0m",req.url)
};

var server = app.listen(3000, '127.0.0.1', function(){

});

    


Ответы

Ответ 1



Проблема в том, что nodejs будет слушать порт не по ssl, а подключение будет подразумевать использование ssl-шифрования. И браузер будет выдавать ошибку ssl, поскольку будет ждать ssl-handshake, но его не получит. Е Если вам необходимо слушать именно https, то ознакомьтесь с примером в документации: https://nodejs.org/api/https.html

Сортировка элементов (insertion sort) односвязного списка. си

#c #сортировка #указатели #список


Добрый день, 

Были заданы два задания: 


Создать односвязный список (список литературы);
На основе первого задания, сделать сортировку вставками по ISBN книг в порядке возрастания. 


Сам список отработал хорошо. Сортировку же реализовать не удаётся.
Вот наработки кода сортировки, есть ли хоть что-то близкое к истине?   

    element* insert_sorted(element *first, element *new_elem) {

    element *current = first;
    //element *insert = first;
    current = current->next; 
    element *temp;

    // element *next = first->next;
    // element *prev=NULL;
    // prev->next = first;

    // if(first==NULL){
    //     first = new_elem;
    // }
    while(current!=NULL){
        new_elem = first;
        while(new_elem!=current){
            if(new_elem->isbn > current->isbn){
                    temp = current->next;
                    current->next = new_elem;
                    new_elem->next = temp;

                    // first = next;
                    // temp = next;
            }
            else{
                new_elem = new_elem->next;
                    // end = next->next;
                    // next->next = new_elem;
                    // new_elem->next = end;

                    // prev = next;
                    // next = first->next;
            }
        }
        // else{
        //     prev = new_elem;
        //     new_elem = new_elem->next;
        // }
        // next = new_elem->next;
        // if (next == end){
        //     end = new_elem;
        }
    return first;
}


Код программы целиком: 

#include 
#include 
#include 

typedef struct _element element; 

typedef struct _list list;

struct _list {      
    element *first; 
    int count;      
};

struct _element
{
    char *title;
    char *author;
    int year;
    long long int isbn;
    element *next;
};

element* insert_sorted(element *first, element *new_elem) {
    /* HIER implementieren. */
    element *current = first;
    //element *insert = first;
    current = current->next; 
    element *temp;
    // element *next = first->next;
    // element *prev=NULL;
    // prev->next = first;

    // if(first==NULL){
    //     first = new_elem;
    // }
    while(current!=NULL){
        new_elem = first;
        while(new_elem!=current){
            if(new_elem->isbn > current->isbn){
                    temp = current->next;
                    current->next = new_elem;
                    new_elem->next = temp;

                    // first = next;
                    // temp = next;
            }
            else{
                new_elem = new_elem->next;
                    // end = next->next;
                    // next->next = new_elem;
                    // new_elem->next = end;

                    // prev = next;
                    // next = first->next;
            }
        }
        // else{
        //     prev = new_elem;
        //     new_elem = new_elem->next;
        // }
        // next = new_elem->next;
        // if (next == end){
        //     end = new_elem;
        }
    return first;
}

element *construct_element(char *title, char* author, int year, long long int isbn) {

    element *buch =  (element*) malloc (sizeof(element));
    buch->title = malloc(MAX_STR* sizeof(char));
    buch->author = malloc(MAX_STR* sizeof(char));
    strcpy(buch->title,title);
    strcpy(buch->author,author);
    buch->year = year;
    buch->isbn = isbn;
    buch->next = NULL;
    return buch;
}

void free_list(list *alist) {

    element* current;
    element* head = alist->first;

    free(alist);

    while((current = head) != NULL){
        head = head->next;

        free(current->title);
        free(current->author);
        free(current);
    }
}

void read_list(char* filename, list *alist) {
    element* new_elem;

    char title[MAX_STR];
    char author[MAX_STR];
    int year;
    long long int isbn;
    while(read_line(filename, title, author, &year, &isbn) == 0) {
        new_elem = construct_element(title, author, year, isbn);
        alist->first = insert_sorted(alist->first, new_elem);
        alist->count++;
    }
}

list* construct_list() {
    list *alist = malloc(sizeof(list));
    alist->first = NULL;
    alist->count = 0;
    return alist;
}

void print_list(list *alist) {
    printf("Meine Bibliothek\n================\n\n");
    int counter = 1;
    element *elem = alist->first;
    while (elem != NULL) {
        printf("Buch %d\n", counter);
        printf("\tTitel: %s\n", elem->title);
        printf("\tAutor: %s\n", elem->author);
        printf("\tJahr:  %d\n", elem->year);
        printf("\tISBN:  %lld\n", elem->isbn);
        elem = elem->next;
        counter++;
    }
}

int main() {
    list *alist = construct_list();
    read_list("buecherliste.txt", alist);
    print_list(alist);
    free_list(alist);
    return 0;
}

    


Ответы

Ответ 1



Вам не следует использовать имена, начинающиеся с подчеркивания, так как они зарезервированы за реализацией стандартных библиотек. Также совершенно нет никакой необходимости объявлять список в динамической памяти. Ниже приведена демонстрационная программа, которая сортирует список по возрастанию номеров ISBN. Надеюсь, она использует метод сортировки вставкой.:) Для наглядности я упростил определения и убрал из программы все лишнее, что не требуется конкретно для сортировки. Вам, естественно, потребуется нарастить "мясом" данный "скелет" метода. #include #include #include typedef struct element { unsigned long long int isbn; struct element *next; } element; typedef struct list { element *first; int count; } list; list construct_list() { list lst = { NULL, 0 }; return lst; } void push_front( list *lst, unsigned long long int isbn ) { element *item = malloc( sizeof( element ) ); if ( item ) { item->next = lst->first; item->isbn = isbn; lst->first = item; } } void print_list( const list *lst ) { for ( const element *current = lst->first; current; current = current->next ) { printf( "%lld ", current->isbn ); } } void sort_by_isbn( list *lst ) { if ( lst->first ) { element *current = lst->first->next; lst->first->next = NULL; while ( current ) { if ( current->isbn < lst->first->isbn ) { element *tmp = current; current = current->next; tmp->next = lst->first; lst->first = tmp; } else { element *first = lst->first; while ( first->next && !( current->isbn < first->next->isbn ) ) { first = first->next; } element *tmp = current; current = current->next; tmp->next = first->next; first->next = tmp; } } } } #define N 10 int main( void ) { list lst = construct_list(); srand( ( unsigned int )time( NULL ) ); for ( int i = 0; i < N; i++ ) push_front( &lst, rand() ); print_list( &lst ); printf( "\n" ); sort_by_isbn( &lst ); print_list( &lst ); printf( "\n" ); return 0; } Вывод программы может выглядеть следующим образом: 461971353 1686854524 262763134 1776774882 166562428 351823644 1662884659 155739745 669011733 1476766544 155739745 166562428 262763134 351823644 461971353 669011733 1476766544 1662884659 1686854524 1776774882

Построение круговой диаграммы Java

#java


Пытаюсь построить круговую диаграмму на основе массива, которая будет отражать элемент,
и в зависимости сколько раз она повторяется какая-то часть диаграммы ему будет соответствовать.
Сделал все по классике: создал map, в него записываю элемент массива и количество повторений.
Столкнулся с проблемой вывода (см. рисунок). Проблема состоит в том что в массиве 1
встречается чаще, но на диаграмме ей соответствует меньшая область, чем например 5,
которая встречается всего 1 раз;

public class CreateChart extends JFrame{

    public CreateChart(String appTitle, String chartTitle)
    {
        PieDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset,chartTitle);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500,300));
        setContentPane(chartPanel);
    }


    private PieDataset createDataset()
    { int[] mas = {1,1,1,2,2,4,3,2,3,4,5};
      Map map = new HashMap();

     for(int i=0;i


Ответы

Ответ 1



Проверил все работает. result.setValue принимает в качестве второго аргумента тип double, поэтому разумнее пользоваться приведением типа к double(если версия Java 7 или выше) или Double. for (Map.Entry entry : map.entrySet()) { result.setValue(entry.getKey().toString(), (Double)entry.getValue()); }

WPF MVVM - Анимация перехода между представлениями

#wpf #анимация #mvvm #mvvm_light


Разрабатываю проект на WPF с использованием паттерна MVVM. Использую MVVM Light.
Каким образом возможно реализовать анимацию переходов от одного представления к другому?
К примеру, плавное "затухание" одного и появление другого.
    


Ответы

Ответ 1



Не знаю как это делается в MVVM Light, я обычно определяю StoryBoard внутри нужного элемента c нужной анимацией, привязываю триггер анимации к нужному свойству элемента, через который реализован переход (скажем, Button.IsPressed). Все работает. Здесь поподробнее https://msdn.microsoft.com/ru-ru/library/ms742868(v=vs.110).aspx

Java socket timeout

#java #сокет


Проект

В общем вот ссылка на проект, реализована игра быки-коровы:
сервер генерирует "слово" из 4 цифр, а клиент пытается его отгадать. Налажено подключение
и отключение. Но не могу реализовать тайм аут, если пользователь или сервер долгое
время не получали сообщений.
Максимум что удавалось, это в контроллере Клиента вызывать в методе нажатия кнопки
после считывая данных функцию setOutTimeout, или которая бы сверяла System.currentMills
заданную перед проверкой и после, все в целом отрабатывает и закрывает сокет, но появляется
ошибка в Моделе: Stream closed.
    


Ответы

Ответ 1



В общем, реализовал как смог, с помощью костылей. class TimeoutThread extends Thread { private final int time; private boolean isStop = false; public TimeoutThread(int time) { super(); this.time = time; } public void stopCheckTimeout() { this.isStop = true; } @Override public void run() { try { System.out.println("start"); long endTime = System.currentTimeMillis() + time; count = time / 1000; while (!isStop) { count--; Thread.sleep(1000); System.out.println("ooo"); ClientPresenter.getInstance().handleResult(String.valueOf(count)); if (System.currentTimeMillis() > endTime) { System.out.println("disc"); disconnect(); break; } } System.out.println("finish"); } catch (Exception e) { e.printStackTrace(); } } И использовал: new Thread(() -> { TimeoutThread timeoutThread = new TimeoutThread(10000); while (status) { try { if (isReceive()) { timeoutThread.stopCheckTimeout(); //stop current timeout boolean gameFinished = check(); if(gameFinished) { return; } timeoutThread = new TimeoutThread(10000); // start new timeoutThread.start(); } } catch (Exception e) { status = false; } } }).start();

Почему хелпер “devise_controller?” возвращает false для моего кода?

#ruby_on_rails #devise


Почему хелпер devise_controller? возвращает false для следующего кода:

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
layout :resource
protected
def resource
  if devise_controller?
    #"admin"
    puts "admin"
  else
    #"application"
    puts "app"
  end
end
end


при этом в строке браузера переход на "http://127.0.0.1:3000/admin/review"

файл routes.rb:

 Rails.application.routes.draw do
  get 'admin/show'
  get 'admin/upload'
  get 'admin/review'
  get 'welcome/index'
  get 'welcome/portfolio'
  get 'welcome/about'
  get 'welcome/contact'
  get 'welcome/blog'
  get 'welcome/review'
 end


при этом для остальных маршрутов   get 'admin/show'и get 'admin/upload' хелпер выдает
true ....

Обновление

В общем проблему решил так. Добавил в ApplicationController фильтр

before_filter :my_filter, unless: :devise_controller?

 def my_filter
    if params['controller'] == 'admin'
      render layout: "admin"
    end
 end


Но вопрос по существу остается - почему через layout тоже самое со сбоями работает?
    


Ответы

Ответ 1



Метод devise_controller? лишь проверяет унаследован ли ваш класс от класса DeviseController def devise_controller? is_a?(::DeviseController) end У вас контроллер наследуется от ActionController::Base, поэтому условие не всегда может быть выполнено. Для проверки факта аутентификации лучше воспользоваться хелперами Devise: user_signed_in? и current_user. Если вам нужно сменить layout не зависимо от того, аутентифицирован пользователь или нет - просто меняйте его в render (как вы собственно и поступили в Обновлении).

Приложение вылетает с NullPointerException при переходе на MapFragment на эмуляторе

#android #android_studio #google_maps_api


Возникла необходимость интегрировать в проект карты google, накидал по руководству
google MapFragment, до этого с картами google дел не имел, проверил вчера на телефоне(Samsung
Galaxy S4) - фрагмент открывается и корректно отображает карту. GoogleMaps API на сайте
google активирован, ключ Api в манифесте прописан. Activity, в котором запускаются
фрагменты, наследуется от AppCompatActivity. При попытке перехода на фрагмент с картой
на встроенном в студию эмуляторе(Nexus 4 21 API(with GoogleAPIs) и Nexus 4 23 API(with
GoogleAPIs), приложение вылетает. 

Вопрос: Что можно предпринять, чтобы фрагмент с картами корректно запускался и отображал
карты на эмуляторе?

Прилагаю стактрейс ошибки, полный код фрагмента, и частично лэйаут, манифест и Build.gradle.

Cтактрейс ошибки:

12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.320 2318-2318/xx.xxx.xxx D/AndroidRuntime: Shutting down VM
12-07 11:15:09.320 2318-2318/xx.xxx.xxx E/ACRA: ACRA caught a NullPointerException
for xx.xxx.xxx
                                                        java.lang.NullPointerException:
Attempt to invoke virtual method 'void com.google.android.gms.maps.MapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)'
on a null object reference
                                                            at xx.xxx.xxx.courier.OrdersFragmentMap.onCreateView(OrdersFragmentMap.java:45)
                                                            at android.app.Fragment.performCreateView(Fragment.java:2220)
                                                            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
                                                            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
                                                            at android.app.BackStackRecord.run(BackStackRecord.java:793)
                                                            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
                                                            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482)
                                                            at android.os.Handler.handleCallback(Handler.java:739)
                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                            at android.os.Looper.loop(Looper.java:148)
                                                            at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                            at java.lang.reflect.Method.invoke(Native
Method)
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)




Код фрагмента с картами:

package xx.xxx.xxx.courier;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import xx.xxx.xxx.R;

public class OrdersFragmentMap extends Fragment implements OnMapReadyCallback {

    public static OrdersFragmentMap newInstance() { return  new OrdersFragmentMap(); }

    public OrdersFragmentMap() {  }

    @Override
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
        View view = inflater.inflate(R.layout.courier_fragment_map, container, false);
        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng sydney = new LatLng(-33.867, 151.506);

        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

        googleMap.addMarker(new MarkerOptions().title("Sydney").snippet(
                "The most populous city in Australia.").position(sydney));

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }
}


Лэйаут, содержащий MapFragment(фрагмент):



    
   



Манифест(фрагмент):




    
    
    
    
    
    
    
    
    

 
    

    
        
        
        

         

    



Build.gradle(фпагмент): 

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.nbsp:library:1.01'
    compile 'info.hoang8f:android-segmented:1.0.6'
    compile 'ch.acra:acra:4.7.0-RC.3'
    compile 'com.google.android.gms:play-services-maps:8.3.0'
    compile 'com.google.android.gms:play-services-ads:8.3.0'
    compile 'com.google.android.gms:play-services-auth:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'
    compile 'com.google.android.gms:play-services:8.3.0'
}

    


Ответы

Ответ 1



Решил проблему следующим образом. Во-первых изменил код класса фрагмента, чтобы приложение не вылетало на версиях API 21 и выше: public class OrdersFragmentMap extends Fragment implements OnMapReadyCallback, LoaderManager.LoaderCallbacks { ArrayList freeOrders = new ArrayList<>(); ArrayList myOrders = new ArrayList<>(); private FragmentActivity myContext; public static OrdersFragmentMap newInstance() { return new OrdersFragmentMap(); } public OrdersFragmentMap() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.courier_fragment_map, container, false); FragmentManager fm = myContext.getSupportFragmentManager(); SupportMapFragment mapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map, mapFragment).commit(); mapFragment.getMapAsync(this); return view; } @Override public void onMapReady(GoogleMap googleMap) { LatLng sydney = new LatLng(-33.867, 151.506); googleMap.setMyLocationEnabled(true); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); googleMap.addMarker(new MarkerOptions().title("Sydney").snippet( "The most populous city in Australia.").position(sydney)); } @Override public void onResume() { super.onResume(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onAttach(Activity activity) { myContext=(FragmentActivity) activity; super.onAttach(activity); Метод onAttach() является устаревшим и я использую его временно только для того, чтобы запустить android.support.v4.app.FragmentManager в AppCompatActivity. Во-вторых создал шаблон MapActivity, для этого в корне проекта щелкнуть правой клавишей мыши, выбрать new>Google>GoogleMapsActivity. Из трех созданных файлов оставил только res/values/google_maps_api.xml(debug), скопировал из него ссылку для генерации ключа, которая находится в комментарии, перешел по ней в браузере, создал ключ и все заработало. Самое странное, что до этого вводил тот же фингерпринт и имя пакета. Такие вот дела. А на Galaxy S4 API работал, видимо, в обход защиты Google, так как запросов в консоли разработчика во время работы приложения не было.

Выполнение функции при закрытии окна браузера

#javascript #ajax #браузер


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

Есть база, в которой хранится число посетителей, есть php-скрипт, который должен
добавлять в базу +1 при входе юзера (это работает с событием ready) и -1 при его выходе
с сайта (с этим проблема). Есть функция, которая отправляет ajax-запрос на этот php-скрипт,
и есть событие onbeforeunload или unload, вызывающее функцию.

Не знаю, кто из этого списка виновный, но функция умудряется срабатывать аж после
закрытия страницы, при её следующей загрузке. То есть функция срабатывает только при
обновлении страницы или её восстановлении (cntrl+shift+T) даже раньше события ready,
но если страницу просто закрыть, то вообще никакого эффекта не будет. Тестировал только
в firefox, т.к. этот браузер приоритетен. 

Сам код:

HTML:




JS:

function putout() {
    $.ajax({
        type: "POST",
        url: "./php/process.php",
        data: {
            'function': 'putout',
            'def': def,
        },
        dataType: "json",
        success: function(data) {

        },
    });
}


PHP:

include ('./php/connect.php');
mysql_query("UPDATE numb SET numb=numb-1");


Ещё я наслышан о том, что опера и вовсе игнорирует эти события, тогда как вообще
кроссбраузерно реализовать счётчик посетителей сайта?

P.S. Текст уже тыщу раз переисправляли, это уже совсем не мой стиль изложения, примите
к сведению. Вообще ненавижу возможность лезть без спроса в мои публикации сторонним
людям, это ОЧЕНЬ раздражает.
    


Ответы

Ответ 1



Метод выполняется при загрузке страницы, но не срабатывает при выгрузке из-за некорректного использования. Этот код window.onbeforeunload = putout(); выполнит функцию сразу после загрузки скрипта, еще до готовности страницы. В то же время, к событию не присоединится никакой хэндлер, так как функция вернёт undefined. Чтобы указать хэндлер для события, надо убрать вызов метода: window.onbeforeunload = putout; Теперь функция не будет вызываться при старте, а будет вызываться перед выгрузкой. В любом случае, это некорректный подход к подсчету пользователей.

Fatal error: Namespace declaration statement has to be the very first statement in the script

#php #namespace


Не могу понять почему выскакивает данная ошибка. Вот код файла, в котором ошибка
 Fatal error: Namespace declaration statement has to be the very first statement in
the script in /var/www/html/phpinstagram/phpinstagram/Instagram.php on line 2

feed = new \phpinstagram\Instagram\Api\Feed();
    $this->feed->setInstagram($this);
    $this->auth = new \phpinstagram\Instagram\Api\Auth();
    $this->auth->setInstagram($this);
    $this->_communication = new \phpinstagram\Instagram\Client\Communication();
}

public function addCommand(\phpinstagram\Instagram\Command\ICommand $cmd) {
    $this->_commands[] = $cmd;
}

public function run() {
    $executed = array();
    //$cookieJar = null;
    foreach ($this->_commands as $utcmd) {
        if ($utcmd instanceof \phpinstagram\Instagram\Command\ICommand) {
            /*
             * @var \phpinstagram\Instagram\Command\ICommand
             */
            $cmd = $utcmd;

            //if (!is_null($cookieJar))
            //  $this->_communication->getClient()->setCookieJar($cookieJar);

            foreach ($cmd->dependsOn() as $dependency) {
                foreach ($executed as $previous) {
                    if (get_class($previous) == '\Instagram\Command\\' . $dependency) {
                        break 2;
                    }
                }
                throw new \phpinstagram\Instagram\Command\DependencyException(
                    'Command ' . get_class($cmd) . " depends on $dependency but it
never was executed!\n\n"
                );
            }
            $cmd->setCommunication($this->_communication);

            $cmd->validate();

            //echo get_class($cmd)." is valid. executing...\n\n";
            $cmd->exec();

            $executed[] = $cmd;

            // reset parameters
            $this->_communication->getClient()->resetParameters();
            //$cookieJar = $this->_communication->getClient()->getCookieJar();
        }
    }

    // reset commands
    $this->_commands = array();
}


}
    


Ответы

Ответ 1



Решено, ответ можно посмотреть тут: stackoverflow

Как получить длительность mp3 файла без скачивания всего файла

#c_sharp #mp3


Для изображений есть метод для определения размера картинки без полного скачивания.
https://stackoverflow.com/questions/111345/getting-image-dimensions-without-reading-the-entire-file

А вот как быть с mp3 файлами? Есть ли такое для таких файлов?
    


Ответы

Ответ 1



Из-за возможного VBR и неясной длины тегов (особенно если там картинок понапихано) - в общем случае нельзя Можно оценить примерно по размеру, битрейту нескольких первых фреймов(битрейт указывается в заголовке каждого фрейма, и по ним можно понять CBR там или порядок значения VBR) и надежде, что картинка если и есть - то небольшая. Если удаленный сервер поддерживает, причем скоре всего да - слать Range-запросы(т.е. читать не целиком, а только начало), либо менее красиво - оборвать коннект, прочитав кусок. В теории можно через range так же попробовать прочитать собственно и теги, но это уже несколько запросов на один файл - теги живут либо в начале, либо в конце файла

Не биндятся данные на балун

#yandex_maps_api #knockoutjs #yandexmapkit


Использую KnockoutJS и Яндекс Карты.

Данные на страницу биндятся, а в балун нет. Можно ли так биндить данные на яндекс
карту? Если нет, то какое решение подскажите, может библиотека какая есть?

Пример:






    Showing pixel and tile coordinates
    
    
    
    
    
    


    
# Заголовок Содержимое


Ответы

Ответ 1



myPlacemark.events.add('balloonopen', function (args) { // TODO reapply knockout bindings });

Редактирование блоков в wordpress

#php #wordpress #шаблоны




У меня есть 2 блока на одной странице(1 блок со светлым фоном, 2 блок с тёмным фоном)Подскажите
что нужно прописать в index.php , чтобы можно было редактировать каждый блок отдельно?

    


Ответы

Ответ 1



Приветствую, тут есть два решения: Необходимо зарегистрировать произвольные области, например: ID, 'имя фрейма', true)); ?> и использовать их для своих нужд. Если все это есть на каждой странице, то необходимо создать облать для виджета в function.php, например: $args_footer1 = array( 'name' => __( 'Позиция footer колонка 1', 'wob_theme' ), 'id' => 'wob_theme_foooter1', 'description' => 'Колонка с произвольным текстом', 'class' => 'col-md-3 col-sm-6 inner', 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

' ); register_sidebar($args_footer1); и вызвать её, как нормальный человек в footer.php Более подробное описание: https://codex.wordpress.org/WordPress_Widgets https://codex.wordpress.org/Custom_Fields

Import Error при запуске celery

#python #celery


У меня есть такая структура папок: 

- src
     -- \frontend
          --- \views
              ---- tasks.py
      -- \generator
          --- tasks.py


Во frontend/views/tasks я делаю: from generator import tasks.
При запуске селери из папки views питон пишет:  


  ImportError: No module named generator


В чем причина такой ошибки?
    


Ответы

Ответ 1



Родительская директория generator обязана быть в sys.path, чтобы from generator import tasks в этом случае работал. Достаточно из src директории запускать, чтобы путь в PYTHONPATH автоматически добавился: src$ python -m frontend.views.tasks Если хочется запускать из других директорий во время разработки, то можно создать setup.py для каждого пакета и установить их: $ pip install -e . Не стоит руками изменять sys.path в своём коде -- это ведёт к сюрпризам с неочевидным происхождением, например, см. Traps for the Unwary. Некоторые пакеты автоматически модифицируют sys.path, например, twisted использует _preamble.py, чтобы скрипты из bin директории могли без установки twisted пакет найти. Но подобная практика не поощряется, например, Pypy имел в прошлом похожий скрипт autopath.py, но сейчас он больше не используется -- он создаёт больше проблем чем решает. Пример проблем с импортом: Why python finds module instead of package if they have the same name?

Как в обработчике blur дождаться окончания обработки в focus

#jquery #angularjs #blur #focus


Возникла проблема с созданием datepicker для поля даты. На поле висит 2 обработчика
- blur и focus, в focus создается datepicker, в blur он удаляется. Причем в focus он
создается с помощью deferred объекта.

.directive('datePicker', [ '$compile', '$document', 'datePickerService', '$templateRequest',
function ($compile, $document, datePickerService, $templateRequest) { 
    function link(scope, element, attrs) {
            var picker = null;
                var $elementFocusProcessing = $.Deferred();
                element.on('focus', function (event) {
                    populatelimits();
                    prepareViewData();
                    var pos = angular.extend(element.offset(), { height: element[0].offsetHeight
});                    

                    $templateRequest(datePickerService.datePickerTemplate).then(function
(html) {
                        var template = angular.element(html);
                        $document.find('body').append(template);
                        picker = $compile(template)(scope);
                        picker.css({ top: pos.top + pos.height + 5, left: pos.left,
display: 'block', position: 'absolute' });

                        picker.on('mousedown', function (evt) {
                            evt.preventDefault();
                        });
                        $elementFocusProcessing.resolve();
                    });
                });

                element.on('blur', function () {
                    $elementFocusProcessing.then(function () {
                        if (picker) {
                            picker.remove();
                            picker = null;
                        };
                        $elementFocusProcessing = $.Deferred();
                    });
                });
            }

        return {
            restrict: 'A',
            link: link,
            scope : {
                model: '=ngModel'
            }
        };


И собственно проблема: если выделить поле даты, потом переключиться на другое окно,
а затем кликнуть на любое место страницы, кроме поля даты, возникают подряд несколько
событий: focus поля, blur поля, click по странице. При этом создание picker в focus
завершается позже, чем попытка его удаления в blur, и он не удаляется, хотя фокус элемента
в тоге оказывается потерян. Как сделать так, чтобы выполнение кода в blur происходило
только после завершения выполнения кода в focus? Мне пока пришло в голову только сделать
дополнительную переменную focusEnded для определения того, идет ли выполнение кода
в focus, а в blur организовать цикл с таймаутом, но чувствую, что можно более изящно
сделать это с использованием deferred объектов.
    


Ответы

Ответ 1



Так как рабочего примера нет, можно рассуждать только теоретически: Так как шаблон не меняется, его не нужно подгружать не только на каждый фокус, но и на каждый link. Следовательно, его можно вынести из функции и результат, а он является promise, сохранить в переменной: var templatePromise = $templateRequest(datePickerService.datePickerTemplate); Далее, функция link, внутри нее подразумеваем, что шаблон уже подгрузился, для этого все остальное делаем в обработчике success функции then у нашего сохраненного templatePromise function link(scope,element,attrs){ templatePromise.then(function(html){ //достаточно сделать всего один элемент, // который мы будем добавлять или удалять var template = angular.element(html); //и добавим событие, чтобы не добавлять его каждый раз //так как template это уже объект jqLite можно сделать так template.on('mousedown', function (evt) { evt.preventDefault(); } ); //добавляем on focus element.on('focus', function (event) { ... $document.find('body').append(template); $compile(template)(scope); //так как template это объект jqLite, то вместо picker можно использовать его template.css(...) ... }); //добавляем on blur element.on('blur', function () { //так как добавляли template, то и удалять можно его //а так как он у нас всегда есть, то не надо проверять на null template.remove(); }); }); }

phpDesigner ошибка при подключении к SFTP

#linux #debian #sftp


phpDesigner выдаёт ошибку при подключении:


  Server does not support diffie-hellman-group1-sha1 for keyexchange


Пробовал прописывать в конфиг sshd_config

kexalgorithms diffie-hellman-group1-sha1


К серверу вообще перестает подключаться.

В чем проблема? WinSCP нормально подключается.
    


Ответы

Ответ 1



после внесения таких изменений необходимо создать недостающие в /etc/ssh ключи: $ cd /etc/ssh $ sudo ssh-keygen -A вот тут рекомендуют добавить и другие алгоритмы и ciphers-ы, т.е., строка для kexalgorithms: kexalgorithms diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1 и ещё одна строка для ciphers: ciphers 3des-cbc,blowfish-cbc,aes128-cbc,aes128-ctr,aes256-ctr а вообще, конечно, лучше обновить этот самый phpdesigner.

Добавление файлов в архив с зашифрованными именами файлов. SevenZipSharp

#c_sharp #7z


При добавлении файлов в архив с зашифрованными именами файлов получаю исключение:
Invalid archive: open/read error! Is it encrypted and a wrong password was provided?
If your archive is an exotic one, it is possible that SevenZipSharp has no signature
for its format and thus decided it is TAR by mistake. Message: Can not update the archive:
Open() failed.
Если EncryptHeaders = false то всё работает нормально. 
А как добавить если EncryptHeaders = true?

SevenZipCompressor szc = new SevenZipCompressor();
szc.ArchiveFormat = OutArchiveFormat.SevenZip;
szc.ZipEncryptionMethod = ZipEncryptionMethod.Aes256;
//szc.EncryptHeaders = true;

szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\123.txt");
szc.CompressionMode = CompressionMode.Append;
szc.CompressFilesEncrypted("test.7z", "123", @"C:\Test\1234.txt");

    


Ответы

Ответ 1



Существует, как минимум, два варианта решения данной проблемы. 1. Изменить формат архива. Вместо szc.ArchiveFormat = SevenZip.OutArchiveFormat.SevenZip; использовать szc.ArchiveFormat = SevenZip.OutArchiveFormat.Zip; как советуют здесь. 2. Добавлять все файлы одновременно передавая полные пути в массиве при создании архива. Например: string[] arr = { @"C:\Test\1234.txt", @"C:\Test\1235.txt" }; ... szc.CompressionMode = CompressionMode.Create; szc.CompressFilesEncrypted("test.7z", "123", arr); Однако в этом случае все файлы добавляются сразу и добавить два раза один и тот же файл не получится.

Можно ли узнать размеры контейнера для картинки динамически?

#javascript #html #jquery #css #aspnet_mvc


Пользователь при создании новости на сайте должен загрузить заставку(картинку) для
этой новости. Новость создана, проверена модератором, уходит в новостную ленту. Какие
есть способы сжать картинки, когда они рендерятся на страницу, чтобы уменьшить количество
загружаемых данных?
Платформа Asp.Net MVC 4, есть несколько вариантов, по крайней мере известных мне:


Можно сохранять картинку на сервере и далее сжимать ее сторонней программой без потери
качества. Вариант очень плохой.
Сжимать картинку сразу при ее добавлении на сервер и далее выплевывать ее уже сжатой,
но качество картинки будет страдать.Вариант получше, но тоже не торт.
Через HttpHandler (уже написал теперь пробую), который ловит request и возвращает
сжатую картинку, но и тут возникает проблема, когда я начинаю обрабатывать эту картинку
я указываю у нее размер и степень сжатия(или качества). Если размер не указывать, то
объем картинки, конечно уменьшается, но не на столько, насколько с размером. Макет
страницы резиновый, по-этому точный размер картинки я задать не могу, для каких то
частей сайта, да он фиксированный например для аватара пользователя, но для большинства
нет. Вот тут и возникает вопрос можно ли как то это сделать динамически, под разный
размер экрана пользователя? Чтобы в мой request еще приходили примерные размеры картинки,
для той или иной области.


Прим. контейнер для картинки:



figure {
  width: 100%;
  height: 400px;
  position: relative;
}

figure img {
  width: 100%;
  height: 100%;
  display: block;
}
 @Model.NewDateAdd.ToShortDateString()
  @Model.BlogName
 @Model.CountLikes
Нужно вычислить размеры W и H контейнера "figure", его CSS


Ответы

Ответ 1



Гораздо лучше для этой цели подойдёт использование атрибута srcset или элемента , которые позволяют браузеру выбирать подходящее изображение в зависимости от параметров экрана. Подробнее про гибкие изображения на MDN. В таком случае размеры можно указать в query-параметрах и пересжать уже под них в хэндлере. Впрочем, я бы пожалел процессорное время и просто держал на диске несколько картинок под разные размеры и сжимал сразу при загрузке. Кстати, возможно, при сжатии стоит обратить внимание на начальный формат - jpg/png и сохранить его, чтобы избежать артефактов сжатия на png. Ну и отдельный вопрос про анимированный gif.

Ответ 2



var container = document.getElementsByClassName("container"); console.log("Width = " + container[0].clientWidth + "px" + "\n " + "Height = " + container[0].clientHeight + "px") header { width: 500px; height: 300px; background: blue; } .container { width: 100%; height: 100%; background: #000; }


Проблемы при настройке symfony 2.7 и 3.0 (проблема одна и та же)

#php #framework #symfony2 #symfony #symfony3


Проблемы при настройке symfony 2.7 и 3.0 (проблема одна и та же)


  Major problems have been detected and must be fixed before continuing:
  Change the permissions of either "app/cache/" or "var/cache/"
  directory so that the web server can write into it. Change the
  permissions of either "app/logs/" or "var/logs/" directory so that the
  web server can write into it.


Стандартные решения, естественно, попробовал из документации Symfony, глава Checking
Symfony Application Configuration and Setup.

Setting up Permissions:

Yuri@localhost /v/w/symfony.loc> sudo rm -rf var/cache/*
Yuri@localhost /v/w/symfony.loc> sudo rm -rf var/logs/*
Yuri@localhost /v/w/symfony.loc> sudo setfacl -R -m u:apache:rwX -m u:Yuri:rwX var/cache
var/logs
Yuri@localhost /v/w/symfony.loc> sudo setfacl -dR -m u:apache:rwX -m u:Yuri:rwX var/cache
var/logs
Yuri@localhost /v/w/symfony.loc> sudo service httpd restart
Redirecting to /bin/systemctl restart  httpd.service


Группа у web-server точно apache. Пруф

Yuri@localhost /v/w/symfony.loc> 
ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v
root | head -1 | cut -d\  -f1
apache
Yuri@localhost /v/w/symfony.loc>


Так же использовал крайние решение из главы Setting up Permissions:
подставил в начало файлов: (bin/console, web/app.php и web/app_dev.php) -> umask(0000)
в начало;

Yuri@localhost /v/w/symfony.loc> sudo service httpd restart
Redirecting to /bin/systemctl restart  httpd.service
Yuri@localhost /v/w/symfony.loc> service httpd status
Redirecting to /bin/systemctl status  httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset:
disabled)
   Active: active (running) since Чт 2015-12-24 23:17:13 MSK; 11min ago
 Main PID: 9196 (httpd)
   Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.0121; Bytes
served/sec:  51 B/sec"
   CGroup: /system.slice/httpd.service
           ├─9196 /usr/sbin/httpd -DFOREGROUND
           ├─9197 /usr/sbin/httpd -DFOREGROUND
           ├─9198 /usr/sbin/httpd -DFOREGROUND
           ├─9199 /usr/sbin/httpd -DFOREGROUND
           ├─9201 /usr/sbin/httpd -DFOREGROUND
           ├─9205 /usr/sbin/httpd -DFOREGROUND
           ├─9207 /usr/sbin/httpd -DFOREGROUND
           └─9354 /usr/sbin/httpd -DFOREGROUND

дек 24 23:17:13 localhost.localdomain systemd[1]: Starting The Apache HTTP...
дек 24 23:17:13 localhost.localdomain httpd[9196]: AH00548: NameVirtualHos...
дек 24 23:17:13 localhost.localdomain systemd[1]: Started The Apache HTTP ...
Hint: Some lines were ellipsized, use -l to show in full.
Yuri@localhost /v/w/symfony.loc> 


Nginx и php-fpm точно не включен 

Yuri@localhost /v/w/symfony.loc> sudo service php-fpm status
[sudo] пароль для Yuri: 
Redirecting to /bin/systemctl status  php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset:
disabled)
   Active: inactive (dead)
Yuri@localhost /v/w/symfony.loc> sudo service nginx status
Redirecting to /bin/systemctl status  nginx.service
● nginx.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
Yuri@localhost /v/w/symfony.loc>


На просторах Ru&En-нета не нашел больше решений:(
Повторюсь, проблема на symfony 2.7 и 3.0 идентична. Пробовал на fedora 22 php5.6.15
и php7. Пробовал уже различные комбинации владельцев apache:Yuri, в том числе и на
создание новых файлов тоже выставлять - ничего не помогло.:(
Есть еще возможные варианты?
    


Ответы

Ответ 1



Если кому интересно, то проблема была в SELinux. vi /etc/selinux/config или nano /etc/selinux/config И перезагрузить комп sudo reboot

Ответ 2



я не парился и добавил алиас на composer который выполняется от www-data sudo www-data -c 'composer app/console' вроде такого.

Регулярный запуск параметризованой сборки с заданными параметрами

#jenkins #непрерывная_интеграция


Jenkins, параметризованная сборка (Parameterized Build), имеющая несколько строковых
параметров.

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

Пока что лучшее, что придумал — создать новую регулярную сборку, которая при запуске
будет просто запускать эту через Parametrized Trigger. Но это выглядит как-то слишком
сложно. 

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


Ответы

Ответ 1



Походу только через это: https://wiki.jenkins.io/display/JENKINS/Parameterized+Scheduler+Plugin но судя по комментам там пока водятся баги.

Java сравнить и изменить время и дату в файле

#java


Есть java class, в котором в map записаны элементы их время и дата. Приблизительно
вот так:

new Map ()
.put("time1","2015-01-25T03:01:00") 


Нужен метод который будет находить старую дату (before(now)), и менять на новую (буквально
на 2,3 дня вперед)

Буду рад любым советам.

Сначала пробовал просто загрузить файл и изменить данные: (в коде очень много лишнего,
но работает)

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Scanner;
    import java.util.ArrayList;
    import java.util.List;
    import java.io.BufferedWriter;

public class FileReplace {
    List lines = new ArrayList();
    String line = null;

    public void  doIt() {
        try {
            File f1 = new File("TFile.java");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                if (line.contains("2015-01-25T03:01:00"))
                    line = line.replace("2015-01-25T03:01:00", "2016-01-06T08:01:00 ");
                lines.add(line);
            }
            fr.close();
            br.close();

            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            for(String s : lines)
                 out.write(s);
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
    }


Потом думаю как то сравнить даты, как то так: (только наброски )

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
               Date date1 = sdf;
             //  Date date2 = ;   data from the file

               if (date1.after(date2)) {

          date2 = data2.replace() // some random future data 

               }


Не могу все до кучи свести, и еще нужно достать время и дату с файла, но как писал
в начале, она вот так записана. 

new Map ()
.put("time1","2015-01-25T03:01:00") 

    


Ответы

Ответ 1



нужно достать время и дату с файла import java.nio.file.*; import java.util.*; import java.io.*; public class Definition_Of_The_File_Creation_Date { public static void main(String[] args) { /* * Вместо / подстовляем путь к файлу или коталогу, используя статистический * метод parsingFolder получаем "карту" заполненую ключём - имя файла (Строка) и * значением даты последнего изменения файла (строка) */ Map colection = parsingFolder("/"); // получаем все ключи нашей колекции Set nameFile = colection.keySet(); // выводим имя файла и его дату for(String name : nameFile){ System.out.println("Имя: " + name + " DATA: " + colection.get(name)); } /* * Можно поменять все ключи методом colection.replace("ключ", "Новое значение"), * Также строку можно разбить java.util.StringTokenizer token = new StringTokenizer(data, "-T:Z") * и соответственно записать её через colection.replace("ключ", "Новое значение"), */ for(String name : nameFile){ colection.replace(name, "2016-01-06T08:01:00"); System.out.println("Имя: " + name + " DATA: " + colection.get(name)); } } public static TreeMap parsingFolder(String nameFolder) { // Создаём колекцию, для реализации сохранения данных TreeMap temp = new TreeMap() {}; // устанавливаем путь к файлу, каталогу Path pathFile = Paths.get(nameFolder); // определяем является ли путь (nameFolder) каталогом или файлом if(Files.isDirectory(pathFile, LinkOption.NOFOLLOW_LINKS)) { /*  * перебираем каждый файл в каталоге (nameFolder) и записываем * полученные данные в колекцию */ try( DirectoryStream buffer = Files.newDirectoryStream(pathFile) ){ Iterator iterratorDirectory = buffer.iterator(); while(iterratorDirectory.hasNext()) { Path fileDirectory = iterratorDirectory.next(); /* * записали имя файла и дату последней модификации файла в колекцию. * Files.getLastModifiedTime - является атрибутом файла, соотвественно вместо можно * записать и иные данные о файле. Посмотрите методы класса Files типа метод getFileAttrebuteView() * readAttributes(), getAttribute() в API java.. там есть все... */ temp.put( fileDirectory.getFileName().toString(), Files.getLastModifiedTime(fileDirectory, LinkOption.NOFOLLOW_LINKS).toString() ); } }catch(SecurityException | IOException exSecuritu){ System.out.println("ERROR " + exSecuritu); } } else { /* * Данное условие выполняется если указанный при проверки путь являеется файлом */ try{ // записали имя файла и дату модификации файла в колекцию temp.put( pathFile.getFileName().toString(), Files.getLastModifiedTime(pathFile, LinkOption.NOFOLLOW_LINKS).toString() ); }catch(IOException ioE) { System.out.println("ERROR " + ioE); } } return temp; } } Далее я просто не пойму, что Вы хотите? зачем менять дату в *.java файле при создании Map.? Если нужно поменять дату у самого файла это один вопрос, дату в коллекции Map это другой вопрос, если необходимо сохранить коллекцию как файл с данными — то это сериализация и соответственно другой вопрос....... Напишите более подробно пожалуйста, что Вы хотите. Ну либо я уже ответил на Ваш вопрос :)

Тестирование приложения

#android


Есть смартфоны А, B, C, D.
На смартфонах A B C приложение было протестировано успешно, а вот на смартфоне D
приложение вылетает. Возможности протестировать на смартфоне D нет. Как узнать где
вылетает программа? Или какие существую средства для тестирования андроид приложений?
    


Ответы

Ответ 1



Сделайте билд без обфускации, залейте на Google Play как open/closed beta, пошлите пользователю линк, пусть поставит и запостит вам крэш-репорт. Из него и узнаете где вылетает. https://support.google.com/googleplay/android-developer/answer/3131213?hl=en

Туториал для распростронения SQL CLR приложений

#visual_studio #sql_server #развертывание #sqlclr


Создал некоторые SQL CLR Функции и процедуры в Visual Studio 2013.

Теперь нужно подготовить скрипт sql для распростронения функционала.
При этом скрипт должен обновлять assemblies в базе или добавлять их, если они в базе
данных не присутствуют. То же самое с CLR функциями и процедурами.

Хотелось бы, что бы студия генерировала скрипт сама, но она это делает лишь частично,
а имено геренирует скрипт на основе текущей базы данных. Т.е., если функция уже присутсвует
в базе данных, создание функции не просходит. 

Как привильно настроить студию на необходимый вывод?
    


Ответы

Ответ 1



Простое решение - при генерации скрипта указывать студии в качестве цели пустую базу данных. Это приведет к генерации скрипта для создания базы с нуля. Править имя базы в свойствах проекта каждый раз неудобно, так что проще генерировать скрипт деплоя через MSBuild - из консоли или из билд-скрипта. Пример proj-файла: Создание чистой базы: Деплой с генерацией скрипта: Configuration=Debug;Platform=AnyCPU;TargetConnectionString=$(TargetConnectionString);TargetDatabaseName=$(TargetDatabase);UpdateDatabase=False;

Публикация приложения в Google Play для отдельных платформ

#android #google_play


Можно ли в Google Play опубликовать 4 одинаковых приложения по одной для каждой платформы
(armeabi, armeabi-v7a, mips, x86) ? 

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


Ответы

Ответ 1



Судя по документации надо просто создать отдельный апк с либами под каждую отдельную платформу: Приложение, которое содержит специфичные библиотеки, предназначенные для какой-то определенной процессорной архитектуры (например, ARM EABI v7 или x86) видны только на устройствах, поддерживающих эту архитектуру. И ещё хотелось бы обратить внимание на то что у каждого из этих APK должно быть разное versionCode: Each APK for the same application must have a unique version code, specified by the android:versionCode attribute. You must be careful about assigning version codes when publishing multiple APKs, because they must each be different, but in some cases, must or should be defined in a specific order, based on the configurations that each APK supports. Думаю удобнее всего реализовать отдельные наборы библиотек и версий будет с помощью механизма Flavors, как то так: android { ... def commonVersionCode = 10 productFlavors { armeabi { versionCode commonVersionCode } x86 { versionCode commonVersionCode + 1 } } } То есть основной номер версии держать кратным 10, а версии для конкретных платформ делать добавляя к основной 0, 1, 2 и т.д. Ну и библиотеки соответственно раскидать по папкам соответствующим flavor'ам.

Проверить наличие команды setserial

#linux #bash


Нужно проверить, что на компе работает команда setserial. 

Делаю так

setser=$(setserial -g /dev/ttyS[0-9] | grep -v unknown)
if $setser = '-sh: setserial: not found'
    then
        echo NOT AVAILABLE
    else
        echo OK
    fi


Выводит:

$ ./setser.sh
./setser.sh: line 1: setserial: not found
./setser.sh: line 11: =: not found
OK


Что не так?

В итоге пока нашел такой вариант

FILE=/usr/local/bin/setserial
if [ -f $FILE ]; then
   echo "Command Exists"
else
   echo "Command Does Not Exist"
fi

    


Ответы

Ответ 1



проверить доступность той или иной программы можно разными способами. например, можно воспользоваться описанной в стандарте posix встроенной командой оболочки command. например, так: if command -v setserial >/dev/null 2>&1 then echo "существует" else echo "не существует" fi

Ответ 2



./setser.sh: line 1: setserial: not found Прежде, чем пытаться выполнить утилиту setserial, можно проверить ее наличие в системе, это можно сделать разными способами. Например: setserial && echo "OK" Или так: command -v setserial && echo "OK" Или, если вы знаете путь, где находится утилита, можно сделать так: if test -f path/to/setserial; echo "OK"; fi if $setser = '-sh: setserial: not found' Для проверки условия, используйте утилиту test ([), например: if (test "$setser" = "some output"); then echo "OK"; fi .sh: line 1: setserial: not found Ну и, судя по номеру строки (line 1), вы забыли использовать shebang , например: #!/bin/sh

Ответ 3



В итоге так выкрутился FILE=/usr/local/bin/setserial if [ -f $FILE ]; then echo "Command Exists" else echo "Command Does Not Exist" fi

Не получается вызвать функции, которые лежат внутри функции

#javascript #jquery #framework


Решил для себя понять простой принцип работы jQuery и столкнулся с проблемой. При
попытке организации упрощенной версии библиотеки у меня не получается вызвать функции,
которые лежат внутри функции. Пример кода:

var jQ = function(el) {
   this.el = document.getElementById(el);
}

jQ.prototype.html = function(text){
  this.el.innerHTML = text;
  return this;
}

jQ.prototype.css = function(key, value){
  this.el.style[key] = value;
  return this;
}

// Использование 
jQ('bar').html('test');

    


Ответы

Ответ 1



function extend(Child, Parent) { var F = function() { } F.prototype = Parent.prototype Child.prototype = new F() Child.prototype.constructor = Child Child.superclass = Parent.prototype } // создали базовый класс var parent = function() {}; // создали класс // и сделали его потомком базового var jQ = function(el) { this.el = document.getElementById(el); } extend(jQ, parent); // добавили в класс parent методы и свойства parent.prototype.html = function(text){ this.el.innerHTML = text; return this; }; parent.prototype.css = function(key, value){ this.el.style[key] = value; return this; }; // Использование var element = new jQ('bar'); element.html('test'); Более подробно про наследование вы можете почитать: https://learn.javascript.ru/class-inheritance http://javascript.ru/tutorial/object/inheritance

Android ActionBar custom text font

#java #android #шрифты #actionbar #span


Большинство людей в интернете советуют для этого следующую конструкцию: 

SpannableString s = new SpannableString("My Title");
    s.setSpan(new TypefaceSpan(this, "My_Font.ttf"), 0, s.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    getSupportActionBar().setTitle(s);


Но у меня горит красным (this, "My_Font.ttf"). Нашёл на англицком StackOverFlow брата
по несчастью, ему посоветовали:


  please get the activity/application context and pass it to
  constructor rather than this as this will give currently running class
  while you need the current context.


Я пытался. Сначала писал MyActivity.getApplicationContext(); вместо this. Он сказал 


  non static method cannot be referenced from static context. 


Потом перед конструкцией писал Context context; context = getApplicationContext();
и в скобках Context context вместо this. В этом случае он подчёркивал уже пробел между
Context и context. Я чувствую, что хожу вокруг да около, но всё никак не попадаю. Что
делать? 

UPDATE#1

Нашёл полный код применения конструкции. Красным больше ничто не подчёркивается,
но Activity вылетает. 

class TypefaceSpan extends MetricAffectingSpan {
        /** An LruCache for previously loaded typefaces. */
        private  LruCache sTypefaceCache = new LruCache(5);

        private Typeface mTypeface;

        /**
         * Load the {@link Typeface} and apply to a spannable.
         */
        public TypefaceSpan(Context context, String typefaceName) {
            mTypeface = sTypefaceCache.get(typefaceName);

            if (mTypeface == null) {
                mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                        .getAssets(), String.format("fonts/%s", typefaceName));

                // Cache the loaded Typeface
                sTypefaceCache.put(typefaceName, mTypeface);
            }
        }

        @Override
        public void updateMeasureState(TextPaint p) {
            p.setTypeface(mTypeface);
        }

        @Override
        public void updateDrawState(TextPaint tp) {
            tp.setTypeface(mTypeface);
        }}
    Context context;
    context = getApplicationContext();
    SpannableString s = new SpannableString("My Title");
    s.setSpan(new TypefaceSpan(context, "FDMedian.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(s);


UPDATE#2

логи с ошибками: 

01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
FATAL EXCEPTION: main
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.morpheus.sketc_000.morpheuscompanygames/com.morpheus.sketc_000.morpheuscompanygames.Activity2}:
java.lang.RuntimeException: native typeface cannot be made
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.os.Looper.loop(Looper.java:137)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.main(ActivityThread.java:5103)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at java.lang.reflect.Method.invokeNative(Native Method)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at java.lang.reflect.Method.invoke(Method.java:525)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at dalvik.system.NativeStart.main(Native Method)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
 Caused by: java.lang.RuntimeException: native typeface cannot be made
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.graphics.Typeface.(Typeface.java:175)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.graphics.Typeface.createFromAsset(Typeface.java:149)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.morpheus.sketc_000.morpheuscompanygames.Activity2$1TypefaceSpan.(Activity2.java:35)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.morpheus.sketc_000.morpheuscompanygames.Activity2.onCreate(Activity2.java:54)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.Activity.performCreate(Activity.java:5133)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.access$600(ActivityThread.java:141) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.os.Handler.dispatchMessage(Handler.java:99) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.os.Looper.loop(Looper.java:137) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at android.app.ActivityThread.main(ActivityThread.java:5103) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at java.lang.reflect.Method.invoke(Method.java:525) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime:
    at dalvik.system.NativeStart.main(Native Method) 

    


Ответы

Ответ 1



Есть несколько причин, которые могут вызвать java.lang.RuntimeException: native typeface cannot be made: используете неправильное расширение разместили шрифты в папке с ресурсами (корень assets), а не внутри assets/fonts/ не добавили файл с шрифтами имя файла с шрифтом должен быть написан строчными буквами(например, надо переименовать MyFont.ttf в myfont.ttf)

Сколько максимально можно сохранить в Bundle при сворачивании?

#java #android


Сохраняю данные в кэше

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable(SHEDULE, shedule);
    outState.putSerializable(RING, ringShedule);
    //outState.putString(DOC, doc_);
}


doc_ хранит в себе достаточно длинную строку, в которой содержится html страница.
Если ее не сохранять, то весь кэш загрузится и активити восстановится. Если же сохранять,
то активити не восстановится, а загрузится главная активити. Я так понимаю приложение
сохраняет, но эту длинную строку восстановить не может? 
    


Ответы

Ответ 1



Из-за того что данные Bundle'а летают по IPC, лимит на них 1MB. Если верить англоязычному ответу

Как отключить автоматическое сохранение снимка с камеры в галерею

#java #android


Из активити вызываю приложение Камера, указав место, где сохранить снимок. Получаю
снимок, обрабатываю, использую и удаляю из того места, куда сохранил. Но он остается
в Gallery в папке Camera.

Как его удалить или сделать так, чтобы он там не появлялся вообще? Перебрал методы
настройки камеры - не нашел такого метода. В опциях Intent-a камеры тоже не нашел.
    


Ответы

Ответ 1



Вобщем реализовал так. Перед запуском интента камеры, запоминаю текущее время в милисекундах в глобальной переменной CurrTime = System.currentTimeMillis(); Затем в onActivityResult перебираю все файлы в галерее и удаляю те, у которых lastModified() >= CurrTime. Потом обновляю галерею. Cursor cursor; int columnIndex; String[] projection = {MediaStore.Images.Media.DATA}; cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, // Which columns to return null, // Return all rows null, null); columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToPosition(0); do { String imagePath = cursor.getString(columnIndex); File F = new File(imagePath); if(F.lastModified() >= CurrTime){ F.delete(); } } while (cursor.moveToNext()); MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStorageDirectory().toString()}, null, null);

Как убрать action bar и тень под ним, но оставить троеточие

#java #android #activity #android_toolbar


Подскажите, как можно убрать текст в Action bar, но оставить при этом кнопку настроек.
Пытался изменить цвет текста в Action bar, но меняется и цвет текста в меню настроек.
А также подскажите, как убрать тень под action bar. Может быть, вопросы легкие, но
ответа я на них не нашел
    


Ответы

Ответ 1



Просто задайте пустой заголовок: getSupportActionBar().setTitle(""); И вот так уберите тень: getSupportActionBar().setElevation(0);

Ответ 2



Можно выбрать Activity тему, содержащую текст NoActionBar либо в коде прописать: getActionBar().hide() В качестве меню можно использовать PopupMenu: public void showPopup(View v) { PopupMenu popup = new PopupMenu(this, v); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }

Вложенные транзакции и многопоточность

#android #многопоточность #sqlite


Есть синхронизация с сервером. Запускаются пару потоков, которые запрашивают данные
и записывают каждый в свою таблицу с помощью транзакций. Возможно ли обеспечить атамарность
всей синхронизации с помощью внутренних транзакций или другим способом?

Простой пример:

    new AsyncTask(){

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            db.beginTransactionNonExclusive();
        }

        @Override
        protected Void doInBackground(Void... params) {
            db.beginTransactionNonExclusive();
            try {
                ...
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            db.setTransactionSuccessful();
            db.endTransaction();
        }
    }.execute();


Бд лочится и на втором db.beginTransactionNonExclusive()(если нет транзакции, то
на вставке данных) поток останавливается. Коннект к базе один. yieldIfContendedSafely()
вроде должен помочь, но он возвращает false.
    


Ответы

Ответ 1



Если я правильно понял, то Вас интересует штука под названием "Критические секции". Также, как и Вы, первый раз столкнулся с этим при использовании нескольких потоков, которые оперировали одним и тем же кодом в работе с базой данных. в JAVA предусмотрено решение в виде synchronized метода. Если это то, что Вам нужно, то, думаю нагуглить труда не составит)

Activity поверх keyguard и разблокировка экрана

#java #android


Есть фоновый сервис, который бродкастом "слушает" сервер. Когда с сервера приходит
звонок, срабатывает метод:

CallActivity1.start(this,
                        qbrtcSession.getConferenceType(),
                        qbrtcSession.getOpponents(),
                        qbrtcSession.getUserInfo(),
                        Consts.CALL_DIRECTION_TYPE.INCOMING);


Где CallActivity1 — одна из активностей приложения, но не главная.
Принимает она:

public static void start(Context context, QBRTCTypes.QBConferenceType qbConferenceType,
                             List opponentsIds, Map userInfo,
                             Consts.CALL_DIRECTION_TYPE callDirectionType){
        Intent intent = new Intent(context, CallActivity1.class);
        intent.putExtra(Consts.CALL_DIRECTION_TYPE_EXTRAS, callDirectionType);
        intent.putExtra(Consts.CALL_TYPE_EXTRAS, qbConferenceType);
        intent.putExtra(Consts.USER_INFO_EXTRAS, (Serializable) userInfo);
        intent.putExtra(Consts.OPPONENTS_LIST_EXTRAS, (Serializable) opponentsIds);
        if (callDirectionType == Consts.CALL_DIRECTION_TYPE.INCOMING) {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        }
        context.startActivity(intent);
    }


И в onCreate прописано :

KeyguardManager.KeyguardLock lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
    PowerManager powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
    PowerManager.WakeLock wake = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

    lock.disableKeyguard();
    wake.acquire();

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);


По моей логике при звонке окно активности должно открываться всегда, оно почти так
и работает, но попеременно. При разблокированном экране активность ВСЕГДА запускается,
при screen_off иногда, а если на screen_off еще и стоит keyguard, то вообще никогда
не срабатывает, или может появиться и через мнгновенье закрыться.

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


Ответы

Ответ 1



Вам нужно использовать системный тип активити чтобы оно отображалось поверх всего. Для этого нужно добавить в манифест следующие разрешение: и установить для Activity тип TYPE_SYSTEM_OVERLAY. MyActivity.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); Тогда Activity будет поверх вообще всего, включая экран блокировки. Также вам не нужно будет разблокировать телефон программно ( lock.disableKeyguard(); - не нужен )

Удаление списка файлов

#c_sharp #ftp


Как разумно удалить большой список файлов на FTP?

Можно удалять через FtpWebRequest, но, как я понимаю, удаление большого списка будет
весьма длительным, т.к. для каждого файла необходимо составлять новый запрос и заново
коннектиться. Или же это не так?
    


Ответы

Ответ 1



Заново коннектиться не обязательно using (var connection = new FTPConnection()) //Тут создаем новое соединение { foreach (string file in files) //Тут удаляем файл } //Тут ваше соединение закрывается автоматически вызовом IDisposable

Какой протокол передачи данных, использует stackoverflow.com

#http #https #протоколы #stackoverflow_api


Какой протокол передачи данных, использует stackoverflow.com?
Интересует протокол прикладного уровня. 

Интересно, когда находишься на странице, то её не обязательно обновлять для того
что бы увидеть новые ответ или комментарий. Получается или веб-приложение stackoverflow.com
запрашивает через каждые n секунд, работая через HTTP, или использует протокол двусторонней
связи. 
    


Ответы

Ответ 1



Из первых рук (перевод) Мы используем Websockets для осуществления принудительных обновлений в режиме реального времени, таких как показ уведомлений в верхнем горизонтальном меню, подсчет голосов, формирование статистики новой навигации, показ новых ответов и комментариев, и еще для нескольких задач.

Программа для видеозахвата

#c_sharp #камера #протоколы


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


Была задумка по определенной выборке находить необходимые события по
кассе,
далее по событию находить нужный фрагмент видео в архиве, т.е.
ориентироваться по времени чека(события)
и вставать на фрагмент этого места в видео файле
так же необходима возможность онлайн контроля процесса продажи.


Вопрос с чего начать, немного поискав понял что даже IP камеры несколько
протоколов,
а в наличии есть еще и аналоговые камеры...
Возможно есть смысл онлайн контроль осуществлять с помощью какой то
"бесплатной" готовой программы
настроить чтобы программа могла писать в какой нибудь определенный
распространенный формат AVI например.

А приложение уже писать самому и разбирать видео файлы, которые будут
создаваться бесплатной программой.

желательно писать на C#, есть опыт.

с помощью какой библиотеки можно подружить камеры протокола rtsp с приложением C#(показывать
видео онлайн, и писать его в архив)?
    


Ответы

Ответ 1



с помощью какой библиотеки можно подружить камеры протокола rtsp с приложением C#(показывать видео онлайн, и писать его в архив)? Посмотрите net7mma.codeplex.com Проект активно развивается, и в сети довольно много упоминаний, включая EnSO, возможно эта библиотека перекроет ваши задачи.