понедельник, 22 сентября 2014 г.

Как принудительно добавить overflow кнопку в ActionBar Android приложения

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

package com.mycompany.myApp;
import android.app.Application;
import android.view.ViewConfiguration;
import java.lang.reflect.Field;
public class MyApplication extends Application {
    @Override
    public void onCreate(){
        super.onCreate();
        try {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if(menuKeyField != null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception ex) {
            // Ignore
        }
    }
}
Далее в разделе application файла AndroidManifest.xml сослаться на наш класс, как новый класс приложения в разделе application.

        android:name="com.mycompany.myApp.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"

Далее указываем в наших файлах меню какие элементы и как будут отображаться на ActionBar с помощью свойства android:showAsAction и наслаждаемся результатом.

Источник

пятница, 30 мая 2014 г.

Simple one way platform Unity3D 2D

Here is a simple script for OWP. To use it you must define layer for player and two layers for platform object, one of them is just layer for active platform and other for inactive with disabled collision with player layer.



Then you need to select disabled platform layer fo platform. After that attach OWP script and specify layer names in inspector.



Here is a script:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[RequireComponent(typeof(Collider2D))]
public class OneWayPlatform : MonoBehaviour {
public string PlayerLayerName = string.Empty;
public string EnabledPlatformLayer = string.Empty;
public string DisabledPlatformLayer = string.Empty;
private GameObject ParentGO;
private int playerLayer = -1;
private int enabledPlatform = -1;
private int disabledPlatform = -1;

private GameObject player = null;
// Use this for initialization
void Start () {
if(PlayerLayerName == string.Empty) Debug.LogError("PLAYER LAYER UNDEFINED");
ParentGO = gameObject.transform.parent.gameObject;
playerLayer = LayerMask.NameToLayer(PlayerLayerName);
enabledPlatform = LayerMask.NameToLayer(EnabledPlatformLayer);
disabledPlatform = LayerMask.NameToLayer(DisabledPlatformLayer);

try{
player = FindGameObjectsWithLayer(playerLayer)[0];
} catch {
Debug.LogError("NO PLAYER FOUND");
}
}


GameObject[] FindGameObjectsWithLayer (int layer) {
GameObject[] goArray = FindObjectsOfType(typeof(GameObject)) as GameObject[];
List goList = new List();
for (int i = 0; i < goArray.Length; i++) {
if (goArray[i].layer == layer) {
goList.Add(goArray[i]);
}
}
if (goList.Count == 0) {
return null;
}
return goList.ToArray();
}
void Update(){
if(player.transform.position.y > transform.position.y){
if(gameObject.layer != enabledPlatform){
gameObject.layer = enabledPlatform;
}
} else {
if(gameObject.layer != disabledPlatform){
gameObject.layer = disabledPlatform;
}
}
}
}

вторник, 14 августа 2012 г.

Рекомендации по написанию кода на C NASA

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

среда, 20 апреля 2011 г.

MisterCrib - программа для списывания на тестах и экзаменах для Android



Вместо хелловорлда сделал, на мой взгляд, полезную софтину, есть несколько идей доработки, но пока нет времени (имею показания к релаксированию после работы, а не работе после работы, короче творческая пауза). Звать эту штуку "Мистер шпаргалка", чтобы пользоваться нужно установить софтину, зайти на mistercrib.com сделать там шпору в конструкторе (да он карявый, но на первое время пойдет) скачать в корень sd карты телефона, или в папку mistercrib.com (появится после первого запуска программы). Затем запустите программу, выберите шпору из списка и списывайте. Если палево, жмите кнопку с глазом и кран станет черным(светиться не перестанет, с апдейтами исправлю, короче не сдавайте экзамены в темноте пока что). Чтобы вернуться к работе задержите палец на экране, или нажмите кнопку back. Вот пожалуй и все. Ссылкота

ПС Ставь & тыкай рекламу = принеси мне три цента

среда, 9 марта 2011 г.

DroidDraw - редактор интерфейсов для Android


Нашел в интернетах действительно удобный редактор для прототипирования интерфейсов Android приложений - http://www.droiddraw.org/. Он выполнен ввиде Java апплета, но имеет standalone версию для windows, linux, osx. Начинающим оно позволит так-же изучить язык разметки интерфейсов, он довольно неоднозначен, потому эта вещь мне здорово помогла в разработке моего первого приложения для Android, о котором я позже напишу.

пятница, 28 января 2011 г.

Виджет ip-score.com


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

Сайт, частью которого является виджет предназначен для определения реальных данных пользователя, использующего прокси. Со временем и с развитием нашего web api данное решение должно превратиться в полноценную antifraud систему, которая будет полезна владельцам интернет магазинов, и многим другим, но я пока не придумал кому.

Думаю в следующих постах немного приоткрою кишки того, к чему я был причастен, а именно кое-что на Java и ActionScript.

суббота, 16 октября 2010 г.



Google Code-in — это соревнование для молодых людей 13-18 лет, целью которого является вовлечение участников в мир разработки открытого программного обеспечения. Проект рассчитан на учеников средних и старших классов. Задания юным программистам будут давать крупные open source-организации. Такими заданиями могут быть: кодирование/рефакторинг, документирование, маркетинг, тестирование, перевод и так далее. За одно выполненное задание участнику будет выдаваться футболка, за каждые три — 100$. Десять лучших конкурсантов получат возможность побывать в главном офисе Google. Соревнование начнётся 22-ого ноября 2010 года в 08:00 UTC и закончится 10-ого января 2011 в 08:00 UTC. Участвующие компании будут объявлены 5-ого ноября, а победители 14-ого февраля 2011 года.


Стоит отметить, что участник не может выполнять несколько заданий одновременно, но ему разрешается пользоваться помощью всевозможных сообществ. Максимальный денежный приз составляет 500$ (15 заданий). Все выигравшие конкурсанты должны будут подтвердить, что они являются школьниками, а так же предоставить разрешение на участие от родителей.

Подробнее о соревновании расскажет FAQ
Google Code-in

Требуется знание английского языка

Источник

пятница, 15 октября 2010 г.

Перебор IP ver4 адресов C#

Возникла такая задача, привычным движением руки взял и загуглил, может я еще плохо искать умею. но… не нашел, тот кровавый ###### который советуют люди на различных форумах заставил меня лить горючие слёзы. Пришлось делать все самому.


Нужно игнорировать советы вроде «Работай как со строкой», так как IP адрес — не строка, и выглядит так, как выглядит только по одной причине — читабельность.

IPv4 адрес — набор из 32х бит. Подробнее можно узнать в википедии.

Функция свертывания массива байтов в четырехбайтное целое.


        private int CompressByteArray(byte[] bytes)
        {
            /*Проверяем является ли массив подходящим для свертывания в int*/
            if (bytes.Length != 4) throw new FormatException("Wrong IPv4 address");
            int retval = 0; byte bit_shift = 0;
            for (int i = bytes.Length - 1; i >= 0; i--)
            {
                /*Прибавляем к финальному значению байты со сдвигом,
                  зависящим от текущего элемента массива*/

                retval += ((int)bytes[i]) << bit_shift;
                bit_shift += 8;
            }
            return retval;
        }
       


Этот и весь следующий код предназначен исключительно для ipv4, не было желания мучить себя хранением 128 битовых адресов, по крайней мере в этот раз.

Функция развертывания целого числа в массив байтов.


        private byte[] DecompressByteArray(int ip)
        {
            //Разбиваем целое число на байты          
            var bytes = BitConverter.GetBytes(ip);  
            //Разворачиваем в нужную последовательность    
            Array.Reverse(bytes);
            return bytes;
        }
       


Ну и наконец та функция, которая и будет выводить список всех адресов диапазона.


        public IPAddress[] ExpandIpRange(IPAddress RangeFirst, IPAddress RangeLast)
        {
            /*Сворачиваем байты адреса в целое число*/
            var start_ip = (uint)(CompressByteArray(RangeFirst.GetAddressBytes()));
            /*Расчитываем дельту адресов(можно простым вычитанием, но xor логичнее и быстрее)*/
            var delta = (uint)(CompressByteArray(RangeLast.GetAddressBytes()) ^ start_ip);
            IPAddress[] retval = new IPAddress[delta];
            /*Создаем список адресов диапазона
              перебор осуществляется простым приращением*/

            for (uint i = 0; i <= delta; i++)  
                /*Разворачиваем число в массив байтов
                  Создаем экземпляр Ip адреса и передаем массив в конструктор
                  Добавляем адрес в список*/

                try { retval[i] = new IPAddress(DecompressByteArray((int)(start_ip + i))); }
                catch { continue; }
            return retval;
        }
       


Использование. Предположим, что у нас консольное приложение, функции описанные выше можно добавить сразу перед/после main.


        static void Main(string[] args)
        {
            IPAddress addr = new IPAddress(new byte[] { 17, 0, 0, 1 });
            IPAddress addr2 = new IPAddress(new byte[] { 17, 0, 2, 125 });
            var t = new TestovyPoligon.Program();
            var ips = t.ExpandIpRange(addr, addr2);
            foreach (var ip in ips)
                Console.WriteLine(ip.ToString());
        }
       

______________________
Текст подготовлен в Редакторе Блогов от © SoftCoder.ru

вторник, 21 сентября 2010 г.

Золотая сервировка, C# и методы расширения

Привет тебе, некто, вот и минуло полтора года со дня моего последнего поста. Что я делал? Работал. Я точно знаю, что тебе плевать, но раз уж читаешь, то читай. Блог, куда я переезжал благополучно умер и я решил вернуться в уютненький гуглосервис. Нужно было что-то написать, что-бы окончательно оформить возвращение. Что? Кто знает, в голову програмистского ничего не идет, написал о том, что лежало на поверхности, о том, что я каждодневно использую в работе — о синтаксических подсластителях, которые сделали мой код красивее и моднее. Почему меня больше волнует красота? Вот почему: память в основном ест графика(wpf), время по большей части на общение с сервером, так почему бы не сделать свою работу приятнее? Вот и сделал, на авторство первого не претендую, на оригинальность остального тем более, просто уж очень хотелось написать.


Цикл с известным числом повторений (найдено вконтакте)
public static class Extensions
{
    public static void Times(this int subj, Action<int> obj)
    {
        if(obj!=null)
            for (int i = 0; i < subj; i++)
                obj(i);
    }
}

Применение:
5.Times(x =>
{
    Console.WriteLine(x);/*x позволяет получить доступ к текущему значению итератора*/
});
 


Сокращенный вызов String.Format
public static string FormatFor(this string subj, params object[] obj)
{
    return string.Format(subj, obj);
}

Применение:
"Привет {0}, у меня есть {1} штук".FormatFor("Stranger", 8);


Добавление элемента в коллекцию с проверкой его уникальности для коллекции (List)
public static void AddUnique<T>(this List<T> subj, T obj)
{
    if (!subj.Contains(obj)) lock(subj)subj.Add(obj);
}

Применение:
List<int> l = new List<int>();
l.AddUnique(5);//Добавит 5 в коллекцию, если та не содержит 5


Наукообразный вынос мозга, смысл не ясен, но можно извлечь пользу
namespace myBrainFuck
{
    public static class TrollExtensions
    {
          public static void ExecAction<T>(this T subj, Action<T> action)
          {
               if(action!=null)action(subj);
          }
    }
}

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

Применение:
new char[] { 'a', 'b', 'c' }.ExecAction(x =>
{
    for (int i = 0; i < x.Length; i++)                
        Console.WriteLine(x[i]);                
});

воскресенье, 25 января 2009 г.

SQL Server Compact 3.5 + LinqToSql

Суть проблемы:
  Мост Linq to SQL имеет поддержку SQL Server CE но напрямую из Visual Studio подключение невозможно, появляется сообщение типа: "Данный тип БД не поддерживается"

Решение:
  Данная неприятность заставляет искать обходные пути, которые, в свою очередь являют собой не самый прямой путь к цели, итак-
1) Создаем базу в SQL Server Compact. Это можно сделать напрямую из окна Server Explorer(Обозреватель серверов) в Visual Studio, и заполнить базу таблицами и связями (если таковые необходимы) между ними, данную операцию можно провести как из Server Explorer, так и с помощью SQL Sever Management Studio (Она бесплатна, ссылки есть в гугле).
2) Тут нам придется обратиться к консоли. Открываем Visual Studio Command Prompt и идем в папку с базой, например E:\ cd e:\data\compact . Вводим комманду sqlmetal чтобы посмотреть на список параметров, если вам на это плевать то сразу вводим следующее sqlmetal /dbml:YourWordDataContext.dbml yourbase.sdf после чего в папке с базой появится файл yourworddatacontext.dbml . Также sqlmetal способен из полученного файла сгенерировать исходный код, но так как мы используем VisualStudio, то необходимости такой не имеем.
3) Суем ручки туда, куда микрософт не рекомендует. Открываем наш проект, требующий базу, и добавляем к нему с помощью команды Add existing item наш файл. И замечаем что студия сама без лишних разговоров генерирует исходный код для контекста данных (именно поэтому мы не стали генерировать его в sqlmetal). Добавляем в проэкт файл базы, отказываемся от создания DataSet, хотя я лично не отказывался, а просто потом удалил его в Solution Explorer'е. Собираем проект, чтобы Visual Studio блестнула своим AI и добавила  ConnectionString в настройки проекта. И вот тут, дабы привести внешний вид кода, который мы будем писать к виду кода из учебников, мы делаем идем на тёмную сторону: лезем в Solution explorer и щелкаем по + рядом с нашим dbml файлом, чтобы явить на свет божий файл с названием YourWordDataContext.designer.cs  ищем там строки типа :

   public YouкStuffDataContext(string connection) : 
base(connection, mappingSource)
{
OnCreated();
}
public YourStuffDataContext(System.Data.IDbConnection connection) : 
base(connection, mappingSource)
{
OnCreated();
}

И вписываем туда вот такое:

         public YourStuffDataContext() :  base(global::YourApp.Properties.Settings.Default.YourStuffDataContextConnectionString, mappingSource)
        {
            OnCreated();
        }

И все! Дале мы спокойно пишем свой код, забыв, что используем официально не поддерживаемый дизайнером студии "сервер БД"

ЗЫ Рекомендации микрософта соблюдать все таки стоит