Ważne są tylko te dni, których jeszcze nie znamy.
Ważne są wszystkie dni, które przeżywamy razem.
Ważne są tylko te dni, których jeszcze nie znamy.
Ważne są wszystkie dni, które przeżywamy razem.
Windows Vista udziwnił troszeczkę konstrukcję okna wprowadzając półprzezroczystą część nazywaną Glass (szkło). Jest to ewidentnie wodotrysk i trochę dziwi mnie, dlaczego wprowadzono do API funkcje, które mogą okazać się tylko chwilową modą, która zniknie wraz z nastepną wersją systemu.
No dobrze, w Windows 7 dalej będzie ten wodotrysk, więc skoro już jest, to warto może spróbować go użyć (byle nie nadużyć). Nie oszukujmy się – ludzie lubią wodotryski.
WPF nie daje bezpośredniej możliwości operowania na szkle – potrzebujemy wywołać funkcję API DwmExtendFrameIntoClientArea przyjmującą jako argument uchwyt okna i strukturę MARGINS. A może by tak postarać się trochę i utworzyć DependencyProperty - animowalną, bindowalną i elegancką (na tyle, na ile DependencyProperty można nazywać elegancką) właściwość pozwalającą regulować szklany obszar okna?
Proponuję zrobić to tak:
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
namespace WpfExperiments
{
public class GlassWindow : Window
{
struct MARGINS
{
public MARGINS(Thickness t)
{
Left = (int)t.Left;
Right = (int)t.Right;
Top = (int)t.Top;
Bottom = (int)t.Bottom;
}
public int Left;
public int Right;
public int Top;
public int Bottom;
}
[DllImport("dwmapi.dll", PreserveSig = false)]
static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
[DllImport("dwmapi.dll", PreserveSig = false)]
static extern bool DwmIsCompositionEnabled();
public Thickness GlassFrame
{
get { return (Thickness)GetValue(GlassFrameProperty); }
set { SetValue(GlassFrameProperty, value); }
}
public static readonly DependencyProperty GlassFrameProperty =
DependencyProperty.Register("GlassFrame", typeof(Thickness), typeof(GlassWindow), new UIPropertyMetadata(new Thickness(0, 0, 0, 0), new PropertyChangedCallback(GlassFrameChangedProperty)));
private static void GlassFrameChangedProperty(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UpdateGlassFrame((Window)d, (Thickness)e.NewValue);
}
private static void UpdateGlassFrame(Window win, Thickness t)
{
if (!DwmIsCompositionEnabled())
{
return;
}
IntPtr hwnd = new WindowInteropHelper(win).Handle;
if (hwnd == IntPtr.Zero)
{
return;
}
win.Background = Brushes.Transparent;
HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
MARGINS margins = new MARGINS(t);
DwmExtendFrameIntoClientArea(hwnd, ref margins);
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
UpdateGlassFrame(this, GlassFrame);
}
}
}
Teraz – zamiast tworzyć okna na bazie klasy Window, możemy użyć klasy GlassWindow posiadającej właściwość GlassFrame typu Thickness, którą możemy się posługiwać jak każdą inną DependencyProperty.
Ustawiając dodatnie wartości dla GlassFrame, możemy regulować grubość szklaj ramki. Jeśli ustawimy wartości ujemne – całe okno zrobi się szklane.
W ramach eksperymentów z LINQ, trochę z WPF, napisałem programik do wyznaczania modelu regresji liniowej. Program wczytuje dane empiryczne z pliku CSV (w pierwszej kolumnie powinny być wartości zmiennej objaśnianej, w następnych – objaśniających; powinno być przynajmniej 10 wierszy), następnie dobiera zmienne metodą Bartosiewicz (grafową) aby na końcu wypluć równanie modelu.
Może się przyda jakiemuś studentowi na zaliczenie… Zwłaszcza, że utwór przekazuję do domeny publicznej.
PS: Nie gwarantuję, że program działa w pełni poprawnie.
Ale grzechu nie ujrzałam, gdyż jestem przekonana, że nie ma on żadnej substancji ani cząstki bytu i nie sposób byłoby go rozpoznać, gdyby nie cierpienie, które powoduje. Zaś to cierpienie wydaje mi się czymś przejściowym, gdyż oczyszcza nas i sprawia, że poznajemy siebie i zaczynamy modlić się o miłosierdzie; gdyż Męka naszego Pana wspiera nas przeciwko temu wszystkiemu i taka jest Jego błogosławiona wola dla wszystkich, którzy będą zbawieni. On wspiera nas chętnie i słodko swymi słowami mówi: “jednak wszystko będzie dobrze i z urządzeniem wszystkiego będzie dobrze”. (…)
Musicie jednak uważnie posłuchać tego: rozmyślając o wszystkich tych rzeczach w ogólności, pełna smutku i żalu, tak powiedziałam w umyśle do naszego Pana z wielką czcią: “O mój dobry Panie, jak wszystko może być dobrze, skoro tak wielką szkodę wyrządził rodzajowi ludzkiemu grzech?” I prosiłam, na tyle, na ile śmiałam, o jakieś wyraźniejsze wyjaśnienie, aby uspokoić umysł. A nasz błogosławiony Pan odpowiedział z ogromną miłością i bardzo przyjaźnie i pokazał mi, że grzech Adama był największą szkodą, jaka kiedykolwiek została wyrządzona i wyrządzona będzie, aż do końca świata; objawił mi także, że tak głosi się o tym wszem i wobec w całym Świętym Kościele na ziemi. Następnie pouczył mnie, że powinnam rozważyć chwalebne zadośćuczynienie; gdyż to zadośćuczynienie sprawi Bogu nieporównanie większą radość i jest bardziej chwalebne w zbawieniu rodzaju ludzkiego, niż cała wyrządzona przez grzech Adama szkoda.
A zatem nauczanie naszego błogosławionego Pana oznacza, że powinniśmy rozważyć następujące słowa: “skoro obróciłem największą szkodę w dobro, jest moją wolą, abyście z tego wiedzieli, że potrafię także mniejsze zło obrócić w dobro”. (…)
A zatem nasz dobry Pan odpowiedział na wszystkie moje pytanie i wątpliwości, jakie mogłabym mu przedłożyć i w słowach pełnych pocieszenia tak powiedział:
“Uczynię wszystko dobrze,
sprawię, że wszystko będzie dobrze,
mogę uczynić wszystko dobrze
i umiem uczynić wszystko dobrze,
i ujrzysz sama, że wszystko będzie dobrze”.
Św. Juliana z Norwich.
Wśród młodych użytkowników Internetu rozpowszechnił się szkodliwy mem pisania w NiEcZyTelNy sPosooP. Irytuje to praktycznie wszystkich – prócz tych, którzy tak piszą. Czy możemy coś na to poradzić? Oprócz ciągłego krytykowania? Ależ tak. Mem jest bardzo prymitywny, stąd da się zwalczyć równie prymitywnym algorytmem.
Zastanówmy się chwilę, czym różni się normalny tekst od PoKeMoNoWeGo? Ilością wielkich liter. W normalnych tekstach, Wielkich liter jest relatywnie mało. Pokemony zaś piszą wielką mniej więcej co drugą, co trzecią literę. Jakiż problem policzyć?
Istnieje też mutacja memu pokemonowego, zwana l33t. Różnice są dwie:
W swoim comprendo.info zastosowałem funkcję walidacyjną, która stara się wyłapać ofiary obu wersji memu. Webmasterze! Użyj jej (lub podobnej) dla dobra Internetu!
function killPokemon($input)
{
$all = strlen($input);
$upper = 0;
$nonchar = 0;
for($i = 0; $i < $all; $i++)
{
//Spacje zignoruj.
if($input{i} == ' ')
{
$all--;
continue;
}
$u = strtoupper($input{$i});
$l = strtolower($input{$i});
//Znaki niebędące literami pozostaja niezmienione przez funkcje strupper i strlower.
if($u == $l)
{
$nonchar++;
}
//Litery niezmienione przez strtoupper są wielkie.
else if($input{$i} == $u)
{
$upper++;
}
}
//Zwróć true, jeśli tekst zachowuje normy ilości wielkich liter i znaczków.
//Progi dobrałem eksperymentalnie.
return ($upper/$all < 0.12) && ($nonchar/$all < 0.22);
}
Kod przekazuję do domeny publicznej. Można go dowolnie używać, nawet bez podawania autora.
Przypuszczam, że kod nie jest optymalny. Ale grunt, że działa.
PS: Mówią, że nawet sztuczna inteligencja nie pokona naturalnej głupoty. To prawda – np. ta funkcja radzi sobie z głupim sposobem pisania, ale wobec głupiej treści jest już bezradna.
W końcu pojawiło się coś, na co wielu czekało (tak długo, że pewnie już im się czekanie znudziło i nawet tu nie zajrzą). Blog {o}.
Jeśli ktoś się spodziewa, że wreszcie pozna sekret tożsamości administratora roswell.pl, to od razu informuję, że się zwiedzie. Poczytać tu będzie można trochę o projaktach, którymi się zajmuję, trochę przemyśleń. I nic więcej.