Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 452 сообщений
Cообщения с меткой

tags - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

[Перевод] GitHub ввёл теги для репозиториев

Среда, 01 Февраля 2017 г. 10:25 (ссылка)

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



image



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



image



При добавлении топика к открытому репозиторию будут предлагаться возможные варианты тегов. Эти предложенные варианты являются результатом машинного обучения и обработки естественного языка содержимого репозитория. Мы только в самом начале пути и если вы будете отвергать те топики, что вам не подходят (прим. пер.: рядом с тегом есть кнопка с указанием причины, почему не подходит), то это поможет нам обучить нашу модель выдавать более осмысленные результаты.



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

Original source: habrahabr.ru.

https://habrahabr.ru/post/320942/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Автоматизация поддержания соответствия между названиями слоев в редакторе и коде с помощью CodeDom

Суббота, 03 Сентября 2016 г. 11:46 (ссылка)

При работе с Unity очень часто приходится обращаться к сущностям Unity (слоям коллизий, сортировочным слоям, тэгам, осям ввода, сценам) по их названиям. Если какую-то из них, например, переименовать в редакторе, то нужно не забыть, соответственно, подправить название в коде, иначе нас ждет ошибка. И ошибка эта возникнет не при компиляции, а во время выполнения, непосредественно в момент обращения по имени. Немного автоматизации спасет от таких неприятных сюрпризов.



На первый взгляд, для решения этой проблемы логично использовать шаблоны T4, но они мне показались неудобными (по крайней мере, при использовании именно в Unity-проекте), поэтому я выбрал другой подход. Использование CodeDom для решения такой мелкой проблемы может показаться оверинжинирингом, но личный опыт доказал состоятельность этого подхода: я написал свой незамысловатый генератор кода больше года назад, и с тех пор, не внося в него изменения, успешно пользовался им, что сэкономило мне немало нервов и порядочно секунд времени.



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



Общий план действий таков:




  • Получить список названий слоев коллизий, имеющихся в проекте.

  • Сгенерировать сам код, содержащий класс с нужными константами.

  • Записать этот код в файл.

  • Побудить Unity немедленно скомпилировать добавленный/измененный файл.



Получаем список названий слоев коллизий



Тут все просто, если не бояться лезть в места, названные внутренними. Конкретнее, список имен слоев коллизий хранится как поле «внутреннего» класса.



        private static IEnumerable GetAllLayers()
{
return InternalEditorUtility.layers;
}


Генерируем сам код



У CodeGen слегка своя терминология (сравните, например, с терминологией в Roslyn), но, в целом, все соответствует синтаксическому дереву, присущему коду на C#. В порядке от корня к листьям, мы будем использовать следующее:




  1. CodeCompilationUnit — это сам генератор кода, который мы здесь, так сказать, конфигурируем.

  2. CodeNamespace — это пространство имен, в котором будет сидеть наш класс. Мы не будем оборачивать класс в явное пространство имен, но создать экземпляр CodeNamespace, все равно, придется.

  3. CodeTypeDeclaration — это сам класс.

  4. CodeMemberField — это член класса (в данном случае, объявление константы).

  5. CodePrimitiveExpression — это выражение с литералом (в данном случае, строка, который будет присваиваться константе).



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



private static CodeMemberField GenerateConstant(string name)
{
name = name.Replace(" ", "");

var @const = new CodeMemberField(
typeof(string),
name);

@const.Attributes &= ~MemberAttributes.AccessMask;
@const.Attributes &= ~MemberAttributes.ScopeMask;
@const.Attributes |= MemberAttributes.Public;
@const.Attributes |= MemberAttributes.Const;

@const.InitExpression = new CodePrimitiveExpression(name);
return @const;
}


Есть у CodeGen одно мелкое неудобство: он не умеет создавать статические классы. Связано это с тем, что он создавался на заре языка C#, когда в него еще не «завезли» статические классы. Будем выкручиваться: сымитируем статический класс запечатанным классом с приватным конструктором. Так поступали некоторые ранние пользователи C#, а использующие язык Java вынуждены и сейчас прибегать к этому.



private static void ImitateStaticClass(CodeTypeDeclaration type)
{
@type.TypeAttributes |= TypeAttributes.Sealed;

@type.Members.Add(new CodeConstructor {
Attributes = MemberAttributes.Private | MemberAttributes.Final
});
}


Наконец-то, соберем сам класс, с приватным конструктором и константами:



private static CodeCompileUnit GenerateClassWithConstants(
string name,
IEnumerable constants)
{
var compileUnit = new CodeCompileUnit();
var @namespace = new CodeNamespace();

var @class = new CodeTypeDeclaration(name);

ImitateStaticClass(@class);

foreach (var constantName in constants)
{
var @const = GenerateConstant(constantName);
@class.Members.Add(@const);
}

@namespace.Types.Add(@class);
compileUnit.Namespaces.Add(@namespace);

return compileUnit;
}


Записываем код в файл




private static void WriteIntoFile(string fullPath, CodeCompileUnit code)
{
Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
using (var stream = new StreamWriter(fullPath, append: false))
{
var writer = new IndentedTextWriter(stream);
using (var codeProvider = new CSharpCodeProvider())
{
codeProvider.GenerateCodeFromCompileUnit(code, writer, new CodeGeneratorOptions());
}
}
}


Заставляем Unity немедленно «осознать» изменения



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




[MenuItem("Habr/Generate layers constants")]
private static void GenerateAndForceImport()
{
const string path = @"Auto/Layers.cs";

var fullPath = Path.Combine(Application.dataPath, path);
var className = Path.GetFileNameWithoutExtension(fullPath);

var code = GenerateClassWithConstants(className, GetAllLayers());
WriteIntoFile(fullPath, code);

AssetDatabase.ImportAsset("Assets/" + path, ImportAssetOptions.ForceUpdate);
AssetDatabase.Refresh();
}


Результат



Собираем все воедино:



Итоговый код генератора

namespace Habr
{
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

internal static class HabrCodeGen
{
[MenuItem("Habr/Generate layers constants")]
private static void GenerateAndForceImport()
{
const string path = @"Auto/Layers.cs";

var fullPath = Path.Combine(Application.dataPath, path);
var className = Path.GetFileNameWithoutExtension(fullPath);

var code = GenerateClassWithConstants(className, GetAllLayers());
WriteIntoFile(fullPath, code);

AssetDatabase.ImportAsset("Assets/" + path, ImportAssetOptions.ForceUpdate);
AssetDatabase.Refresh();
}

private static CodeCompileUnit GenerateClassWithConstants(
string name,
IEnumerable constants)
{
var compileUnit = new CodeCompileUnit();
var @namespace = new CodeNamespace();

var @class = new CodeTypeDeclaration(name);

ImitateStaticClass(@class);

foreach (var constantName in constants)
{
var @const = GenerateConstant(constantName);
@class.Members.Add(@const);
}

@namespace.Types.Add(@class);
compileUnit.Namespaces.Add(@namespace);

return compileUnit;
}

private static CodeMemberField GenerateConstant(string name)
{
name = name.Replace(" ", "");

var @const = new CodeMemberField(
typeof(string),
name);

@const.Attributes &= ~MemberAttributes.AccessMask;
@const.Attributes &= ~MemberAttributes.ScopeMask;
@const.Attributes |= MemberAttributes.Public;
@const.Attributes |= MemberAttributes.Const;

@const.InitExpression = new CodePrimitiveExpression(name);
return @const;
}

private static IEnumerable GetAllLayers()
{
return InternalEditorUtility.layers;
}

private static void ImitateStaticClass(CodeTypeDeclaration type)
{
@type.TypeAttributes |= TypeAttributes.Sealed;

@type.Members.Add(new CodeConstructor {
Attributes = MemberAttributes.Private | MemberAttributes.Final
});
}

private static void WriteIntoFile(string fullPath, CodeCompileUnit code)
{
Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
using (var stream = new StreamWriter(fullPath, append: false))
{
var tw = new IndentedTextWriter(stream);
using (var codeProvider = new CSharpCodeProvider())
{
codeProvider.GenerateCodeFromCompileUnit(code, tw, new CodeGeneratorOptions());
}
}
}
}
}


Кладем нашу утилиту в папку Editor, нажимаем Habr -> Generate layers constants, получаем в проекте файл со следующим содержанием:




// ------------------------------------------------------------------------------
//
// This code was generated by a tool.
// Mono Runtime Version: 2.0.50727.1433
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//

// ------------------------------------------------------------------------------



public sealed class Layers {

public const string Default = "Default";

public const string TransparentFX = "TransparentFX";

public const string IgnoreRaycast = "IgnoreRaycast";

public const string Water = "Water";

public const string UI = "UI";

public const string Habr = "Habr";

private Layers() {
}
}


Дальнейшие действия



Полученной утилите не хватает следующих вещей:




  • Чуть более удобного интерфейса с чуть более гибкими настройками.

  • Устойчивости к невалидным в C# названиям.

  • Генерации аналогичным образом констант для названий сортировочных слоев, сцен, тэгов и осей ввода.



Чтобы не тратить время на написание своего «велосипеда», вы также можете воспользоваться моим «велосипедом».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/309128/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Rost

Как на ЛиРу управлять тегами сообщений в дневнике?

Понедельник, 11 Апреля 2016 г. 09:53 (ссылка)

Многие уверены, что по моим сообщениям можно полностью изучить ЛиРу. К моему большому сожалению, это - не так. Иначе бы сегодня вы не читали это дополнение в

Давным-давно, примерно в году эдак в 2003, на ЛиРу появились теги. Да-да. Изначально на ЛиРу тегов не было. Кстати, рубрики появились ещё позже. Какое-то время спустя появилось возможность управлять этими тегами. Когда это случилось? Когда появилось "новое оформление настроек" ЛиРу. Самое смешное, что примерно тогда же возможность управлять тегами появилась и в "старом оформлении настроек". Поскольку никто не знает, когда будет сделано подробное описание "нового оформления настроек" (а, главное, кем), решил написать это сообщение.

Кому интересно

Сохранить к себе в дневник
Метки:   Комментарии (31)КомментироватьВ цитатник или сообщество
NADEZDA13

Порция вдохновения!

Воскресенье, 13 Марта 2016 г. 18:19 (ссылка)

Настроение сейчас - Невозможно не восхищаться!

Наконец-то, к нам вернулась хорошая погода!
Просто цветы.....

и пусть весь мир подождёт...)....

367955_original (467x700, 277Kb)

Дни бегут...

8275733660_a8e70dbe5e_b (467x700, 176Kb)

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Maggan

BUSINESS CARDS, TAGS, LABELS DO OURSELVES.

Воскресенье, 29 Декабря 2014 г. 01:32 (ссылка)

Это цитата сообщения marisha54 Оригинальное сообщение

Визитки, бирки, ярлычки делаем сами.




 


Создание визитки. Просто, быстро, красиво!

Автор Катерина Легкова

МК ЗДЕСЬ http://www.livemaster.ru/topic/278565-sozdanie-vizitki-prosto-bystro-krasivo?





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

ЗДЕСЬ

http://alinmir.ru/post330299114/?upd


 




Текстильные бирки-визитки

МК ЗДЕСЬ

http://www.liveinternet.ru/users/asm/post244748478/





 


Как создать собственную этикетку 

Автор Надежда Максюкова

МК ЗДЕСЬ

http://www.livemaster.ru/topic/491821-kak-sozdat-sobstvennuyu-etiketku?





Изготовление тканевой этикетки. МК simple sveta

ЗДЕСЬ

http://www.livemaster.ru/topic/266435-izgotovlenie-tkanevoj-etiketki





Новогодние этикетки, наклейки, ярлычки

ЗДЕСЬ

http://www.liveinternet.ru/users/4163063/post301368593/#





Этикетка (бирка) для игрушки

Автор Alena Petsentiy

МК ЗДЕСЬ

http://www.livemaster.ru/topic/118106-etiketka-birka-dlya-igrushki









Мастер-класс: переносим изображение на ткань! Очень просто и экономно! 

Автор Надежда donna-kupidonna

МК ЗДЕСЬ

http://www.livemaster.ru/topic/337183-master-klass...ekonomno?vr=1&inside=0

 


 


 






Бирка для подарка.

МК ЗДЕСЬ    http://panamachka.ru/post285873432/?upd





Бирки, этикетки и ценники ...22 декупажные карты

ЗДЕСЬ

http://www.liveinternet.ru/users/merlettka/post330281138/#



Еще по теме:




Своя работа? Не стесняемся о ней сообщать! (О бирках и этикетках)

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<tags - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda