Страницы

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

вторник, 18 февраля 2020 г.

Каким образом реализовать, чтобы при отключении наушников выключался плеер?

#java #android #android_studio #app #headset


Здравствуйте. 

Как сделать так, что бы при отключении наушников выключалось радио(плеер), то есть
ставилась пауза?

Где и что прописывается? 

Возможно нужно мне показать содержание какого либо файла (.class или .xml) вам, чтобы
узнать, как это реализовать? 

Я просто не совсем понял, каким образом это происходить должно.
    


Ответы

Ответ 1



Для этого есть специальное событие, о котором уведомляет система. "Поймать" его можно с помощью так называемых Broadcast Reciever'ов. Вот код, который показывает, как узнать о подключении/отключении наушников: public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private MusicIntentReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new MusicIntentReceiver(); } @Override public void onResume(){ IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); registerReceiver(myReceiver, filter); super.onResume(); } private class MusicIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { int state = intent.getIntExtra("state", -1); switch (state) { case 0: Log.d(TAG, "Наушники отключены"); break; case 1: Log.d(TAG, "Наушники подключены"); break; default: Log.d(TAG, "Неизвестное состояние"); } } } } @Override public void onPause() { unregisterReceiver(myReceiver); super.onPause(); } } Источник: Официальная документация

Js, численное преобразование в объектах

#javascript


Здравствуйте. Изучаю Js и остановился на одном моменте не могу понять об численном
преобразовании объектов. В главе пишет, что численное преобразование делается через
метод valueOf, а если его нет — то toString. Тогда почему в примере ниже числа складываются
как строки в a + b?

var a = {
  valueOf: function() {
    return "1";
  }
};
var b = {
  valueOf: function() {
    return "2";
  }
};

alert(a + b); // "12"
alert(a - b); // "1" - "2" = -1

    


Ответы

Ответ 1



почему в примере ниже числа складываются как строки Потому, что методы valueOf в обоих случаях возвращают строки, а если хотя бы один из операндов оператора + строка, то и второй операнд так же будет приведен к строке. Заменив возвращаемое значение на число, результат станет ожидаемым. var a = { valueOf: function() { return 1; } }; var b = { valueOf: function() { return 2; } }; console.log(a + b); Если копнуть чуть глубже, можно найти в спецификации алгоритм для оператора + В котором можно отметить шаги 5,6,7, в которых объекты приводятся к примитивам, и если хотя бы один из объектов был приведен к строке, то дальше происходит сложение строк. lprim <= ToPrimitive(lval). rprim <= ToPrimitive(rval). Если Type(lprim) или Type(rprim) - это строка, то lstr <= ToString(lprim). rstr <= ToString(rprim). Вернуть строку, которая является результатом конкатенации строк lstr и rstr. Подробнее про ToPrimitive можно посмотреть в ответе на вопрос В чем разница между valueOf и toString

Как узнать версию BIOS?

#cpp #bios


Как узнать и вывести на экран версию BIOS текущего компьютера?
    


Ответы

Ответ 1



Как информация о BIOS представлена определяется SMBIOS стандартом. На Windows можно выполнить wmic bios get smbiosbiosversion команду. На *nix есть dmidecode утилита, которая умеет читать эту информацию. К примеру, чтобы напечатать версию BIOS: root# dmidecode -s bios-version 4.04 Стандарт говорит, что начать читать можно из памяти с "_SM*_" в диапазоне F0000..FFFFF. На Linux, это доступно как /dev/mem или из файлов: /sys/firmware/dmi/tables/smbios_entry_point /sys/firmware/dmi/tables/DMI Чтение версии BIOS сводится к загрузке DMI (SMBIOS) таблицы из DMI файла cо смещением, вычисляемым зависимым от используемой версии SMBIOS cтандарта, хранящейся в smbios_entry_point файле. Из таблицы достаётся список структур, в которых уже конкретная информация хранится. К примеру, индекс строки с версией BIOS это 0x05 байт в записи с BIOS информацией (type 0). Можно посмотреть как dmidecode это реализует на C.

Ответ 2



Информация нужная тебе лежит в реестре в [HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS]. Вот код: #include "stdafx.h" #include #include int main(int argc, char* argv[]) { HKEY rKey; TCHAR Reget[256]; DWORD RegetPath = sizeof(Reget); RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_QUERY_VALUE, &rKey); RegQueryValueEx(rKey, L"BIOSVersion",NULL,NULL, (LPBYTE)&Reget,&RegetPath); printf("%ls", Reget); getchar(); return 0; }

Как упростить проверку на null на C#?

#c_sharp


Есть ли возможность упростить такое выражение:

if (locker != null)
{
    locker.ReadLock();
}


В такое или подобное, используя новый сахар в языке C#?

locker??locker.ReadLock();

    


Ответы

Ответ 1



Добавился специальный Null-conditional оператор locker?.ReadLock();

System.Reflection.TargetInvocationException: “Адресат вызова создал исключение.”

#c_sharp #wpf


На событии TextChanged возникает ошибка


  System.Reflection.TargetInvocationException: “Адресат вызова создал
  исключение.” Внутреннее исключение NullReferenceException: Ссылка на
  объект не указывает на экземпляр объекта.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
/// 
/// Логика взаимодействия для MainWindow.xaml
/// 
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox2.Text = TextBox1.Text;
    }
}
}



Разметка

Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">

    
            
            
        
        
        





    


Ответы

Ответ 1



Перепишите код вот так! private void TextBox1_TextChanged(object sender, TextChangedEventArgs e) { if (TextBox2 != null) { TextBox2.Text = TextBox1.Text; } } При первом визове этого события у вас еще не создана екземпляр MainWindow,следовательно и еще не работала функция InitializeComponent() и вы пытетесь получить еще не созданную TextBox2.

Ответ 2



Проблема в том, что, как правильно замечает @Vardan Vardanyan, интерпретация XAML, а значит, назначение обработчиков событий и привязка имён происходит во время выполнения InitializeComponent. При этом порядок этих операций не определён. В вашем случае порядок был следующим: установился обработчик TextChanged установилось значение Text в "TextBox", при этом вызвался обработчик далее переменной TextBox2 должно было быть присвоено значение, соответствующее текстбоксу, но это не успело произойти, т. к. на предыдущем шаге случилось исключение. (Заметьте, что стандарта на порядок выполнения этих операций нет, любой порядок возможен.) Вы можете игнорировать событие во время InitializeComponent, проверяя TextBox2 на равенство null. Но более чистым решением мне кажется подписка на событие после отработки InitializeComponent. Для этого нужно убрать TextChanged="TextBox1_TextChanged" из XAML и добавить в конструктор: public MainWindow() { InitializeComponent(); TextBox1.TextChanged += TextBox1_TextChanged; TextBox1_TextChanged(null, null); // обновить значение прямо сейчас }

Как правильно запустить SurfaceView в Fragment?

#android #android_fragment


Совсем недавно начал осваивать фрагменты и графику и не до конца понимаю их логику.

У меня есть фрагмент, во фрагменте должен запускаться DrawView extends SurfaceView
implements SurfaceHolder.Callback. Сейчас это какие-то там фигуры.

import android.app.Activity;
import android.app.Fragment;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by promoscow on 14.05.17.
 * Main activity for timer frame.
 */

public class Timer extends Fragment {

    DrawView drawView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        DrawView drawView = new DrawView(getActivity());
//        getActivity().setContentView(drawView);
        Log.d("Timer.onCreate", String.valueOf(getActivity()));
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
        Log.d("Timer.onCreateView", String.valueOf(inflater));
        drawView = new DrawView(getActivity());
        return drawView;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("onActivityCreated", "okay");
    }

    private class DrawView extends SurfaceView implements SurfaceHolder.Callback {

        private DrawThread drawThread;

        public DrawView(Activity timer) {
            super(timer);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {

        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int
height) {
            Log.d("DrawView.surfaceChanged", "okay");
            drawThread = new DrawThread(getHolder());
            drawThread.setRunning(true);
            drawThread.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            drawThread.setRunning(false);
            while (retry) {
                try {
                    drawThread.join();
                    retry = false;
                    Log.d("DrawView.surfDestroyed", "okay");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private class DrawThread extends Thread {
        private boolean running = false;
        private SurfaceHolder surfaceHolder;
        Paint paint;
        Rect rect;
        RectF rectF;
        Path path;

        public DrawThread(SurfaceHolder holder) {
            this.surfaceHolder = holder;
            paint = new Paint();
            rect = new Rect();
            path = new Path();
        }

        public void setRunning(boolean running) {
            this.running = running;
            Log.d("DrawThread.setRunning", "okay");
        }

        @Override
        public void run() {
            Log.d("DrawThread.run", "okay");
            Canvas canvas;
            while (running) {
            canvas = null;
            try {
                canvas = surfaceHolder.lockCanvas(null);
                    if (canvas == null) continue;
                canvas.drawRGB(0, 100, 55);
                paint.setARGB(50, 56, 90, 124);
                paint.setStrokeWidth(10);
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawRect(rectF, paint);
                paint.setColor(Color.GREEN);
                canvas.drawArc(rectF, 10, 10, false, paint);
                Log.d("DrawThread.run", "onWork");
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
            }
        }
    }
}


Логи вот такие:

05-14 22:26:02.158 14610-14610/ru.xpendence.development.gimstopwatch D/Timer.onCreate:
ru.xpendence.development.gimstopwatch.StopWatchActivity@2928c3c3
05-14 22:26:02.158 14610-14610/ru.xpendence.development.gimstopwatch D/Timer.onCreateView:
com.android.internal.policy.impl.PhoneLayoutInflater@15998504
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/resX: 1440
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/resY: 2392
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/calcDP: 350.0
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/density: 3.5
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/heightPixels: 2392
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/widthPixels: 1440
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/dpHeight: 683.4286
05-14 22:26:02.160 14610-14610/ru.xpendence.development.gimstopwatch D/dpWidth: 411.42856
05-14 22:26:02.161 14610-14610/ru.xpendence.development.gimstopwatch D/onActivityCreated: okay


То есть, отрабатываются методы onCreate и onCreateView, потом отрабатываются методы
активити, в котором находится фрагмент (высчеты dp и проч), потом отрабатывает onActivityCreated
и всё...

Помогите, пожалуйста, желательно кодом.
    


Ответы

Ответ 1



Вообще если присмотреться, то Вы не проинициализировали переменную RectF rectF, но активно используете её в блоке try-finally. Я бы сделал ставку на то, что у Вас выпадает NullPointerException, но оно перехватывается этим блоком. А вообще пока не понятно зачем столько сложностей. Зачем использовать SurfaceView вместе со всеми вытекающими проблемами? Вот пример кода прямого наследника View, с тем же функционалом (были убраны неиспользуемые переменные) + регулировкой FPS: public class DrawView extends View { private static final long FPS = 25; private static final long TIME_DELAY = 1000 / FPS; private final Runnable mInvalidator = new Runnable() { @Override public final void run() { invalidate(); } }; private final Paint mPaint = new Paint(); { mPaint.setStrokeWidth(10); mPaint.setStyle(Paint.Style.STROKE); } private final RectF mRectF = new RectF(); public DrawView(Context context) { super(context); } public DrawView(Context context, AttributeSet attrs) { super(context, attrs); } public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public DrawView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected final void onDraw(final Canvas canvas) { super.onDraw(canvas); canvas.drawRGB(0, 100, 55); mPaint.setARGB(50, 56, 90, 124); canvas.drawRect(mRectF, mPaint); mPaint.setColor(Color.GREEN); canvas.drawArc(mRectF, 10, 10, false, mPaint); postDelayed(mInvalidator, TIME_DELAY); } } FPS в данном случае, это предпочитаемое FPS, совпадение с которым зависит от нагруженности UI. Если что-то более тяжелое планируется, то лучше использовать Bitmap, который будет подготавливаться в другом потоке, после чего выполнять отрисовку методомcanvas.drawBitmap(...).

Диспетчер задач Пользователи

#c_sharp


Как в c# получить список пользователей работающих сейчас на компьютере с их состоянием
(активен, отключен) 
    


Ответы

Ответ 1



Делаете запрос к WMI, и дальше проходите по нужным свойствам: ManagementObjectSearcher users = new ManagementObjectSearcher(@"SELECT * FROM Win32_Account"); foreach (var u in users.Get()) { string login = u.Properties["Caption"].Value.ToString(); string name = u.Properties["Name"].Value.ToString(); string status = u.Properties["Status"].Value.ToString(); ... }

Ответ 2



Можно выполнить запрос к WMI var usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount"); var users = usersSearcher.Get(); Ну и копать в эту сторону. (WMI)

Замена значения по словарю при SELECT

#php #mysql #sql


Пытался гуглить, но так и не смог ничего найти.

Вообщем есть таблица logs:

id (INTEGER(10)) | action (SET(login, logout, error))
-----------------------------------------------------
 1               | login
 2               | error
 3               | error
 4               | logout


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

login => 'Авторизация'
logout => 'Выход'
error => 'Ошибка'


т.е. результат должен быть таким:

id | action
------------
 1 | Авторизация
 2 | Ошибка
 3 | Ошибка
 4 | Выход


Как подобное можно реализовать средствами MySQL? 
    


Ответы

Ответ 1



Можно сделать через case: select id, case action when 'login' then 'Авторизация' when 'logout' then 'Выход' when 'error' then 'Ошибка' end from logs Или использовать join и таблицу значений прямо в запросе: select L.id, N.name from logs L join ( select 'login' as action, 'Авторизация' as name union all select 'logout','Выход' union all select 'error','Ошибка' ) N on L.action=N.action Но на будущее лучше завести в БД отдельную таблицу - справочник действий, с такой структурой как в выборке N в запросе выше. И выполнять в запросе join с этой таблицей. Это позволит избежать необходимости модификации кода при добавлении новых значений action.

Ответ 2



Два варианта: Если "словарь" большой, занести его в отдельную таблицу и результат получать как JOIN с этой таблицей Если "словарь" в 5-10 строк, можно использовать SELECT CASE... Пример тут

Как можно зашифровать html код?

#javascript #html #css


Как можно зашифровать html код, через JS скрипт, и есть какие то generator ?
    


Ответы

Ответ 1



можно значительно усложнить разбор HTML-а для другого разработчика можно использовать javascript для псевдо шифрования пример раз https://www.smartgb.com/free_encrypthtml.php пример два http://www.webtoolhub.com/tn561359-html-encrypter.aspx в результате вместо читабельного html-а получим ещё раз -- это всё псевдо шифрование. новичков оттолкнёт, профессионала вообще никак не остановит.

Ответ 2



Нет смысла. Браузеру нужен нормальный незашифрованный HTML, чтобы отобразить его пользователю. Поэтому в какой-то момент в браузере будет собран нормальный отображаемый HTML, вполне поддающийся сохранению банальным Ctrl+S или инспектором.

Проверка полей на заполненность и соответствие формату на лету и при клике на submit

#javascript #jquery #инспекция_кода


Здравствуйте!

Пишу проверку полей на заполненность и соответствие формату. Скажите, пожалуйста,
как выполнить эту же поверку на пустоту поля и при клике на submit? Сейчас у меня проверяет
только при потере фокуса change и при каждом набранном символе keyup, хотелось бы и
при клике на кнопку Войти. И заодно проверьте, все ли я правильно пишу, так как я только
изучаю jQuery.



var pattern = /^[a-z0-9_.-]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{2,6}$/i;
$(".full-width").on("change keyup", function(){                 
    if( !$.trim($(this).val()) ){     
        $(this).addClass('has-error').next('span').addClass('is-visible').text('Это
поле обязательно для заполнения');                             }else{
        $(this).removeClass("has-error").next('span').removeClass('is-visible').text('');
    }
    if( $.trim($('#signin-password').val()) != ''){    
        if( $('#signin-password').val().length <= 2 ){
            $('#signin-password').addClass('has-error').next('span').addClass('is-visible').text('Пожалуйста,
введите 2 или более символов.');
        }else{
            $('#signin-password').removeClass("has-error").next('span').removeClass('is-visible').text('');
        }
    }
    if($('#signin-email').val() != ''){    
        if($('#signin-email').val().search(pattern) == -1){
            $('#signin-email').addClass('has-error').next('span').addClass('is-visible').text('Поле
email не соответствует формату');
        }else{
            $('#signin-email').removeClass("has-error").next('span').removeClass('is-visible').text('');
        }
    }
});
input.has-error {
  border: 1px solid #d76666;
}


Ответы

Ответ 1



Напишите функции для валидации значений #signin-email и #signin-password // Валидация почты function validateEmail (email) { if (email.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } var pattern = /^[a-z0-9_.-]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{2,6}$/i; if (email.search(pattern) === -1) { return { error: 'Поле email не соответствует формату' }; } return { valid: true }; } // Валидация пароля function validatePassword (password) { if (password.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } if (password.length < 2) { return { error: 'Пожалуйста, введите 2 или более символов.' }; } return { valid: true }; } Далее функцию для работы с представлением // $input - jQuery объект поля ввода input // validate - функция валидации function validateInput ($input, validate) { var result = validate($input.val()); if (result.error) { $input.addClass('has-error') .next('span') .addClass('is-visible') .text(result.error); } else { $input.removeClass("has-error") .next('span') .removeClass('is-visible') .text(''); } return result.valid; } И наконец обработчики событий var $signinEmail = $('#signin-email').on('change keyup', function () { validateInput($signinEmail, validateEmail); }); var $signinPassword = $('#signin-password').on('change keyup', function () { validateInput($signinPassword, validatePassword); }); $('form').on('submit', function (e) { var valid = validateInput($signinEmail, validateEmail) & validateInput($signinPassword, validatePassword); if (!valid) { e.preventDefault(); // если одно из полей не валидно, не отправляем форму } }); // Валидация почты function validateEmail(email) { if (email.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } var pattern = /^[a-z0-9_.-]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{2,6}$/i; if (email.search(pattern) === -1) { return { error: 'Поле email не соответствует формату' }; } return { valid: true }; } // Валидация пароля function validatePassword(password) { if (password.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } if (password.length < 2) { return { error: 'Пожалуйста, введите 2 или более символов.' }; } return { valid: true }; } function validateInput($input, validate) { var result = validate($input.val()); if (result.error) { $input.addClass('has-error') .next('span') .addClass('is-visible') .text(result.error); } else { $input.removeClass("has-error") .next('span') .removeClass('is-visible') .text(''); } return result.valid; } var $signinEmail = $('#signin-email').on('change keyup', function() { validateInput($signinEmail, validateEmail); }); var $signinPassword = $('#signin-password').on('change keyup', function() { validateInput($signinPassword, validatePassword); }); $('form').on('submit', function(e) { var valid = validateInput($signinEmail, validateEmail) & validateInput($signinPassword, validatePassword); if (!valid) { e.preventDefault(); // если одно из полей не валидно, не отправляем форму } }); input.has-error { border: 1px solid #d76666; }



Ответ 2



Оборачиваем поля тегом
, обрабатываем её событие сабмита (обратите внимание, что для данного примера я добавил return false, чтобы форма в конечном счете не отправлялась) и внутри вызываем $(".full-width").trigger('change'). var pattern = /^[a-z0-9_.-]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{2,6}$/i; $(".full-width").on("change keyup", function() { console.log('field checked'); if (!$.trim($(this).val())) { $(this).addClass('has-error').next('span').addClass('is-visible').text('Это поле обязательно для заполнения'); } else { $(this).removeClass("has-error").next('span').removeClass('is-visible').text(''); } if ($.trim($('#signin-password').val()) != '') { if ($('#signin-password').val().length <= 2) { $('#signin-password').addClass('has-error').next('span').addClass('is-visible').text('Пожалуйста, введите 2 или более символов.'); } else { $('#signin-password').removeClass("has-error").next('span').removeClass('is-visible').text(''); } } if ($('#signin-email').val() != '') { if ($('#signin-email').val().search(pattern) == -1) { $('#signin-email').addClass('has-error').next('span').addClass('is-visible').text('Поле email не соответствует формату'); } else { $('#signin-email').removeClass("has-error").next('span').removeClass('is-visible').text(''); } } }); $("#test-form").submit(function() { console.log('submit event triggered'); $(".full-width").trigger('change'); return false; }); input.has-error { border: 1px solid #d76666; }



Ответ 3



// Валидация почты function validateEmail(email) { if (email.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } var pattern = /^[a-z0-9_.-]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{2,6}$/i; if (email.search(pattern) === -1) { return { error: 'Поле email не соответствует формату' }; } return { valid: true }; } // Валидация пароля function validatePassword(password) { if (password.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } if (password.length < 2) { return { error: 'Пожалуйста, введите 2 или более символов.' }; } return { valid: true }; } function validateRequed(requed) { if (requed.length === 0) { return { error: 'Это поле обязательно для заполнения' }; } return { valid: true }; } function validateInput($input, validate) { var result = validate($input.val()); if (result.error) { $input.addClass('has-error') .next('span') .addClass('is-visible') .text(result.error); } else { $input.removeClass("has-error") .next('span') .removeClass('is-visible') .text(''); } return result.valid; } var $signinEmail = $('#signin-email').on('change keyup', function() { validateInput($signinEmail, validateEmail); }); var $signinPassword = $('#signin-password').on('change keyup', function() { validateInput($signinPassword, validatePassword); }); var $signinRequed = $('.requed').on('change keyup', function() { validateInput($signinRequed, validateRequed); }); $('form').on('submit', function(e) { var valid = validateInput($signinEmail, validateEmail) & validateInput($signinPassword, validatePassword) & validateInput($signinRequed, validateRequed); if (!valid) { e.preventDefault(); // если одно из полей не валидно, не отправляем форму } }); input.has-error { border: 1px solid #d76666; }



Аналог CRON в android приложении

#android #cron


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

Через какой механизм это можно реализовать? Нужно что-то вроде CRON.
    


Ответы

Ответ 1



AlarmManager обеспечивает доступ к сервису планировки задач Android. Он регистрирует в системе интент и когда наступает обозначенное время запускает этот интент. Если момент вызова приложение закрыто, то оно будет вновь запущено.

Как закрыть все divы

#jquery


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




ABOUT
CONTACTS



Постоянный див который не нужно закрывать


Ответы

Ответ 1



ABOUT CONTACTS

Постоянный див который не нужно закрывать



Ответ 2



Добавьте тип yourType в нужные Вам div. Затем, в начале своей функции методом querySelectorAll() получите все div типа yourType и закройте их: ABOUT CONTACTS

Постоянный див, который не нужно закрывать



Возникает ошибка при попытке вызова значения как функции

#javascript #jquery


Здравствуйте!

Скажите, пожалуйста, как можно исправить вот такую ошибку: Uncaught TypeError: y
is not a function



function test($t, y) {
	y($.trim($($t).val()));
}
function validateTest(z){
	alert(z);
}
$('.requed').on('change', function() {
  test('#'+$(this).attr('id'), 'validate'+$(this).attr('data-var'));
});

Я так понимаю ошибка возникает при попытке вызова значения как функции. Мне же нужно именно так. Полей у меня множество и исходя из значения ('validate'+значение из data-var) пришедшего из поля, будет вызываться определенная функция.


Ответы

Ответ 1



В зависимости от контекста исполняемой функции. Если все находится в контексте window, то можно написать так: function test($t, y) { var func = window[y]; func($.trim($($t).val())); } function validateTest(z){ alert(z); } $('.requed').on('change', function() { test('#'+$(this).attr('id'), 'validate'+$(this).attr('data-var')); });

В ином случае нужно заменить window на имя объекта-предка, содержащего эту функцию

Ответ 2



function test($t, y) { y($.trim($t.val())); } var validators = { Test: function validateTest(z) { console.log(z); } } $('.requed').on('change', function() { test($(this), validators[$(this).attr('data-var')]); });



как закрасить кнопку select в нужный цвет

#css




Как закрасить кнопку select в нужный цвет. Белая стрелка на сером фоне. С border понятно
    


Ответы

Ответ 1



Быстрый ответ select { border: 2px solid #5B5B5B; background: transparent; width: 125px; padding: 5px 35px 5px 5px; font-size: 16px; height: 28px; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: no-repeat right url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAZCAMAAAAVHr4VAAAASFBMVEVbW1v+/v7Y2NiDg4P7+/vj4+PV1dV0dHRiYmJeXl729vby8vLr6+vPz8/CwsK8vLytra2pqamYmJiVlZWHh4d2dnZpaWloaGivQPliAAAAVklEQVQoz93PSQ6AIBBE0WIScJ69/03VdCQGGvfyt29ThQJT8pWKtRIh42O0OuCKpPGxDmnekOmN3UQ4gK2/rd55PJoLJ2SahWgdK3R2QTYr8ZHDbzsBMLkBiiUpVMwAAAAASUVORK5CYII=') } /* CAUTION: IE hackery ahead */ select::-ms-expand { display: none; /* remove default arrow on ie10 and ie11 */ } /* target Internet Explorer 9 to undo the custom arrow */ @media screen and (min-width:0\0) { select { background: none\9; padding: 5px\9; } } Здесь использовалось решение #1, описанное ниже Описание решений На stackoverflow.com пользователем Danield предложено 3 решения для стилизации select. Я позволил себе сделать вольный перевод данного ответа, сохранив все ссылки на статьи и примеры из оригинального ответа. Решение #1 - appearance: none Демо Суть решения заключается в том, чтобы спрятать стрелочку с помощью appearance: none и добавить произвольное изображение. select { -webkit-appearance: none; -moz-appearance: none; appearance: none; /* удаляем стандартную стрелочку */ background-image: url(...); /* добовляем произвольное изображение */ } appearance: none имеет хорошую поддержку браузерами, однако не поддерживается IE11- и Firefox 34- Мы можем добавить поддержку IE10 и IE11 добавив select::-ms-expand { display: none; /* скрывает стрелку в IE10 и IE11 */ } К сожалению, мы не сможем скрыть стрелку в IE9, мы лишь можем убрать нашу собственную и оставить стандартную /* target Internet Explorer 9 to undo the custom arrow */ @media screen and (min-width:0\0) { select { background-image:none\9; padding: 5px\9; } } Если нужна поддержка IE9- и Firefox 34-, тогда: Решение 2 - Обрезать элемент select, чтобы спрятать стрелочку Демо Суть решения заключается в том, чтобы обернуть select элементом div, который имеет фиксированную ширину и overflow:hidden. Элементу select установить ширину на примерно 20px больше чем ширина div. В результате стандартная стрелка будет не видна, будет обрезана элементом div, и мы можем использовать любое фоновое изображение в правой части div. Преимущество этого решения в широкой поддержке браузерами (IE8+, браузеры на WebKit и Gecko). Однако, есть и недостаток, выпадающий список с option выступает относительно правого края select на те самые 20px. Подробнее о способе можно прочитать тут Если стандартная стрелочка необхоима на Firefox 34-, но вам не нужна поддержка старых IE, тогда: Решение 3 - pointer-events Идея заключается в том, чтобы перекрыть стандартную стрелку select элементом с pointer-events:none. Демо Преимущество: хорошо выглядит и работает на WebKit и Gecko. Недостаток: вы не можите добавить :hover или cursor:pointer своей стрелочке, так как мы отключили события курсора. Еще один недостаток, Internet Explorer 10 и ниже не поддерживает pointer-events, это означает, что клик по элементу со своей стрелочкой не приведет к открытию списка. Можно использовать Modernizr или условные комментарии, чтобы вернуть стандартные стрелочки в IE. Учтите, что IE10 больше не поддерживает условные комментарии. Однако, есть еще один способ отключить pointer-events для IE10 с помощью CSS hack. Подробнее о способе можно прочитать тут

Операция приведения типов С++

#cpp #function_overloading


Есть два класса A и B как реализовать приведение типов друг в друга?

class A
{
...
    operator B()
    {
        return B(5);
    }
};

class B
{
...
    operator A()
    {
        return A(5);
    }
};


Пробовал писать объявление до определения, не помогает.
    


Ответы

Ответ 1



В C++ разрешение зависимостей определений классов устроено следующим образом: Если в некотором месте кода встречается имя класса, то к этому моменту этот класс уже должен быть определён. Есть два варианта определения класса: class A; class A { ... } Определять класс первым способом можно сколько угодно раз, вторым способом только один раз. Второй тип определения более сильный, так как второй тип определения фиксирует структуру класса. В определении второго типа можно опустить реализацию некоторых методов, и написать их позже (считается хорошей практикой писать определение класса в .h файле, а реализацию в соответствующем .cpp файле). Вот хорошая статья на эту тему. Таким образом, решение может выглядеть следующим образом: class A; class B; class A { public: operator B(); }; class B { public: operator A(); }; A::operator B() { return B(); } B::operator A() { return A(); } int main() { A a; B b = (B) a; A a2 = (A) b; return 0; }

Ответ 2



Один класс (выберите по своему вкусу :)) вынести в предварительное объявление, а его использование - после определения класса: class B; class A { public: operator B() const; }; class B { public: operator A() const { cout << "B::A()\n"; return A(); } }; inline A::operator B() const { cout << "A::B()\n"; return B(); } int main() { A a; B b; a = b; b = a; }

PHP+Mysql: не работают несколько запросов одновременно?

#php #mysql


Здравствуйте!

Подскажите, пожалуйста, почему в php не работает такой групповой запрос:

$query = "SELECT * FROM table WHERE id = '1';
          DELETE from table WHERE id = '1'";
$res = mysql_query($query);


В MySQL всё выполняется без проблем.

Так же, если в php выполнить по отдельности, то тоже всё выполняется:

$query = "SELECT * FROM table WHERE id = '1'";
$res = mysql_query($query);
$query = "DELETE from table WHERE id = '1'";
$res = mysql_query($query);


В чем может быть проблема?

Спасибо!
    


Ответы

Ответ 1



Из комментариев и документации: mysql_query() посылает один запрос (посылка нескольких запросов не поддерживается) активной базе данных сервера ... [1] Не используйте функции mysql_*, они устарели. Используйте вместо них MySQLi или PDO_MySQL

Ответ 2



Напишу, что для расширения mysql, если движок БД - InnoDB, то можно обернуть всё в одну транзакцию и работать с ней: class MySQLDB { private $connection; // The MySQL database connection /* Class constructor */ function MySQLDB(){ /* Make connection to database */ $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error()); mysql_select_db(DB_NAME, $this->connection) or die(mysql_error()); } /* Transactions functions */ function begin(){ $null = mysql_query("START TRANSACTION", $this->connection); return mysql_query("BEGIN", $this->connection); } function commit(){ return mysql_query("COMMIT", $this->connection); } function rollback(){ return mysql_query("ROLLBACK", $this->connection); } function transaction($q_array){ $retval = 1; $this->begin(); foreach($q_array as $qa){ $result = mysql_query($qa['query'], $this->connection); if(mysql_affected_rows() == 0){ $retval = 0; } } if($retval == 0){ $this->rollback(); return false; }else{ $this->commit(); return true; } } }; /* Create database connection object */ $database = new MySQLDB; // then from anywhere else simply put the transaction queries in an array or arrays like this: function function(){ global $database; $q = array ( array("query" => "UPDATE table WHERE something = 'something'"), array("query" => "UPDATE table WHERE something_else = 'something_else'"), array("query" => "DELETE FROM table WHERE something_else2 = 'something_else2'"), ); $database->transaction($q); } Как уже отмечалось выше: Не используйте функции mysql_*, они устарели. Используйте вместо них MySQLi или PDO_MySQL И как облегчение: у mysqli есть как раз-таки функция для множественных запросов. Примитивный пример: $mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) { echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; } if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) { echo "Не удалось создать таблицу: (" . $mysqli->errno . ") " . $mysqli->error; } $sql = "SELECT COUNT(*) AS _num FROM test; "; $sql.= "INSERT INTO test(id) VALUES (1); "; $sql.= "SELECT COUNT(*) AS _num FROM test; "; if (!$mysqli->multi_query($sql)) { echo "Не удалось выполнить мультизапрос: (" . $mysqli->errno . ") " . $mysqli->error; } do { if ($res = $mysqli->store_result()) { var_dump($res->fetch_all(MYSQLI_ASSOC)); $res->free(); } } while ($mysqli->more_results() && $mysqli->next_result());

Сохранение JSON ответа в сsv. Python

#python #json #python_3x #парсер #csv


В общем сохраняю json ответ в сsv, получается как на картинке.



В итоге хочу достигнуть такой результат. Подскажите как реализовать(желательно с
примером), или литературу какую-нибудь.



Вот сам код.

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
from random import choice
from time import sleep
from random import uniform
import json
import csv

def get_html(url,useragent,proxy,StartFroms):
    #print("get_html")
    #print(StartFroms)
    #print(proxy)
    #print(useragent)
    s = requests.Session()
    s.get("http://toto-info.co",proxies = proxy)

    pl = {"options": {"DrawingId": 632, "StartFrom":StartFroms, "Count": 20, "SortField":
"CouponCode", "SortDir": "ASC"}}
    res = s.post(url, headers={'User-Agent':useragent,
                'Accept-Language' : 'ru,en;q=0.8',
                'Accept-Encoding' : 'gzip, deflate, sdch',
                'Connection': 'keep - alive',
                'Content-Type': 'application/json',
                'Host': 'old.toto-info.co',
                'Origin': 'http://toto-info.co',
                'Referer': 'http://toto-info.co/'},proxies = proxy, data=json.dumps(pl))

    data = res.json()

    with open('response.csv', 'w', encoding='utf-8') as file:
        json.dump(data, file, indent=2, ensure_ascii=False)

    print('------------------------------------------')

def main():

    url = 'http://old.toto-info.co/DataService.svc/GetMaxPrizeCoupons'

    useragents = open("useragents.txt").read().split('\n')
    proxies = open("proxies.txt").read().split('\n')

    start = 0 # переменная для хранения точки входа в for
    finish = 1000

    while start < finish:
        try:
            for i in range(start, finish, 20):
              a = (uniform(1, 2))
              sleep(a)
              StartFroms = i
              useragent = "'" + choice(useragents) + "'"
              proxy = {'http': 'http://' + choice(proxies)}
              get_html(url, useragent, proxy, StartFroms)
        except:
            start = i # перезапускаем for c точки исключения

if __name__ == '__main__':
    main()

    


Ответы

Ответ 1



Вот рабочий скрипт. Для теста я указал finish = 100 (чтобы быстрее отработало): import requests from random import choice from time import sleep from random import uniform import csv import json import pandas as pd def get_html(url, useragent, proxy, StartFroms): s = requests.Session() s.get("http://toto-info.co") pl = {"options": {"DrawingId": 632, "StartFrom":StartFroms, "Count": 20, "SortField": "CouponCode", "SortDir": "ASC"}} resp = s.post(url, headers={'User-Agent':useragent, 'Accept-Language' : 'ru,en;q=0.8', 'Accept-Encoding' : 'gzip, deflate, sdch', 'Connection': 'keep - alive', 'Content-Type': 'application/json', 'Host': 'old.toto-info.co', 'Origin': 'http://toto-info.co', 'Referer': 'http://toto-info.co/'},proxies = proxy, data=json.dumps(pl)) return resp.json()['d']['Items'] def main(): url = 'http://old.toto-info.co/DataService.svc/GetMaxPrizeCoupons' useragents = open(r"D:\download\useragents.txt").read().split('\n') proxies = open(r"D:\download\proxies.txt").read().split('\n') start = 0 # переменная для хранения точки входа в for finish = 100 data = [] while start < finish: try: sleep(uniform(1, 2)) useragent = "'{}'".format(choice(useragents)) proxy = {'http': 'http://{}'.format(choice(proxies))} print('processing:\t[{}] ...'.format(start)) data += get_html(url, useragent, proxy, start) start += 20 except Exception as e: print('Exception:\t{}'.format(str(e))) print('building DataFrame ...') df = pd.DataFrame(data) # debug: print first 5 rows of DF... #print(df.head()) out_fn = r'd:/temp/result.xlsx' df.set_index('CouponCode')['Options'] \ .str.extractall(r'\d+-\((.*?)\)')[0] \ .unstack().reset_index().rename_axis(None, 1) \ .to_excel(out_fn, index=False) if __name__ == '__main__': main()

Ответ 2



Взял код автора, немного упростил и получил json. Сам код: import json import requests session = requests.Session() session.get("http://toto-info.co") pl = {"options": {"DrawingId": 632, "StartFrom": 1, "Count": 10, "SortField": "CouponCode", "SortDir": "ASC"}} rs = session.post( url='http://old.toto-info.co/DataService.svc/GetMaxPrizeCoupons', headers={ 'Accept-Language': 'ru,en;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch', 'Connection': 'keep - alive', 'Content-Type': 'application/json', 'Host': 'old.toto-info.co', 'Origin': 'http://toto-info.co', 'Referer': 'http://toto-info.co/' }, data=json.dumps(pl) ) with open('response.csv', 'w', encoding='utf-8') as f: json.dump(rs.json(), f, indent=2, ensure_ascii=False) После считал json построчно и сохранил в excel: with open('response.csv', mode='r', encoding='utf-8') as f: import xlwt wb = xlwt.Workbook() ws = wb.add_sheet('Json data') for i, line in enumerate(f.readlines()): line = line.rstrip() ws.write(i, 0, line) wb.save('excel.xls') Вот так выглядит excel: Файл с json: { "d": { "Summary": { "TotalCount": 93977, "__type": "SelectSummary:#FonbetEngine.DAL" }, "__type": "SelectResultOfWinCouponSelectSummaryWVcc8KbY:#FonbetEngine.DAL", "Items": [ { "MaxResult": 6, "CouponCode": "10000", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(X); 2-(1); 3-(2); 4-(2); 5-(1); 6-(X); 7-(2); 8-(1); 9-(1); 10-(2); 11-(1); 12-(2); 13-(X); 14-(X); 15-(2)", "TotalStakeValue": 50 }, { "MaxResult": 2, "CouponCode": "100002", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(1); 2-(X); 3-(1); 4-(1); 5-(1); 6-(2); 7-(1); 8-(1); 9-(2); 10-(2); 11-(1); 12-(X); 13-(1); 14-(1); 15-(1)", "TotalStakeValue": 50 }, { "MaxResult": 3, "CouponCode": "100019", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(2); 3-(X); 4-(1); 5-(1); 6-(X); 7-(2); 8-(2); 9-(X); 10-(1); 11-(1); 12-(X); 13-(2); 14-(2); 15-(X)", "TotalStakeValue": 50 }, { "MaxResult": 5, "CouponCode": "100026", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(1); 3-(1); 4-(X); 5-(1); 6-(2); 7-(X); 8-(1); 9-(X); 10-(2); 11-(2); 12-(1); 13-(X); 14-(2); 15-(2)", "TotalStakeValue": 50 }, { "MaxResult": 10, "CouponCode": "100033", "TotalPrizeValue": 961.6088, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(2); 3-(2); 4-(2); 5-(X); 6-(2); 7-(1); 8-(2); 9-(1); 10-(X); 11-(2); 12-(1); 13-(2); 14-(2); 15-(2)", "TotalStakeValue": 50 }, { "MaxResult": 5, "CouponCode": "100040", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(X); 3-(1); 4-(2); 5-(1); 6-(1); 7-(1); 8-(2); 9-(X); 10-(X); 11-(1); 12-(2); 13-(X); 14-(1); 15-(X)", "TotalStakeValue": 50 }, { "MaxResult": 6, "CouponCode": "100057", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(2); 3-(1); 4-(X); 5-(1); 6-(1); 7-(X); 8-(2); 9-(X); 10-(X); 11-(1); 12-(1); 13-(1); 14-(X); 15-(X)", "TotalStakeValue": 50 }, { "MaxResult": 9, "CouponCode": "100064", "TotalPrizeValue": 341.1707, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(1); 3-(X); 4-(1); 5-(X); 6-(1); 7-(X); 8-(2); 9-(X); 10-(1); 11-(2); 12-(1); 13-(1); 14-(2); 15-(1)", "TotalStakeValue": 50 }, { "MaxResult": 4, "CouponCode": "100071", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(2); 2-(2); 3-(1); 4-(1); 5-(2); 6-(X); 7-(1); 8-(1); 9-(2); 10-(1); 11-(X); 12-(1); 13-(2); 14-(2); 15-(1)", "TotalStakeValue": 50 }, { "MaxResult": 5, "CouponCode": "100088", "TotalPrizeValue": 0, "__type": "WinCoupon:#FonbetEntity", "Cnt": 1, "Options": "1-(1); 2-(2); 3-(2); 4-(1); 5-(1); 6-(X); 7-(2); 8-(2); 9-(X); 10-(1); 11-(1); 12-(2); 13-(1); 14-(X); 15-(X)", "TotalStakeValue": 50 } ] } }

Ответ 3



Трудно найти модуль для обработки табличных данных, который смог бы превзойти Pandas: import json import pandas as pd # если: `data = res.json()`, т.е. `data` - словарь (parsed to dictionary JSON) df = pd.DataFrame(data['d']['Items']) # если `json_str` - строка содержащая JSON response ... #df = pd.DataFrame(json.loads(json_str)['d']['Items']) df.set_index('CouponCode')['Options'] \ .str.extractall(r'\d+-\((.*?)\)')[0] \ .unstack().reset_index().rename_axis(None, 1) \ .to_excel('d:/temp/result.xlsx', index=False) Результат (D:\temp\result.xlsx): "Распарсенный" в DataFrame JSON: In [303]: df Out[303]: Cnt CouponCode MaxResult Options TotalPrizeValue \ 0 1 10000 6 1-(X); 2-(1); 3-(2); 4-(2)... 0.0000 1 1 100002 2 1-(1); 2-(X); 3-(1); 4-(1)... 0.0000 2 1 100019 3 1-(2); 2-(2); 3-(X); 4-(1)... 0.0000 3 1 100026 5 1-(2); 2-(1); 3-(1); 4-(X)... 0.0000 4 1 100033 10 1-(2); 2-(2); 3-(2); 4-(2)... 961.6088 5 1 100040 5 1-(2); 2-(X); 3-(1); 4-(2)... 0.0000 6 1 100057 6 1-(2); 2-(2); 3-(1); 4-(X)... 0.0000 7 1 100064 9 1-(2); 2-(1); 3-(X); 4-(1)... 341.1707 8 1 100071 4 1-(2); 2-(2); 3-(1); 4-(1)... 0.0000 9 1 100088 5 1-(1); 2-(2); 3-(2); 4-(1)... 0.0000 TotalStakeValue __type 0 50 WinCoupon:#FonbetEntity 1 50 WinCoupon:#FonbetEntity 2 50 WinCoupon:#FonbetEntity 3 50 WinCoupon:#FonbetEntity 4 50 WinCoupon:#FonbetEntity 5 50 WinCoupon:#FonbetEntity 6 50 WinCoupon:#FonbetEntity 7 50 WinCoupon:#FonbetEntity 8 50 WinCoupon:#FonbetEntity 9 50 WinCoupon:#FonbetEntity

Динамическое установление типа в зависимости от условия

#c_sharp #типы_данных


Есть две сборки (service reference) в одном namespace OrderSendService. Обе имеют
класс Order:

public class Order
{
   public int id { get; set; }
   public string type { get; set; }
}


ServiceReference1 и ServiceReference2, это Service references, полученные на основе
wsdl. Мне нужно использовать оба этих референса. Сейчас  формируется объект  ServiceReference1.Order
и отправляется методом ServiceReference1.Send(). Возникла необходимость для отправки
использовать ServiceReference2.Send() и передавать этот же объект (при этом ServiceReference2.Send()
принимает объекты из своего namespace)

Возможно ли в зависимости от условия, установить тип объекту? Использую такой код:

dynamic obj;
if (condition)
{
   obj = new ServiceReference1.Order[10];
}
else
{
   obj = new ServiceReference2.Order[10];
}


(obj будет передаваться в методе Send() одного из wsdl-сервисов).

Неймспейсы сервисов:

OrderSendService.ServiceReference1
OrderSendService.ServiceReference2


При попытке доступа к свойству obj[0].id VS 2015 показывает ошибку:


  Missing compiler required member
  Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create


И возможно ли привести тип ServiceReference1.Order к ServiceReference2.Order?
    


Ответы

Ответ 1



Судя по всему, не хватало подключения библиотеки Microsoft.CSharp. Поскольку dynamic — внутри-C#-овская фича, ей нужна специальная поддержка. Проекты, созданные старыми версиями компилятора, не содержат ссылки на Microsoft.CSharp, поэтому ссылку иногда приходится добавлять вручную.

Ответ 2



Заведите для разных служб разные пространства имен. Вы искуственно создаете ситуацию, когда .NET не имеет возможности различить два типа Order в том месте кода, где они "видны". И возможно ли привести тип ServiceReference1.Order к ServiceReference2.Order Нет. public class OrderConverter { public static ServiceReference1.Order Convert(ServiceReference2.Order anOrder) { return new ServiceReference1.Order() { id = anOrder.id; type = anOrder.type; }; } public static ServiceReference2.Order Convert(ServiceReference1.Order anOrder) { return new ServiceReference2.Order() { id = anOrder.id; type = anOrder.type; }; } }

JS - Как посчитать значение арифметического выражения из строки

#javascript #jquery #html5


Пытаюсь сделать калькулятор. Работает он следующим образом:
При клике по цифре, она вписывается в переменную. При клике по знаку (+,-,*,/), они
добавляются в ту же переменную что и цифра. В итоге получается к примеру:
var x = '18*2+3' 
Я хочу сделать чтобы при нажатии по знаку равенства, уравнение находящееся в переменной
x было решено, как к примеру, если бы это было просто:  var x = 18*2+3. 
console.log(x);

Пробовал функцию Number и понял что делаю что-то не то.

Подскажите пожалуйста какими способами можно решить задачу и как можно автоматический
увеличить высоту дива ('.example') при достижении определенного количества знаков?



$(function() {

var numbers = 0;
var example = 0;

// Пот нажатии на кнопку с цифро, он появляется в нижнем "табло" калькулятора
$('.numBtn').click(function() {
	if (numbers.length >= 12) {
		return;
	} else {
		if (numbers == 0) {
			numbers = this.value;
		} else {
			numbers += this.value;
		}
	}
	$('.calcIn').text(numbers);
})

// При нажатии на знак +, - , * или /, цифра и нажатый знак урованения добавляются
в переменную example.
$('.funcBtn').click(function(){
	example += ($('.calcIn').text())
	$('.desk').text(example+=this.value);
	numbers = 0
	$('.calcIn').text(numbers)
})



/*При нажатии на кнопку равно, результат примера находящегося в качестве строки в
переменной example должен появиться в качестве текста в классе calcIn */
$('.equalBtn').click(function(){
// 
//
$('.calcIn').text(result);
})

});


0
0


Ответы

Ответ 1



Добрый день! В вашем случае подойдет использование функции eval(), хотя ее использование крайне не рекомендуется в сообществе. Она создает из строки полноценное выражения для выполнения. Для простоты демонстрации я изменил ваш div в текстовый input (разница в коде только в том, что для инпутов нужно именять не .text(), а val()). $('.equalBtn').click(function() { let equation = $('.desk').val(); let result = eval(equation); $('.calcIn').text(result); }); Насчет высоты. Высота элементов сама легко регулируется при помощи css, достаточно задать ширину для блочного элемента. В вашем случае, если ответ будет слишком длинный и в одно "слово", то следует применить свойство overflow-wrap, которое как раз решает эту задачу. #text { width: 200px; overflow-wrap: break-word; } Для демонстрации я добавил кнопку с отображением числа пи. Демо: https://jsfiddle.net/w96k/regbLvbf/1/

Ответ 2



The eval() function evaluates JavaScript code represented as a string. А увеличить размер элемента, это же обычный if: if (символов_достаточно) element.style.height = '20px'; //например (или методами jquery) НО! eval() is a dangerous function, which executes the code it's passed with the privileges of the caller. If you run eval() with a string that could be affected by a malicious party, you may end up running malicious code on the user's machine with the permissions of your webpage / extension. More importantly, third party code can see the scope in which eval() was invoked, which can lead to possible attacks in ways to which the similar Function is not susceptible. eval() is also generally slower than the alternatives, since it has to invoke the JS interpreter, while many other constructs are optimized by modern JS engines. Корректнее (но не проще) написать свою функцию(ции), которая разбирает строку на токены и оперирует уже <числами> и <выражениями>, правильно определяет порядок вычислений. Подробнее можно почитать по запросу "лексический анализатор" в поисковиках и в книжках по построению компиляторов.

Ответ 3



Есть библиотека mathjs В ней можно выполнять выражения: math.eval('sqrt(3^2 + 4^2)') // 5 math.eval('sqrt(-4)') // 2i math.eval('2 inch to cm') // 5.08 cm math.eval('cos(45 deg)') // 0.7071067811865476 Песочница где можно попробовать

Выделение памяти в С++ и аварийное завершение программы

#cpp #memory_leaks #memory_management


Допустим, у меня есть класс, который я создаю в самом начале программы, в его конструкторе
я выделяю память под какие-то другие объекты с помощью операторов new, а в его деструкторе
вызываю delete. Насколько такая практика приемлема и что произойдёт, если во время
работы программы её аварийно завершить (скажем, прихлопнуть через диспетчер задач).
Спасибо.
    


Ответы

Ответ 1



Если Ваше приложение будет "прихлопнуто" или аварийно завершено, то обычная выделенная память будет подчищена. Да, деструктор не будет вызван, но какое это имеет значение, если приложение уже упало. Поэтому, если просто выделили память себе под массив, а потом подчистили - все ок. Но в современном с++ явный вызов new/delete считается моветоном. Обычные unique_ptr/shared_ptr решают 90% подобных проблем и нивелируют необходимость в теле деструктора. Другое дело, если приложение выделят какие-то общие ресурсы - shared memory или междупроцессорные мютексы/семафоры. Тут могут быть проблемы.

Как сделать так, чтобы activity при нажатии кнопки назад никак не изменялось

#java #android #activity


Как сделать так чтобы при нажатии кнопки назад на экране телефона ничего не происходило.
    


Ответы

Ответ 1



Просто переопределите метод onBackPressed в активити так, чтобы он ничего не делал: @Override public void onBackPressed() { //ничего не делаем }

Уместно ли использовать тип unsigned char для хранения чисел

#c #char


Например, если мне нужна целочисленная переменная в диапазоне [0; 255] могу я использовать
тип unsigned char? Появились сомнения по этому поводу, т.к. этот тип обычно используется
для хранения символов, а использование в качестве числа будет не совсем очевидно. Интересует,
не повредит ли это читабельности программы.
    


Ответы

Ответ 1



unsigned char не хранит символы. Это - числовой тип данных, также как и signed char. Символы представляются типом данных char, который может быть как знаковым, так и беззнаковым - и это третий тип данных, который отличается от первых двух. Поэтому использовать unsigned char для хранения чисел - вполне уместно. Но если вам нужен именно диапазон [0; 255] - то правильнее использовать uint8_t, а не unsigned char - потому что размер unsigned char может отличаться от привычного на экзотических платформах, а uint8_t либо 8 бит, либо не существует.

Ответ 2



Ответ для вопроса с редакцией #1: Строго говоря, для диапазона [0; 255] нужен по крайней мере unsigned char. компилятор сам выбирает каким именно типом будет char - signed или unsigned, в моем случае - последним. Вы вот задали вопрос: "Интересует, не повредит ли это читабельности программы". И тут же оправдываете свою ошибку поведением компилятора. Нелогично. В таком контексте ответ может быть только - да, повредит и даже очень! Если Вы заботитесь о читабельности кода, то должны по крайней мере убрать из него лишние зависимости. И да, char, signed char и unsigned char - разные типы данных.

Ответ 3



Строго говоря, ответ "нет". Тому есть несколько причин. 1) неоднократно упомянутая, для хранения целых чисел в диапазоне [0, 255] почти всегда можно использовать тип unsigned char. То, что на Вашем компиляторе тип char беззнаковый, приведет лишь к тому, что попытавшись использовать свой код на другой платформе (другом компиляторе) Вы столкнетесь с непредсказуемым поведением кода. 2) Более важная причина. Стандарт никак не гарантирует, что тип char занимает в памяти 8 бит. Да, я не знаю современных платформ, где это было бы не так, но тем не менее, Вы получите код, не соответствующий стандарту. В конце концов, кодировка ASCII неспроста изначально 7-битная. Корректно было бы использовать тип uint8_t определенный в заголовочном файле . Но и это надо делать с осторожностью, ибо (provided only if the implementation directly supports the type) (см http://en.cppreference.com/w/c/types/integer)

Как записать выборку из таблицы?

#mysql #sql


Как, в одном запросе, записать выборку по имени оператора из таблицы один, если имя
оператора нужно найти во второй таблице по имени клиента

'SELECT `operator` FROM `table2` WHERE `client` = clientname'
'SELECT * FROM `table1` WHERE `table1`.`operator` = `table2`.`operator`'

    


Ответы

Ответ 1



Вот пример для UPDATE запроса с JOIN который вы хотели: UPDATE `table1` JOIN `table2` ON `table1`.`operator`=`table2`.`operator` SET (`table1`.`column1` = "Вася", `table1`.`column2` = "Петя") WHERE `table2`.`ClientName` = "Оля"

Ответ 2



Мне кажется такой запрос вам подойдет: SELECT * FROM `table1` LEFT JOIN `table2` ON table1.operator=table2.operator WHERE table2.ClientName = "Петя";

Печать машинного представления float

#c_sharp #python #float #ieee_754 #floating_point


Есть стандарт IEEE 754 двоичного представления чисел и их арифметики.
В нем описываются нормализованные числа и ненормализованные. В теории все понятно.
Но я хочу на консоль распечатать несколько ненормализованных чисел в их внутреннем
представлении, машинном, т.е. с характеристикой и мантиссой.
Как это можно сделать, например, на Python, C#?
И еще попутно вопрос. Можно ли работать в языках высокого уровня с вещественными
литералами в двоичной системе счисления?
    


Ответы

Ответ 1



Но я хочу на консоль распечатать несколько ненормализованных чисел в их внутреннем представлении, машинном, т.е. с характеристикой и мантиссой На Python3 на основе ответа с EnSO: import struct def binary(num): bins = tuple(bit for byte in (tuple(bin(c).replace('0b', '').rjust(8, '0'))\ for c in struct.pack('!f', num)) for bit in byte) print(bins[0] + ' ' + ''.join(bins[1:9]) + ' ' + ''.join(bins[9:])) binary(1.0) binary(-1.0) binary(1.175494351e-38) binary(1.401298464e-45) Отдельно выводятся знак, порядок (смещённый) и мантисса. Для чисел двойной точности нужно заменить !f на !d и соответственно выводить больше байт для порядка: import struct def binary(num): bins = tuple(bit for byte in (tuple(bin(c).replace('0b', '').rjust(8, '0'))\ for c in struct.pack('!d', num)) for bit in byte) print(bins[0] + ' ' + ''.join(bins[1:12]) + ' ' + ''.join(bins[12:])) binary(2.716154612436e-312) Чтобы перевести биты обратно в число, можно использовать такую функцию: def binary_to_float(num): return struct.unpack("!f", int(num, 2).to_bytes(4, byteorder='big'))[0] print(binary_to_float('10111111100000000000000000000000'))

Ответ 2



В Питоне, можно float.hex метод использовать, чтобы точное представление числа с плавающей точкой напечатать (как %a в Си (C99): [-]0xh.hhhp±d): >>> 2.716154612436e-312 .hex() '0x0.0008000000000p-1022' Если хочется байты увидеть представления IEEE 754 binary64: >>> import struct >>> data = struct.pack('d', 2.716154612436e-312) >>> data b'\x00\x00\x00\x00\x80\x00\x00\x00' В виде бит это выглядит как: >>> import sys >>> bits = bin(int.from_bytes(data, sys.byteorder))[2:].zfill(64) >>> bits '0000000000000000000000001000000000000000000000000000000000000000' Так как порядок 0, то дано денормализованное число: >>> bits[0] # знаковый бит '0' # -> положительное число >>> bits[1:12] # порядок (exponent) '00000000000' Денормализованные числа вычисляются по формуле: ±знак × (0+мантисса/ 252) · 21 − 1023 (double): >>> significand = int(bits[13:], 2) >>> hex(significand) '0x8000000000' >>> significand / 2**52 * 2**-1022 2.716154612436e-312 И в обратную сторону: >>> 2.716154612436e-312 .as_integer_ratio() (1, 368167554019802297902961703073592265444961685287384386095984806211036520049665972495786961556290633771253993225976613596485201446531925242865351537949643006725668645734124513845866945743352000756639913885870091814580532597437363981258574050387614181710541845882032738795411959682006458992302809763070411033018368) >>> _[0] / _[1] 2.716154612436e-312 Чтобы получить представление как: f = m * 2**e, можно math.frexp() вызывать: >>> import math >>> math.frexp(2.716154612436e-312) (0.5, -1034) >>> (1/2) * 2**-1034 2.716154612436e-312 Чтобы в двоичной системе дробное представление числа с плавающей точкой получить: >>> float_to_bin(2.716154612436e-312) '0b0.0000000000001000000000000000000000000000000000000000p-1022' См. Преобразование дробного числа к двоичной системе счисления.

Передача id сущности vs Bundle: плюсы и минусы?

#android #архитектура


Есть список сущностей, например Event. По клику на сущность переходим на детальный
экран. Можно ли передавать сущность в Bundle или лучше передавать только Id. Какие
плюсы и минусы у этих подходов?
    


Ответы

Ответ 1



Правильнее передавать параметром только Id, а сами элементы будут получаться из репозитория по этому айди. Если у вас есть что положить в Bundle, значит вы можете закешировать это через репозиторий. В таком случае вы всегда можете получить актуальную информацию из репозитория, а не потенциально устаревшую из параметров. К тому же, если вам нужно передать объект с большим количество полей, или со списками данных, в определённый момент у вас может произойти TransactionTooLargeException, если вы будете использовать Bundle.

Сортировать вектор структур [закрыт]

#cpp #сортировка #cpp11 #stl


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Отсортировать вектор по одному из полей, используя алгоритмы STL.
По возможности использовать все перегрузки сортировки (фраза, которую я не понял).

struct Dot
{
    double x,y,z;
};

std::vector numbers = {
    {123.0, 48.55, 0},
    {-128.1, 0, 49.55},
    {0,134.0,-59.1}
};


Здесь пример очень похож на правду, но я не могу свести до моей задачи.
    


Ответы

Ответ 1



По возможности использовать все перегрузки сортировки (фраза, которую я не понял). В C++ функции могут быть перегружены - иными словами несколько функций с одним и тем же именем но разной сигнатурой могут одновременно быть определены в коде, и затем вызваны соответствующим образом. В данном случае в роли такой функции должна выступать функция из стандартной библиотеки - std::sort(...) Касательно вашей задачи - чтобы сортировать точки по какому-то полю (или координате), компилятору необходим "объяснить" как сравнивать точки (то есть структуры Dot) - это можно сделать аж тремя способами: Создать кастомный компаратор, перегрузив оператор () вызова функции (устаревший вариант) struct Dot { double x,y,z; }; std::vector numbers = { {123.0, 48.55, 0}, {-128.1, 0, 49.55}, {0,134.0,-59.1} }; struct pred { bool operator()(const Dot& dot1, const Dot& dot2) { return dot1.x < dot2.x; } }; int main() { std::sort(numbers.begin(), numbers.end(), pred()); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } Перегрузить оператор < //... bool operator < (const Dot& dot1, const Dot& dot2) { return dot1.x < dot2.x; } int main() { std::sort(numbers.begin(), numbers.end()); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } Передать лямбду (раз уж вы указали 11-ый стандарт) в функцию сортировки из STL //... int main() { std::sort(numbers.begin(), numbers.end(), [](const Dot& dot1, const Dot& dot2) -> bool { return dot1.x < dot2.x; } ); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } P.S. Инклюды не писал, чтобы сократить код.

Эффективные ли побитовые операции в Java?

#java #производительность #битовые_операции


Если брать нативные языки на подобие "C++" или "C", то там понятен выигрыш в производительности
напрямую играться с регистрами, но если брать язык, где все крутится на виртуалке JVM
- не совсем понятно, в чем мы можем выиграть в производительности и выиграем ли вообще??

Как работают битовые операции под капотом JVM?
Или в джава просто реализованы побитовые операции для лучшей переносимости тех же
алгоритмов например с плюсов или си?

И в каких реальных случаях в java мире нам будет интересно применять на практике
битовые операции?
    


Ответы

Ответ 1



в чем мы можем выиграть в производительности В производительности перед операциями с аналогичными результатами без применения битовых операций. Если вы думаете, что JVM делает всё медленнее, то ведь не только битовые операции страдают, верно? в каких рельных случаях в java мире нам будет интересно применять на практике битовіе операции? В тех же, что и в остальном мире Если брать нативные языки на подобие "с++" или "С" то там понятен выиграш в производительности напрямую игратся с регистрами, но если брать язык где все крутится на виртуалке JVM JVM - это не интерпретатор, это машина, транслирующая java-байткод в машинный код, соответствующий спецификации. В результате битовых операций будут вызываться ровно те же инструкции процессора, что и на ассемблере. Конкретно в самой битовой операции никакой потери производительности нет, основной "замедлитель" относительно условного си - это наличие сборки мусора и присущих stop-the-world пауз.

Вернуть строку, где элементы с четными индексами будут переведены в верхний регистр

#javascript


Привет всем, 

Суть задачи: написать функцию которая принимает в параметры строку, и возвращает
её, где всё элементы с четными индексами переведены в верхний регистр.

Например: 

 toWeirdCase( "Weird string case" );//=> returns "WeIrD StRiNg CaSe"




function toWeirdCase(s){
    var str = s.toLowerCase().split(' '); // Переводим строку в нижний регистр, и
разбиваем на массив. 
    for(var i = 0; i < str.length; i++){ // проходимся циклом по этим массивам
        var s = str[i].split('').forEach(function (item, j/*индекс текущего элемента*/)
{ // разбиваем уже сложенные элементы на массивы, и попутно делаем проверку на четность
индекса
            if (j % 2 === 0){
                item.toUpperCase(); // переводим элемент с четным индексом в верхний
регистр
                //console.log(item.toUpperCase()); // так выводит всё четные элемент
в верхнем регистре.
            }
        });
        console.log(s);
    }
}

console.log(toWeirdCase("Weird string case"));




Вот не могу понять как теперь, собрать обратно всё в одну сроку.
Кто может ткните носом меня, в сторону правильного решения :) 
    


Ответы

Ответ 1



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

Ответ 2



function toWeirdCase(s) { var str = s.toLowerCase().split(' '); var result = ''; for (var i = 0; i < str.length; i++) { for (var j = 0; j < str[i].length; j++) { if (j % 2 === 0) { result += str[i][j].toUpperCase(); } else { result += str[i][j]; } } result += ' '; } return result; } console.log(toWeirdCase("Weird string case"));

Ответ 3



зачем так громоздить? вот вариант на регулярках. правда немного растянуто, но что бы понятно было спец. так сделал. function replacer(str, $1, $2, offset, s) { return $2.replace(/(.)(.)/gi, uper) + ' '; // ищем четное и нечетное и кидаем в uper } function uper (str, $1, $2, offset, s) { return $1.toUpperCase()+$2; // берем первый символ делаем, большим плюсуем второй } const str = 'Lorem ipsum dolor sit amet'; console.log(str.replace(/(^|\s*)(\w*)(^|\s*)/g, replacer)) // ищем слова и кидаем найденое в функцию replacer

C++11 range-based цикл

#cpp #foreach #const


В каких случаях использовать данный синтаксис? Где использовать const, а где ссылку?

for (const auto& elem: коллекция)
{  ...  }


Мои подозрения, если употребить const, то в elem будет храниться константный объект,
а если ссылку, то в elem будет храниться ссылка на константный объект. Если не употреблять
этого всего, то в elem будет хранится копия объекта.
    


Ответы

Ответ 1



const auto& если объект не будет меняться в теле цикла и/или оптимизация операций копирования. auto& если необходимо изменить объект в коллекции. auto если объект будет изменяться, но его копия в коллекции должна остаться неизменной.

Сложение(+) в JavaScript

#javascript


Здравствуйте, при скрипте:

function pl(){
//document.getElementById('inp2').value
alert(document.getElementById('inp2').value+document.getElementById('inp2').value);
}


Если value=12,  выдает 1212.. Что и как нужно сделать, чтобы получилось 24? 
    


Ответы

Ответ 1



Аттрибуты являются строками и оператор + является для них операцией конкатенации. Для сложения строк как чисел, нужно явно распарсить строку в число. Например функция parseInt: alert(parseInt(document.getElementById('inp2').value)+parseInt(document.getElementById('inp2').value)); Еще есть вариант через унарный оператор +: var test1 = +document.getElementById('inp2').value; alert(test1+test1) На learn.javascript.ru можно прочитать подробней про преобразования. UPDATE Есть особенность работы parseInt: в разных браузерах строки, которые начинаются с 0 ( например '010') могут преобразоваться либо в восмеричную( в примере получится 8), либо в десятичную систему счисления. Описание на mdn. По спецификации ecmascript 5 по умолчанию явно задаётся десятичная система счисления, т.е. parseInt('010') -> 10

Ответ 2



используйте parseInt(строкаВвидеЧисла) function pl(){ if(document.getElementById('inp2').value == "") { alert("0"); } else { alert(parseInt(document.getElementById('inp2').value)+parseInt(document.getElementById('inp2').value)); } }

Ответ 3



value у inputа содержит строку. А сложение превращается в конкатенацию если хотя бы один из аргументов - строка. Чтобы привести строку к числу надо использовать унарный плюс. var s = "12", x = 12; console.log(JSON.stringify(s + s)); // "1212" console.log(JSON.stringify(s + x)); // "1212" console.log(JSON.stringify(x + s)); // "1212" console.log(JSON.stringify(x + x)); // 24 var y = +s; console.log(JSON.stringify(y + y)); // 24

Вывод сообщения в консоль Windows при некорректном количестве параметров

#java #командная_строка


Есть следующая проблема: не выводится текст в консоль.
Есть некоторое приложение, которое обрабатывает исходный текстовый файл, выводит
результат во второй и принимает на вход 4 аргумента:

input.txt output.txt -k -u


где k и u - какие-то параметры запуска.
В целом, запуск приложения в консоли выглядит следующим образом:

program.exe input.txt output.txt -k -u


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

public static void main(String[] args) {
    ...
    if (args.length != 4) {
        System.out.println("Invalid format");
        return; 
    }
    ...
}




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


Ответы

Ответ 1



Запускайте программу с использованием java -jar: java -jar program.jar arg1 arg2 arg3 В этом случае в консоли появится: Invalid format

Ответ 2



Все легко. Просто используйте команду полного выхода, который есть в классе System. public static void main(String[] args) { ... if (args.length != 4) { System.out.println("Invalid format"); System.exit(0); // Та самая команда } ...

Сократить количество mysql-кода

#mysql #sql #оптимизация


Можно ли как-нибудь сократить количество mysql-кода в следующем запросе?

SELECT IF(EXISTS(SELECT * FROM tbl WHERE `field_1` LIKE '1'), 
         (SELECT field_3 FROM tbl WHERE `field_1` LIKE '1'), 
         (SELECT field_3 FROM tbl WHERE `field_2` LIKE '1'));

    


Ответы

Ответ 1



Если столбцы field_1 и field_2 не уникальны, то подзапросы, в приведенном вами примере, могут вернуть несколько значений. Сам запрос можно сократить до одной выборки из таблицы, что сократит число обращений к таблице: SELECT field_3 FROM tbl WHERE `field_1` = 1 OR (`field_1` != 1 and `field_2` = 1) ORDER BY `field_1` LIMIT 1; Если field_1 и field_2 уникальны, то сортировка и ограничение числа записей не нужно: SELECT field_3 FROM tbl WHERE `field_1` = 1 OR (`field_1` != 1 and `field_2` = 1);

Ответ 2



Судя по всему, у вас во from другие таблицы, поэтому вы решили использовать подзапросы в select. Можно сделать так при условии, что SELECT field_3 FROM tbl WHERE field_1 LIKE '1' возвращает строго 1 строку всегда: SELECT IFNULL((SELECT field_3 FROM tbl WHERE `field_1` = '1'), (SELECT field_3 FROM tbl WHERE `field_2` = '1')); Не стоит делать like, если нет необходимости, у вас тут строгое сравнение с единичкой.

Ответ 3



Сортируем записи, поднимая вверх те, для которых выполняется первое из нужных вам условий, затем второе, и оставляем самую верхнюю (первую) запись выборки. SELECT field_3 FROM tbl WHERE (field_1 LIKE '1' OR field_2 LIKE '1') ORDER BY field_1 LIKE '1' DESC, field_2 LIKE '1' DESC LIMIT 1

Звездочки в input type=“text”

#php #javascript #input


Добрый день, как сделать, чтобы в поле input type="text" (не password, именно text)
введённые символы заменялись на звездочки, но потом передавать введенное значение?
    


Ответы

Ответ 1





Ответ 2



const input = password; password = ''; input.addEventListener('keyup', e => { if(input.value.length > password.length){ password += input.value[input.value.length-1]; }else{ password = password.substr(0,input.value.length); } input.value = '*'.repeat(password.length); console.log(password); });

Ограничение ввода количества знаков в input после точки

#javascript #input


Как на js (без pattern) ограничить количество вводимых цифр после точки?
    


Ответы

Ответ 1



function func(e) { if (e.value.indexOf(".") != '-1') { e.value=e.value.substring(0, e.value.indexOf(".") + 4); // цифра 4, устанавливает количество цифр после запятой, //т.е. если 4, то максимум 3 цифры после запятой } }

Полный путь к точке выброса исключения

#java #stack


Как избавиться от "... 1 more" и увидеть полный стек вызовов, приведших к выбросу
исключения, если результатом выводится только это:

// other output data
myPack.DynamicFieldsException
    at myPack.DynamicFields.setField(DynamicFields.java:69)
    at myPack.DynamicFields.main(DynamicFields.java:99)
Caused by: java.lang.NullPointerException
    at myPack.DynamicFields.setField(DynamicFields.java:70)
    ... 1 more


Просьба в ответе показать конкретный пример, т.е. 

catch (MyException e) { ??? }


Какой код следует использовать вместо "???" чтобы получить желаемый результат (полный
вывод стека) ?

Сейчас используется:

catch (MyException e) { e.printStackTrace(); }


Такой вариант:

catch (NoSuchFieldException e) {
        for (StackTraceElement l : e.getStackTrace())
            System.out.println(l);
}


не показывает причину, заранее заданную как new Exception(new Exception()); или как
new MyException().initCause(new MyException()); 
    


Ответы

Ответ 1



Этот способ вывода информации об исключении, является способом по умолчанию. Вот так это выглядит в коде if (framesInCommon != 0) s.println(prefix + "\t... " + framesInCommon + " more"); Но вы всегда можете перехватить исключение и вывести его в нужном вам формате. Метод getStackTrace вернет вам массив типа StackTraceElement. В нем вы найдете всю необходимую информацию о стеке. try { throw new Exception(new NullPointerException()); } catch (Exception ex) { Throwable cause = ex; while (cause != null) { for(StackTraceElement element: cause.getStackTrace()) { System.out.println(element.toString()); } cause = cause.getCause(); if(cause != null) { System.out.println("Caused by " + cause); } } }

Как часто надо делать комит? [дубликат]

#контроль_версий


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Следует ли коммитить в git промежуточные копии когда
библиотека вообще не готова
                                
                                    (3 ответа)
                                
                        
                                Закрыт 2 года назад.
            
                    
когда заканчивается проект? на каждой задаче, либо раз в месяц?)
    


Ответы

Ответ 1



Коммиты не должны быть привязаны ко времени. К задачам тоже не верно. Желательно привязывать к фичам/работающему функционалу. Если речь про git, то рекомендую: На каждую задачу создавать новую ветку. Коммитить функционал по готовности. Как можно детерминированней. Не надо, безусловно, коммитить отдельно каждую функцию. Но, если выбирать между этим и заливкой всех изменений одним коммитом, то лучше первое.

Ответ 2



Зависит от требований тим лидера или заказчика. Если ты себе сеньёр, сам тим лидер и заказчик то сам и решай как часто делать. Можно использовать гит как репозиторий для хранения, тогда коммиты будут делаться редко. При коммите каждой задачи это будет выглядеть: git commit -am"пофиксил задание №777". Лично я люблю коммитить после успешного завершения задачи, то есть полность рабочая кнопка на сайте. Или полность рабочий интерфейс. Бывает что нужно сделать просто страховочный коммит и отправить на репу чтобы код не пропал в случае если жесткий диск накроется например (или твой ноутбук случайно выбросят в окно). Также если нашлись баги то можно писать коммит на каждый баг и писать в описание что мы там пофиксили. А еще можно писать коммиты после написания класса или функции а также написания скрипта. Рекомендую работать с гит через командную строку (терминал на линукс). А если нужно просмотреть код, то использовать прогу визуальный редактор для гит типа ГитКракен или любую другую. Также рекомендую битбакет.

Ответ 3



На каждой задаче. Иногда на каждой подзадаче, я каждый час иногда делаю.