Si vous écoutez Radio Pirate, vous savez que Marto Napoli est rendu avec son émission sur les inter-web!

Je me cherchais une sonnerie de téléphone, j’ai donc fait un rapide mixage du maaahhheeeeuuuuuuuuu et de la 7e Symphonie de Beethoveen.

Je me permet de vous la partager!

Maheu-Symphony_No_7

C’est l’été au Québec, et avec l’été vient la pousse des végétaux!

Vous désirez vous débarrasser de la pelouse et des mauvaises herbes qui poussent entre vos dalles de patio? Ou encore simplement éliminer une partie de gazon? Tout ça sans dépenser une fortune? C’est tout à fait possible!

J’ai testé un produit populaire contre un produit d’épicerie.

PathClear et Vinaigre

À gauche, du vinaigre à marinade, environ 4.99$ le 4 litre dans les épiceries. À droite, le PathClear, vendu environ 29.99$ le 5 litre dans la plupart des magasins.

Pourquoi du vinaigre à marinade? Parce qu’il contient de l’acide acétique à 7%, c’est l’ingrédient actif du PathClear.

Vinaigre à marinade

PathClear

Le PathClear vient toujours avec un contenant qui permet de l’appliquer. Pour le vinaigre, une bouteille vaporisateur fait l’affaire.

Vaporisateur à vinaigre

J’ai localisé une zone de gazon que je voulais éliminer. J’ai arrosé environ la même quantité de chaque produit de chaque côté.

PathClear et Vinaigre, avant

Trois jours après, le résultat est très semblable.

PathClear et Vinaigre, après

Faites le calcul! Vous voulez plus d’argent et moins de mauvaise herbe ? Optez pour le vinaigre à marinade et un simple vaporisateur à 1$!

J’ai récemment eu besoin de convertir une partie de code XAML en C#. Il a fallu que j’effectue quelques recherches pour finalement réussir ma conversion à 100%.

Dans mon logiciel CIV j’utilise le composant WPF NotifyIcon de hardcodet.net.

Il arrive de temps en temps un plantage à cause de ce dernier. Si jamais l’application est lancé AVANT que Explorer soit créé, WPF NotifyIcon fait planté l’application. Comme c’est le parser XAML qui gère le code, c’est un peu difficile de gérer tout ça. Ma solution est de le gérer directement en C#.

Voici comment était déclaré le composant en XAML :

<tb:TaskbarIcon x:Name="MyNotifyIcon" IconSource="/CIV;component/Icons/Application.ico" ToolTipText="{Binding Source={StaticResource CIVRes},Path=Text.Dashboard_Title}" VerticalAlignment="Top"
                        DoubleClickCommand="{civ:DashboardShowCommand}"
                        DoubleClickCommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
            <tb:TaskbarIcon.TrayToolTip>
                <ToolTip>
                    <ToolTip.Style>
                        <Style TargetType="{x:Type ToolTip}" BasedOn="{x:Null}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="ToolTip">
                                        <ContentPresenter />
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ToolTip.Style>
                    <civ:QuickStats />
                </ToolTip>
            </tb:TaskbarIcon.TrayToolTip>
            <tb:TaskbarIcon.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="{Binding Source={StaticResource CIVRes},Path=Text.Dashboard_miExit}" Click="miExit_Click">
                        <MenuItem.Icon>
                            <Image Source="/CIV;component/Images/Exit.png" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" />
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </tb:TaskbarIcon.ContextMenu>
        </tb:TaskbarIcon>

Et l’équivalent en C# :

MyNotifyIcon = new TaskbarIcon()
	{
		Name = "MyNotifyIcon",
		VerticalAlignment = System.Windows.VerticalAlignment.Top,
		Icon = new System.Drawing.Icon(Application.GetResourceStream(new Uri("pack://application:,,,/CIV;component/Icons/Application.ico")).Stream),
		ContextMenu = new ContextMenu()
	};

MyNotifyIcon.SetBinding(Hardcodet.Wpf.TaskbarNotification.TaskbarIcon.ToolTipTextProperty,
						new Binding("Text.Dashboard_Title") { Source = new CIVResourceManager() });

// Menu
MenuItem menu = new MenuItem()
	{
		Icon = new Image()
		{
			Source = new BitmapImage(new Uri("pack://application:,,,/CIV;component/Images/Exit.png", UriKind.RelativeOrAbsolute)),
			HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
			VerticalAlignment = System.Windows.VerticalAlignment.Center,
			Stretch = Stretch.None
		}
	};
menu.Click += miExit_Click;
menu.SetBinding(MenuItem.HeaderProperty,
				new Binding("Text.Dashboard_miExit") { Source = new CIVResourceManager() });

MyNotifyIcon.ContextMenu.Items.Add(menu);

// Contenu
Style style = new Style(typeof(ToolTip), null);
style.Setters.Add(new Setter(ContentControl.TemplateProperty,
				  new ControlTemplate(typeof(ToolTip)) { VisualTree = new FrameworkElementFactory(typeof(ContentPresenter)) }));

ToolTip tip = new ToolTip()
	{
		Style = style,
		Content = new QuickStats()
	};

MyNotifyIcon.TrayToolTip = tip;

En espérant que cela peut vous aider à convertir votre XAML en C#.

 

WPF NotifyIcon

J’ai un problème de SPAM dans mon forum. Malgré le fait que reCaptcha est activé et que le compte doit être validé avec un courriel, j’ai une multitude d’inscriptions chaque jour.

La fonction de recherche dans le Délestage des utilisateurs est bien, mais il manque des champs qui permettent de localiser de manière plus efficace les bots.

En modifiant seulement deux fichiers, il est possible de faire des recherches dans de nouveaux champs.

Localisez le fichier adm\style\acp_prune_users.html
Ouvrez le dans un éditeur de texte.
Insérez le texte des lignes 5 à 20.

<dl>
<dt><label for="email">{L_EMAIL}:</label></dt> 
<dd><input id="email" name="email" type="text" /></dd> 
</dl> 
<dl>
<dt><label for="website">Site internet :</label></dt> 
<dd><input id="website" name="website" type="text" /></dd> 
</dl> 
<dl>
<dt><label for="user_sig">Signature :</label></dt> 
<dd><input id="user_sig" name="user_sig" type="text" /></dd> 
</dl> 
<dl>
<dt><label for="user_occ">Occupation :</label></dt> 
<dd><input id="user_occ" name="user_occ" type="text" /></dd> 
</dl> 
<dl>
<dt><label for="user_interests">Intérêts :</label></dt> 
<dd><input id="user_interests" name="user_interests" type="text" /></dd> 
</dl> 
<dl>
<dt><label for="joined">{L_JOINED}:</label>
<span>{L_JOINED_EXPLAIN}</span></dt> 
<dd>
<select name="joined_select">{S_JOINED_OPTIONS}</select>
 <input id="joined" name="joined" type="text" />
</dd> 
</dl>

Sauvegardez le fichier.
Localisez le fichier includes\acp\acp_prune.php
Ouvrez le dans un éditeur de texte.
Localiser la méthode confirm_box
Insérez le texte des lignes 8 à 11.

confirm_box(false, $user-&gt;lang['CONFIRM_OPERATION'], build_hidden_fields(array(
	'i'				=&gt; $id,
	'mode'			=&gt; $mode,
	'prune'			=&gt; 1,
	'users'			=&gt; utf8_normalize_nfc(request_var('users', '', true)),
	'username'		=&gt; utf8_normalize_nfc(request_var('username', '', true)),
	'email'			=&gt; request_var('email', ''),
	'website'		=&gt; request_var('website', ''),
	'user_sig'		=&gt; request_var('user_sig', ''),
	'user_occ'		=&gt; request_var('user_occ', ''),
	'user_interests'		=&gt; request_var('user_interests', ''),
	'joined_select'	=&gt; request_var('joined_select', ''),
	'joined'		=&gt; request_var('joined', ''),
	'active_select'	=&gt; request_var('active_select', ''),
	'active'		=&gt; request_var('active', ''),
	'count_select'	=&gt; request_var('count_select', ''),
	'count'			=&gt; request_var('count', ''),
	'deleteposts'	=&gt; request_var('deleteposts', 0),
	'action'		=&gt; request_var('action', ''),
)), 'confirm_body_prune.html');

Localisez la méthode function get_prune_users
Insérez le texte des lignes 17 à 18 et de 45 à 48.

function get_prune_users(&amp;$user_ids, &amp;$usernames)
{
	global $user, $db;

	$users = utf8_normalize_nfc(request_var('users', '', true));

	if ($users)
	{
		$users = explode("\n", $users);
		$where_sql = ' AND ' . $db-&gt;sql_in_set('username_clean', array_map('utf8_clean_string', $users));
	}
	else
	{
		$username = utf8_normalize_nfc(request_var('username', '', true));
		$email = request_var('email', '');

		$website = request_var('website', '');
		$signature = request_var('user_sig', '');
		$occupation = request_var('user_occ', '');
		$interests = request_var('user_interests', '');

		$joined_select = request_var('joined_select', 'lt');
		$active_select = request_var('active_select', 'lt');
		$count_select = request_var('count_select', 'eq');
		$joined = request_var('joined', '');
		$active = request_var('active', '');

		$active = ($active) ? explode('-', $active) : array();
		$joined = ($joined) ? explode('-', $joined) : array();

		if ((sizeof($active) &amp;&amp; sizeof($active) != 3) || (sizeof($joined) &amp;&amp; sizeof($joined) != 3))
		{
			trigger_error($user-&gt;lang['WRONG_ACTIVE_JOINED_DATE'] . adm_back_link($this-&gt;u_action), E_USER_WARNING);
		}

		$count = request_var('count', '');

		$key_match = array('lt' =&gt; '&lt;', 'gt' =&gt; '&gt;', 'eq' =&gt; '=');
		$sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');

		$where_sql = '';
		$where_sql .= ($username) ? ' AND username_clean ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, utf8_clean_string($username))) : '';
		$where_sql .= ($email) ? ' AND user_email ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, $email)) . ' ' : '';

		$where_sql .= ($website) ? ' AND user_website ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, $website)) . ' ' : '';
		$where_sql .= ($signature) ? ' AND user_sig ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, $signature)) . ' ' : '';
		$where_sql .= ($occupation) ? ' AND user_occ ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, $occupation)) . ' ' : '';
		$where_sql .= ($interests) ? ' AND user_interests ' . $db-&gt;sql_like_expression(str_replace('*', $db-&gt;any_char, $interests)) . ' ' : '';

		$where_sql .= (sizeof($joined)) ? " AND user_regdate " . $key_match[$joined_select] . ' ' . gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]) : '';
		$where_sql .= ($count !== '') ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';

		// First handle pruning of users who never logged in, last active date is 0000-00-00
		if (sizeof($active) &amp;&amp; (int) $active[0] == 0 &amp;&amp; (int) $active[1] == 0 &amp;&amp; (int) $active[2] == 0)
		{
			$where_sql .= ' AND user_lastvisit = 0';
		}
		else if (sizeof($active) &amp;&amp; $active_select != 'lt')
		{
			$where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
		}
		else if (sizeof($active))
		{
			$where_sql .= ' AND (user_lastvisit &gt; 0 AND user_lastvisit &lt; ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')'; 		} 	} 	// Protect the admin, do not prune if no options are given... 	if (!$where_sql) 	{ 		return; 	} 	// Get bot ids 	$sql = 'SELECT user_id 		FROM ' . BOTS_TABLE; 	$result = $db-&gt;sql_query($sql);

	$bot_ids = array();
	while ($row = $db-&gt;sql_fetchrow($result))
	{
		$bot_ids[] = $row['user_id'];
	}
	$db-&gt;sql_freeresult($result);

	// Do not prune founder members
	$sql = 'SELECT user_id, username
		FROM ' . USERS_TABLE . '
		WHERE user_id &lt;&gt; ' . ANONYMOUS . '
			AND user_type &lt;&gt; ' . USER_FOUNDER . "
		$where_sql";
	$result = $db-&gt;sql_query($sql);

	$where_sql = '';
	$user_ids = $usernames = array();

	while ($row = $db-&gt;sql_fetchrow($result))
	{
		// Do not prune bots and the user currently pruning.
		if ($row['user_id'] != $user-&gt;data['user_id'] &amp;&amp; !in_array($row['user_id'], $bot_ids))
		{
			$user_ids[] = $row['user_id'];
			$usernames[$row['user_id']] = $row['username'];
		}
	}
	$db-&gt;sql_freeresult($result);
}

Sauvegardez le fichier.
Remplacer les fichiers correspondant sur votre FTP.
Dans le Panneau d’administration, Vider la cache.
Ensuite allez dans UTILISATEURS ET GROUPES\Délester des utilisateurs.
Vous avez maintenant des nouveaux champs de recherche :

© Copyright . Tous droits réservés.

Web HostingBy Arvixe