Есть код javascript
и php
echo "
закрыть
Пример модального окна c id ".$row['id']."
";
echo "
";
В php формируется id='applicationModal1', id='applicationModal2' и таких блоков много. Как обозначить в коде javascript переменную цифру? Код из браузера. Все блоки идентичны только меняется конечная цифра в id
закрыть
Пример модального окна c id 8
|
Ответ
Привязывать одно и тоже событие к пачке разных элементов по ID - не лучшее решение. Если у вас несколько элементов должны вести себя одинаково - у них должен быть одинаковый класс (например, modal-trigger). Проставьте его всем элементам. Потом проставьте им разный data-аттрибут с индексом модального окна (например, data-modal-number). И навесьте на всех их один обработчик:
$(function(){
$(".modal-trigger").click(function(){
// this в этом обработчике - это элемент, на который кликнули
var modalNumber = $(this).data("modal-number");
alert(modalNumber);
$("#applicationModal" + modalNumber).arcticmodal();
});
});
show modal 1
show modal 2
По хорошему и поиск applicationModalX по id стоит убрать, но это уже на ваше усмотрение.
Нужно выбрать те span на странице, которые не являются потомками заголовков (h1 - h6). Есть много селекторов для потомков, но вот селектора, который бы проверял принадлежность родителю, я, увы, не нашел. Пример: one
HEY
two
HEY2
three
Нужно выбрать span'ы за исключением тех, что в h2 и h3
Ответ
Выбираем все на странице.
Для каждого пробегаемся по всем его родителям вплоть до document (можно было и только до ).
Проверяем имя тега каждого родителя. Если оно входит в - , то отбрасываем этот
Все оставшиеся считаются результатом.
document.addEventListener('DOMContentLoaded', onDomReady);
function onDomReady() {
var allSpans = document.getElementsByTagName('span');
var resultSpans = [];
var regExp = /^H\d$/i;
for (var i = 0; i < allSpans.length; i++) {
var parent = allSpans[i].parentNode;
while (parent != document) {
if (regExp.test(parent.tagName)) {
break;
}
parent = parent.parentNode;
}
if (parent == document) {
resultSpans.push(allSpans[i]);
}
}
for (var i = 0; i < resultSpans.length; i++) {
resultSpans[i].style.color = 'red';
}
};
not in hX
simple
not in hX, but in div
То же самое с jQuery (если кому-то понадобится):
$(document).ready(function() {
var headers = [];
for (var i = 0; i <= 9; i++) {
headers.push('h' + i);
}
var headersSelector = headers.join(',');
var $resultSpans = $('span').filter(function() {
return $(this).parents(headersSelector).length == 0;
});
$resultSpans.css('color', 'red');
});
not in hX
simple
not in hX
У меня есть двумерный массив булевых значений (bool[][]), и мне нужно записать этот массив в BMP. То есть, к примеру, есть такая матрица: [0 0 0 0 1]
[0 0 1 1 1]
[0 0 0 0 1]
[0 0 0 0 1]
[0 0 0 0 1]
и мне нужно каким-то образом получить из нее .bmp файл с изображением цифры "1". То бишь, true — черный пиксель, false — белый. Как можно это сделать в D?
Ответ
Для записи BMP можете воспользоваться, например, библиотекой arsd, из которой потребуется модули bmp и color import arsd.bmp, arsd.color; void main()
{
ubyte[][] image = [
[ 0, 0, 0, 0, 0, 0, 0, 1],
[ 0, 0, 0, 0, 0, 0, 1, 1],
[ 0, 0, 0, 0, 0, 1, 1, 1],
[ 0, 0, 0, 0, 1, 1, 1, 1],
[ 0, 0, 0, 1, 1, 1, 1, 1],
[ 0, 0, 1, 1, 1, 1, 1, 1],
[ 0, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1],
[ 0, 1, 0, 1, 0, 1, 0, 1],
]; auto col = [Color.black, Color.green]; auto w = image[0][].length;
auto h = image[].length; ubyte[] data; for (int j=0; j auto img = new TrueColorImage(w, h, data);
writeBmp(img, "result.bmp");
}
Разрабатываю приложение для Windows Phone системы, на странице имеется кнопка типа HyperlinkButton , при ее нажатии приложение переходит на определенный Url запуская стандартный браузер, после этого приложение закрывается, и нельзя вернуться в него нажав кнопку Back. Так же, при совершении данной операции через проект запущенный в VS 12 кнопка Back возвращает в приложение. Но если сделать те же действия в приложении запущенном не через VS(через это приложение задеплоиное на телефоне) то оно закрывается. В чем может быть причина? В каком направлении копать? Провел эксперимент с состояниями(suspending /resuming), только на этой станице где переход по Url осуществляется происходит такое, на других все работает нормально. При переходе в suspending все хорошо, как только делаю resuming - валится ошибка такая. A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in
WinRT information: GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate.
A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in
A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in mscorlib.ni.dll
A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in mscorlib.ni.dll
Ответ
В общем то немного покопав информации в интернетах нарыл такую вещь, что при переходе из одной страницы на другую( посредством Frame.Navigate) необходимо передавать в качестве параметра простейшие данные(строки, числа), большие объекты программа при сворачивании в стек не записывает, оттого и валится такая ошибка.
При авторизации через API ВКонтакте происходит переадресация на URL вида:
http://localhost:58821/Auth#access_token=123456712345123451234512345&expires_in=0&user_id=1234567
Обращение к Request.Url.AbsolutePath, Request.Url.AbsoluteUri или Request.RawUrl даёт только ссылку на хост. Как я могу получить параметры из данного URL?
Upd.: Вероятно проблема в том что адрес и get параметры разделяются символом '#', а не '?', поэтому параметры получить не получается. Можно ли как-то получить всю строку?
Ответ
Вы ошиблись при выборе типа авторизации - вам необходимо использовать авторизацию предназначенную не для мобильных приложений(клиентскую), а для сайтов(серверную). При этом, необходимо что бы ваш веб-сервер был доступен извне - если не по домену, то хотя бы по какому-то публичному ip. С localhost серверную авторизацию использовать не получится. Если бы это у вас был клиентский код, то можно было бы добавить себе в проект сборку System.Web и использовать код вроде такого: var uri = new Uri("http://localhost:58821/Auth#access_token=123&expires_in=0&user_id=456");
var fragment = uri.Fragment.TrimStart('#'); // access_token=123&expires_in=0&user_id=456
var access_token = HttpUtility.ParseQueryString(fragment).Get("access_token"); // 123
Однако у вас сайт на ASP.NET, и фрагмент(часть Uri начинающаяся с '#') из серверного кода вы не получите никак - клиентом он не передаётся. В вашем случае использовать авторизацию для мобильных устройств нельзя. Точнее конечно можно выпрашивать у пользователя их настоящие логин/пароль, передавать их вместо пользователя, авторизовывать своё приложение, да сохранять токен - но это плохо попахивает, и обязательно вызовет недоверие у пользователей.
Имеется изображение какой-либо музыкальной композиции. Требуется произвести распознавание знаков, однако мешают нотные линии. Поиск контуров посредством findContours() выделяет всё подряд так, что в итоге нотные знаки никак не разделяются. Как преодолеть?
Ответ
Можно использовать морфологические операции. У нотных линий имеется одно существенное отличие, которое позволяет отделить их от любых других объектов, - это их ширина. Она фактически приближается к ширине самого изображения. Этим и нужно воспользоваться. Но сначала необходимо произвести бинаризацию изображения: // Загружаем изображение.
cv::Mat src_mat = cv::imread("allegretto.png", cv::IMREAD_GRAYSCALE);
if(src_mat.empty()) return; // Собственно бинаризация.
cv::Mat bin_mat;
cv::threshold(src_mat, bin_mat, 0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
Флаг THRESH_BINARY_INV используется, чтобы поменять цвета переднего плана и фона. Знаки станут белыми, а фон - чёрным. Флаг THRESH_OTSU удобен тем, что автоматически подбирает порог для бинаризации. Получится вот такое изображение:
Теперь можно перейти к морфологии. Создаём матрицу структурного элемента с тем расчётом, чтобы по горизонтали оно сравнялось с половиной ширины исходного изображения. Применяем эрозию и дилатацию: cv::Mat hrz_krn_mat
= cv::getStructuringElement(cv::MORPH_RECT, cv::Size(bin_mat.cols/2,1)); cv::Mat hrz_mph_mat;
cv::morphologyEx(bin_mat, hrz_mph_mat, cv::MORPH_ERODE, hrz_krn_mat);
cv::morphologyEx(hrz_mph_mat, hrz_mph_mat, cv::MORPH_DILATE, hrz_krn_mat);
В принципе две последние строки можно заменить на использование флага MORPH_OPEN (операция открытия), которая выполнит тоже самое: вызовет сначала эрозию, а затем дилатацию: cv::Mat hrz_mph_mat;
cv::morphologyEx(bin_mat, hrz_mph_mat, cv::MORPH_OPEN, hrz_krn_mat);
В результате получится:
Фактически, получена маска нотных линий. Однако просто так нельзя её вычесть из исходного бинаризованного изображения. Если это осуществить, то поскольку каждая из линий лежит на множестве нотных знаков, последние отчасти потеряют свои пиксели и результат окажется далёким от желаемого. Необходимо получить маску нотных знаков таким образом, чтобы ликвидировать всякое присутствие нотоносца: cv::Mat vrt_krn_mat
= cv::getStructuringElement(cv::MORPH_RECT, cv::Size(1,3)); cv::Mat vrt_mph_mat;
cv::morphologyEx(bin_mat, vrt_mph_mat, cv::MORPH_OPEN, vrt_krn_mat);
Как хорошо заметно на следующем изображении, маска нотных знаков не содержит больших горизонтальных линий, но в то же время часть важных деталей исходного изображения также было потеряно:
Но теперь стало возможно создать маску нотных линий с разрезами в местах присутствия нотных знаков: cv::Mat sbt_mat;
cv::subtract(hrz_mph_mat, vrt_mph_mat, sbt_mat);
Остаётся лишь изъять маску нотных линий из исходного бинаризованного изображения: cv::Mat dst_mat = cv::Mat::zeros(bin_mat.size(), CV_8U);
bin_mat.copyTo(dst_mat, ~sbt_mat);
Теперь изображение можно пустить на вход findContours() с тем, чтобы получить контуры каждого из нотных знаков в отдельности.
Всем привет, есть такой вот роут public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("", new Route("{action}/{controller}", new MvcRouteHandler()));
routes.MapRoute(
name: "",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
}
в первом добавлении идет {action}/{controller}, а во втором наоборот {controller}/{action} вопрос в том, что при отправке запроса такого типа http://localhost:3373/home/index?Name=Vasya&Message=Gleb выдается ошибка, так как почему-то приложение использует роут №1, добавление во второй роутер слова Default дела не меняет, зато если удалить первый роут, тогда все работает отлично. Почему так и по по какому принципу он решает какой роут будет дефолтным если не указываются имена роутов ?
Ответ
Маршруты обрабатываются строго в порядке их добавления. Как только будет найден подходящий маршрут, он используется и дальнейший поиск подходящего маршрута не выполняется. Адрес http://localhost:3373/home/index содержит две секции, поэтому подходит под первый шаблон. Вы пишете:
добавление во второй роутер слова Default дела не меняет
Вы видимо вот об этой строчке: defaults: new { controller = "Home", action = "Index" }
Здесь слово defaults не означает что этот маршрут надо использовать как дефолтный, оно указывает какие значения подставить в переменные в шаблоне маршрута, если они вдруг пусты. То есть если вы используете только второй маршрут, то адрес
/ будет интерпретироваться как /Home/Index
/Home тоже будет интерпретироваться как /Home/Index
То есть, если в маршруте нет какой-то секции, будет использовано указанное вами дефолтное значение для этой секции. В вашем случае адрес home/index подходит уже под первый ваш маршрут, поэтому до анализа второго маршрута дело даже не доходит.
Использую этот код, и получается такая картинка:
private void GrdidGenerate() {
for (int i = 0; i < LevelGrid[pos]; i++) {
TableRow tableRow = new TableRow(this);
tableRow.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
for (int j = 0; j < LevelGrid[pos]; j++) {
ImageView imageView = new ImageView(this);
TableRow.LayoutParams params = new TableRow.LayoutParams(100 / LevelGrid[pos],
100 / LevelGrid[pos], 1);
params.setMargins(5, 5, 5, 5);
imageView.setLayoutParams(params);
imageView.setImageResource(R.drawable.abc_btn_radio_material);
imageView.setBackgroundColor(Color.rgb(r, g, b));
imageView.setAdjustViewBounds(true);
tableRow.addView(imageView, j);
}
grid.addView(tableRow, i);
}
}
Как сделать так, чтобы колонки растягивались на всю длину и не вылезали за поля?
Ответ
Решил проблему, так: TableRow.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT, 1);
Код функции main. LPCWSTR path = (LPCWSTR)"F:\\Test\\";
HANDLE hDir;
hDir = FindFirstChangeNotification((LPCWSTR)"F:\\Test\\", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME);
if (hDir == INVALID_HANDLE_VALUE)
{
//std::cout << "Handle: 0x" << hDir << " " << path;
ErrorExit(TEXT("Operation"));
}
ErrorExit(TEXT("Operation")) - обработчик функции GetLastError(), которая выдает ошибку с кодом 2. Хэндл при выводе равен 0xffffffff Во всех примерах первый параметр функции FindFirstChangeNotification указан без приведения к LPCWSTR Но у меня в VS2015 без приведения ругается именно на это место, говоря о том, что необходим лонг поинтер, который я собственно и ставлю. Не понимаю, в чем проблема. Помогите разобраться.
Ответ
Правильно будет написать LPCWSTR path = TEXT( "F:\\Test\\" );
тем более, что вы уже используете этот макрос в тексте программы.
Есть 2 списка in1 = [23,55,0]
in2 = [100]
Нужно во второй список добавить в начало списка столько нулей, чтобы количество элементов в обоих списках стало одинаковым. К сожалению, стандартная библиотека дает возможность добавлять элементы только в конец.
Ответ
"стандартная библиотека дает возможность добавлять элементы только в конец" - это не так. list.insert() позволяет добавлять элементы в произвольные позиции.
Поставлена задача, с веб-сервиса вытащить JSON-массив, а затем его обработать.
По идее, технология Rest, должна выводить в браузере String, но этого не происходит. Вопросы: Неправильная конфигурация в RequestMapping или в теле метода нужно еще что-то прописать? В чем моя недоработка? Вот вариант кода: import com.squareup.okhttp.OkHttpClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; @RestController public class Places {
/*OkHttpClient client = new OkHttpClient();
String a;*/ @RequestMapping(value = "https://api.parse.com/1/classes/Place", method = RequestMethod.GET, headers = {"Content-Type = application/json", "X-Parse-Application-Id = /*my app-id*/", "X-Parse-REST-API-Key = /*my app-secret*/"})
public String getting(){
/*Request request = new Request.Builder()
.url("https://api.parse.com/1/classes/Place")
.addHeader("Content-Type", "application/json")
.addHeader("X-Parse-Application-Id", "app-id")
.addHeader("X-Parse-REST-API-Key", "app-secret")
.build(); Response response = client.newCall(request).execute();
a = response.body().string(); return a;*/
return "getting";
}
}
Ответ
Аннотация @RequestMapping говорит Spring-у, что отмеченный ей метод будет обрабатывать HTTP запрос от внешнего клиента. У вас же в этой аннотации указаны параметры чужого сервера и заголовки, как будто вы подразумевали подключение вашего сервера к другому серверу по HTTP. Поле value должно указывать относительный путь на вашем сервере, который будет обрабатываться этим методом. В поле headers указываются названия заголовков (без значений), которые должны присутствовать, чтобы запрос был обработан. Сами значения можно передать в метод параметром с аннотацией @RequestHeader Для примера посмотрим на фрагмент кода: @RestController
public class Places { @RequestMapping(value = "/classes/Place", method = RequestMethod.GET, headers = {"X-Parse-Application-Id", "X-Parse-REST-API-Key"})
public String getting(@RequestHeader("id") String id, @RequestHeader("key") String key){ return "getting";
}
}
Объявлен контроллер Places c одним методом getting(). Этот метод будет вызван, если пользователь обратится HTTP-методом GET по URL вида http://ваш_сервер/ваш_путь_развертывания/classes/Place и при этом передаст HTTP заголовки X-Parse-Application-Id и X-Parse-REST-API-Key.
Если вы хотите из Spring MVC приложения подключиться к другому REST-сервису посмотрите на RestTemplate. Для вашего случая это будет выглядеть как-то так: RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders();
headers.set("X-Parse-Application-Id", myAppId);
headers.set("X-Parse-REST-API-Key", myAppSecret);
HttpEntity entity = new HttpEntity("", headers); ResponseEntity result = restTemplate.exchange("https://api.parse.com/1/classes/Place", HttpMethod.GET, entity, String.class);
Добрый день! Разбираюсь в Swift, по официальной книге Apple.
В главе про функции наткнулся на пример, который не работает: func alignRight(var string: String, count: Int, pad: Character) -> String {
let amountToPad = count - count(string)
if amountToPad < 1 {
return string
}
let padString = String(pad)
for _ in 1...amountToPad {
string = padString + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
Если вставить этот код в playground выдает ошибку:
Что делать?
Ответ
Ошибка исчезает при такой записи: let amountToPad = count - Swift.count(string)
(из комментария pavelip)
Так же помогает переименовать переменную count во что-то другое, например, _count: func alignRight(var string: String, _сount: Int, pad: Character) -> String {
let amountToPad = _сount - count(string)
Очевидно, это происходило из-за конфликта названия переменной с названием функции.
Использую vagrant. Ност: MacOS, гость: debian. На виртуальной машине установлен nginx 1.8. После изменения статического файла (css или js) nginx отдает старый файл с добавленными какими-то символами. Выглядит в браузере как-то так:
Пробовал изменять настройки nginx. sendfile, expires. Ничего не помогло. Выводил с помощью cat файл, выглядить вроде как нужно. Что бы хоть как то работать, удаляю файл. Запрашиваю его снова, возвращается 404-я. Добавляю файл обратно. Запрашиваю - файл возвращается корректным. Подскажите куда копать или как победить это.
Ответ
Решение нашел вот здесь ## Redirect everything that isn't a real file to index.php
location / {
try_files $uri $uri/ /index.php?$args;
sendfile off;
}
Имеем две модели Video и Picture. Как вывести на странице видео и картинки вперемешку, в одном списке, отсортировав их по дате?
Ответ
Если хотите хорошо и рельсово – готовьтесь к крупным изменениям. Я полагаю, что вы хотите достать их отсортированными средствами БД: так вы получаете целый ряд очень вкусных возможностей. Пытаться пользоваться для этого двумя разными таблицами – смертоубийство, ActiveRecord будет всеми силами противиться. Здесь я покажу два трюка: STI и render "неоднородной" коллекции. Из вышенаписанного напрашивается вывод: делать нужно одной таблицей. Это, впрочем, не означает, что модель должна быть одна. Добавив поле type (типа string) к своей таблице, вы получите очень занятное поведение – ActiveRecord будет в этом поле сохранять название класса модели, и при запросах будет его соблюдать. То есть, если у вас есть такие классы: class Media < ActiveRecord::Base
class Video < Media
class Photo < Media
Первый класс создаётся, как обычно – не забудьте только дать ему все поля, что есть и у Video, и у Photo. А класс Video можно сделать хоть руками – ему не нужна миграция. Но если пользоваться генератором, то так: rails g model Video --no-migration --parent Media
...то запрос на Media.all вовсе необязательно вернёт именно коллекцию объектов Media. Причём система будет следить, чтобы в поле type были только названия базового класса (который, собственно, владеет таблицей) и его наследников (непосредственных и не очень). Если туда вписать что-то неправильное, будет ошибка при попытке инстанцировать объект. А теперь самое вкусное. Сделав вышеобозначенные классы и убедившись, что они хранятся в одной и той же таблице (по генерируемым запросам), сделайте в контроллере это: @medias = Media.all # Потом вы это захотите разбить на страницы.
# Это можно. Потом.
Где-нибудь в виде выведите эту коллекцию следующим образом: render @medias # Ну, а как ещё...
...добавьте partial'ы, которые он будет просить в сообщениях об ошибках и возрадуйтесь
Например в случае большого SFX-архива, до нескольких гигабайт, логично загрузить только исполняемый код распаковщика, а сам архив оставить на диске. И потом спокойно его распаковывать. Если да, то как это сделать средствами Visual Studio? Как это вообще делается в случае SFX?
Ответ
Часто делают так. Создается EXE без дополнительных данных, а потом к нему дописывается "архив", при этом параметры секций не меняются. Загрузчик в память загрузит только сам EXE, оверлей не будет загружен, поскольку он не в секции.
Запущенный EXE делает, к примеру, GetModuleHandle(NULL), получает адрес своего заголовка в памяти, парсит таблицу секций и узнает файловое смещение конца последней секции. Ровно за ним - оверлей с "архивом", который он может читать как ему угодно.
Вариант номер два: после сборки в неиспользуемые поля заголовка вносится размер EXE, и запущеный процесс читает оттуда смещение до оверлея.
Здравствуйте! Есть элемент table, в строчках которого может быть некоторое число ячеек. Может быть 3 ячейки, может быть 5 или 10, но в разных строчках обязательно одинаковое количество. Ну то есть представляем нормальную, человеческую таблицу, как в экселе. Как мне сделать через css так, чтобы:
У таблички была некоторая фиксированная ширина, скажем 700px;
У каждой колонки была некоторая фиксированная ширина, скажем 300px;
Если суммарная ширина ячеек больше чем ширина таблицы, то должен появляться горизонтальный скролл. Собственно это у меня никак не получается: пока ширина колонок равномерно сокращается если превышает ширину таблицы, выставление свойства overflow не помогает
Иллюстрация к тому, что я хочу: http://jsfiddle.net/yt6169s1/
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
.table-wrapper {
width: 700px;
} .mytable {
border-collapse: collapse;
overflow: auto;
} .mytd {
width: 300px;
border: 1px solid black;
}
Соответственно я хочу чтобы на примере по ссылке было видно только 1ю, 2ю колонки шириной 300px и часть 3й шириной 100px, а остальные прокручивались. Я могу сделать это только через css, не применяя javascript и не меняя таблицу на структуру из дивов? Совместимость со всяким старьем необязательна. Попробую переформулировать еще получше:
Мне нужна некоторая область ограниченной ширины (скажем 700 px) в которую будет влезать несколько колонок фиксированной ширины (т.е. ширина колонок точно такая какую я указал, сказал 200px у каждой колонки - и будет честных 200px у каждой колонки). И если колонок больше чем надо (скажем 5), то чтобы появлялся горизонтальный скролл. Другими словами мне надо примерно как здесь: http://jsfiddle.net/qr6e61bw/
только с таблицей а не с дивами
Ответ
В таблице пишешь table-layout: fixed. В этом режиме ширина таблицы не пересчитывается при изменении или вписывании в родительский регион, а имеющийся overflow: auto даст скроллбар снизу. Детали тут .mytable {
border-collapse: collapse;
overflow: auto;
table-layout: fixed;
}
Адпейт: Причина оказалась в другом - атрибут width в колонке устанавливает максимальную ширину колонки, причем минимальная ширина ограничена элементами внутри колонки. В данном случае в колонках по одному символу, и минимальная ширина оказывается недостаточной для появления скролла. Лечится прописыванием min-width в стиль mytd .mytd {
min-width: 300px;
border: 1px solid black;
}
Для задания точной ширины колонки желательно использовать max-width или width вместе с min-width.
Например, есть такой git-alias. [alias]
root = "!pwd"
Его можно использовать в shell-скрипте: echo `git root`
Я бы хотел выполнять его "от имени Git", но не регистрируя alias. Как-то так: echo `git run "pwd"`
Возможно ли это?
Ответ
Это возможно с использованием параметра git -c. Перевод из man git
-c <имя>=<значение>
Передает команде параметр конфигурации. Предоставленное значение будет использовано вместо значения, имеющегося в файлах конфигурации (но никаких постоянных изменений конфигурации не произойдет). Требуется, чтобы <имя> было указано в том же формате, как и в конфигурационных файлах (вложенные ключи разделяются точками: foo.bar)
Обратите внимание, что знак = можно не использовать (git -c foo.bar ...). В таком случае значение переменной будет установлено в логическое true. Если указать = без значения (git -c foo.bar= ...), то переменной будет присвоено значение пустой строки.
Решение:
echo `git root`
например, так: $ cd /tmp;
$ echo $(git -c alias.root='!pwd' root)
/tmp
обновление
echo `git run "pwd"`
можно, например, так: echo $(git -c alias.run='!$1' run "pwd")
к слову конструкция $(команда)
как замена `команда`
прописана в posix и потому является полностью переносимой, а ввиду её очевидного удобства (при вложенном использовании), имеет смысл именно ею и пользоваться.
Нужно померить время выполнения методов. написать так: Stopwatch.Start();
Method();
Stopwatch.Stop();
не проблема. Но возникает вопрос: можно сделать разумное логирование например так: using(MyCustomProfiler p = new MyCustomProfiler())
{ Method();
Method2();
////////
MethodN();
}
И что бы логировался каждый метод внутри using Может кто то знает элегантные решения, вместо использования ContextBoundObject, IContextProperty, IContributeServerContextSink, IMessageSink Если вдруг есть еще способ логировать вызовы внутренних вызовов методов, то это будет шикарно. Нужно написать решение (код), а не использовать профайлер. StackTrace и StackFrame тоже не очень подходят.
Ответ
В .NET можно использовать Profiling API.
И, возможно, что CLR выводит информацию о вызовах в ETW (Event Tracing for Windows).
В nuget-пакете Microsoft.Diagnostics.Tracing.TraceEvent есть классы для работы с ETW.
|