Archives de catégorie : Géneral

Changer la langue de tout le contenu d’un PowerPoint

Option Explicit   
Public Sub ChangeSpellCheckingLanguage()   
    Dim j As Integer, k As Integer, scount As Integer, fcount As Integer 
    scount = ActivePresentation.Slides.Count 
    For j = 1 To scount 
        fcount = ActivePresentation.Slides(j).Shapes.Count 
        For k = 1 To fcount 
            If ActivePresentation.Slides(j).Shapes(k).HasTextFrame Then 
                ActivePresentation.Slides(j).Shapes(k) _ 
                .TextFrame.TextRange.LanguageID = msoLanguageIDFrenchCanadian 
            End If 
        Next k 
    Next j 
End Sub

Codes de langues

msoLanguageIDFrenchCanadian
msoLanguageIDEnglishUS
msoLanguageIDEnglishCanadian

Exporter historique TFS en CSV

using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
 
using Microsoft.TeamFoundation.Client; // NuGet
using Microsoft.TeamFoundation.VersionControl.Client; // GAC
 
namespace TFSHistory
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var tpp = new TeamProjectPicker(TeamProjectPickerMode.SingleProject, true);
            var result = tpp.ShowDialog();
            if (result != DialogResult.OK) return;
 
            var tpc = tpp.SelectedTeamProjectCollection;
            var versionControl = tpc.GetService<VersionControlServer>();
 
            var tp = versionControl.GetTeamProject(tpp.SelectedProjects[0].Name);
            var path = tp.ServerItem;
 
            var q = versionControl.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full, null, new ChangesetVersionSpec(1), VersionSpec.Latest, Int32.MaxValue, false, true, false, false);
           
            using (var file = new StreamWriter(@"fichier.csv", true, Encoding.UTF8))
            {
                file.AutoFlush = true;
                file.WriteLine("CS, Date, User, Comment");
 
                foreach (Changeset cs in q)
                {
                    if (cs.Committer.Contains("Elastic")) continue;
                    if (string.IsNullOrWhiteSpace(cs.Comment)) continue;
 
                    var comment = cs.Comment;
                    comment = comment.Replace(',', ' ');
                    comment = comment.Replace(Environment.NewLine, " ");
 
                    file.WriteLine(string.Format("{0},{1},{2},{3}", cs.ChangesetId, cs.CreationDate, cs.Committer, comment));
                }
            }
        }
    }
}

Ajuster le compte des commentaires et des catégories sous WordPress après importation

<?php
// Place this file in your root directory and navigate to it.  Script will correct counts for comments and categories.
include("wp-config.php");

if (!mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) {  die('Could not connect: ' . mysql_error());  }
if (!mysql_select_db(DB_NAME)) {  die('Could not connect: ' . mysql_error());  }

$result = mysql_query("SELECT term_taxonomy_id FROM ".$table_prefix."term_taxonomy");
while ($row = mysql_fetch_array($result)) {
  $term_taxonomy_id = $row['term_taxonomy_id'];
  echo "term_taxonomy_id: ".$term_taxonomy_id." count = ";
  $countresult = mysql_query("SELECT count(*) FROM ".$table_prefix."term_relationships WHERE term_taxonomy_id = '$term_taxonomy_id'");
  $countarray = mysql_fetch_array($countresult);
  $count = $countarray[0];
  echo $count."<br />";
 mysql_query("UPDATE ".$table_prefix."term_taxonomy SET count = '$count' WHERE term_taxonomy_id = '$term_taxonomy_id'");
		}

$result = mysql_query("SELECT ID FROM ".$table_prefix."posts");
while ($row = mysql_fetch_array($result)) {
  $post_id = $row['ID'];
  echo "post_id: ".$post_id." count = ";
  $countresult = mysql_query("SELECT count(*) FROM ".$table_prefix."comments WHERE comment_post_ID = '$post_id' AND comment_approved = 1");
  $countarray = mysql_fetch_array($countresult);
  $count = $countarray[0];
  echo $count."<br />";
  mysql_query("UPDATE ".$table_prefix."posts SET comment_count = '$count' WHERE ID = '$post_id'");
		}
?>

Certificats Windows sous Java

Sous Java, la procédure normale pour utiliser des certificats PKI SSL est de les importer dans le Trust Store et Key Store en utilisant l’outil keytool disponible dans le JDK. Un autre bon outil pour manipuler les keystore est Key Store Explorer (KSE)

Par contre, sous Windows, les certificats sont installés dans Windows Certificate Store. Est-il réellement nécessaire de les exporter (ce qui implique avoir accès à la clé privé), les transformer (avec OpenSSL) et de les importer dans les fichiers JKS de Java?

Bien, il s’avère que non, puisqu’il soit possible de lancer une JVM avec les paramètres suivants pour utiliser les certificats de Windows directement:

java -Djavax.net.ssl.trustStoreType=Windows-ROOT -Djavax.net.ssl.keyStoreType=Windows-MY

Ceci est rendu possible grâce au SunMSCAPI JCE Provider et cela fontionne bien pour des certificats générés à partir d’un crypto basée sur RSA.

Par contre, pour des certificats générés en utilisant la crypto moderne, bien Java 8 supporte les certificats de la nouvelle génération stockés dans les fichiers JKS, SunMSCAPI, qui n’a pas évolué, ne supporte pas CNG (CryptoAPI Next Generation).

Ainsi, avec Java 8 et des certificats moderne, de retour à la case départ…

À quand une nouvelle génération du provider SunMSCAPI (ou une alternative) permettant d’aller lire directement les certificats CNG dans le Microsoft Certificate store? Car, pour l’instant, il semble qu’il existe au moyen outre codé soi-même en JNI / JNA une interface à CNG.

Pheox JCAPI offre bien une alternative à SunMSCAPI, mais ce produit commercial n’a pas évolué avec le temps et ne supporte pas CNG.

Changer la clé de produit Microsoft Office 2013 sur VM Azure

Après un certain temps, à force de changer d’adresse IP, la licence d’Office 2013 sur une VM Azure finit par détecter un changement de matériel et se désactive. Si on a une licence MSDN ou BizSpark sous main, on peut contourner ce problème en changeant sa clé de produit en ouvrant une ligne de commande: (Windows-R, CMD) en lancer la commande:

cscript « C:Program FilesMicrosoft OfficeOffice15OSPP.VBS » /inpkey:NOUVELLE-CLÉ

ou

cscript « C:Program Files (x86)Microsoft OfficeOffice15OSPP.VBS » /inpkey::NOUVELLE-CLÉ

Selon sa combinaison de Windows et Office 32 ou 64 bits.

 

Macro pour dévérouiller un fichier Excel par la méthode « Brute Force »

Sub PasswordBreaker()
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox « One usable password is  » & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

Suppression récursive sous MS SQL Server

Supposons que vous ayez une table définie comme ceci:

CREATE TABLE MyTable (

 

  OID INT, --clé primaire

 

  OID_Parent INT, --récursion, clé étrangère

 

  --... autre colonnes

 

)

 


 

 

 

 

 

 

 

 

Bien qu’il soit possible de définir une clé étrangère avec l’attribut DELETE CASCADE, à la différence d’autres SGBD, les suppressions en cascade récursives sur la même table ne sont pas pris en charge sous MS SQL Server. Avec une telle relation récursive, tenter de supprimer un enregistrement duquel un autre enregistrement dépen n’est pas permis. Si pour contourner le problème vous tentez de créer un déclencheur INSTEAD OF DELETE, celui-ci ne se déclenche uniquement pour le premier DELETE. Il ne se déclenche pas récursivement pour supprimer tous les enregistrement. Ce comportement est attendu et documenté sur MSDN : “Si un déclencheur INSTEAD OF défini sur une table exécute une instruction portant sur cette table et qui est susceptible de l’activer de nouveau, il n’est pas appelé de façon récurrente.” La solution est donc de créer un déclencheur de suppression récursif comme celui-ci:

CREATE TRIGGER del_MyTable

 

  ON MyTable

 

  INSTEAD OF DELETE

 

AS

 

  CREATE TABLE #Table(

 

    OID INT

 

  )

 

  INSERT INTO #Table (OID) SELECT OID FROM deleted

 

  DECLARE @c INT

 

  SET @c = 0

 

  WHILE @c <> @@ROWCOUNT

 

  BEGIN

 

    SELECT @c = @@ROWCOUNT

 

    INSERT INTO #Table (OID)

 

    SELECT MyTable.OID FROM MyTable

 

    LEFT OUTER JOIN #Table ON MyTable.OID = #Table.OID

 

    WHERE MyTable.OID_Parent IN (SELECT OID FROM #Table)

 

    AND #Table.OID IS NULL

 

  END

 

  DELETE MyTable FROM MyTable INNER JOIN #Table ON MyTable.OID = #Table.OID

 

END

 


 

 

 

Ce déclencheur insère tous les enregistrements de la pseudo table deleted dans une table temporaire #Table. Ensuite, il rassemble tous les enregistrements qui ne sont pas déjà dans la table temporaire (LEFT OUTER JOIN … WHERE IS NULL). La boucle s’arrête si aucun nouvel enregistrement n’est trouvé. Finalement, tous les documents recueillis sont supprimés.

(Adapté de devioblog)

Suppression récursive sous MS SQL Server

Supposons que vous ayez une table définie comme ceci:

CREATE TABLE MyTable (

 

  OID INT, --clé primaire

 

  OID_Parent INT, --récursion, clé étrangère

 

  --... autre colonnes

 

)

 


 

 

 

 

 

 

 

 

Bien qu’il soit possible de définir une clé étrangère avec l’attribut DELETE CASCADE, à la différence d’autres SGBD, les suppressions en cascade récursives sur la même table ne sont pas pris en charge sous MS SQL Server. Avec une telle relation récursive, tenter de supprimer un enregistrement duquel un autre enregistrement dépen n’est pas permis. Si pour contourner le problème vous tentez de créer un déclencheur INSTEAD OF DELETE, celui-ci ne se déclenche uniquement pour le premier DELETE. Il ne se déclenche pas récursivement pour supprimer tous les enregistrement. Ce comportement est attendu et documenté sur MSDN : “Si un déclencheur INSTEAD OF défini sur une table exécute une instruction portant sur cette table et qui est susceptible de l’activer de nouveau, il n’est pas appelé de façon récurrente.” La solution est donc de créer un déclencheur de suppression récursif comme celui-ci:

CREATE TRIGGER del_MyTable

 

  ON MyTable

 

  INSTEAD OF DELETE

 

AS

 

  CREATE TABLE #Table(

 

    OID INT

 

  )

 

  INSERT INTO #Table (OID) SELECT OID FROM deleted

 

  DECLARE @c INT

 

  SET @c = 0

 

  WHILE @c <> @@ROWCOUNT

 

  BEGIN

 

    SELECT @c = @@ROWCOUNT

 

    INSERT INTO #Table (OID)

 

    SELECT MyTable.OID FROM MyTable

 

    LEFT OUTER JOIN #Table ON MyTable.OID = #Table.OID

 

    WHERE MyTable.OID_Parent IN (SELECT OID FROM #Table)

 

    AND #Table.OID IS NULL

 

  END

 

  DELETE MyTable FROM MyTable INNER JOIN #Table ON MyTable.OID = #Table.OID

 

END

 


 

 

 

Ce déclencheur insère tous les enregistrements de la pseudo table deleted dans une table temporaire #Table. Ensuite, il rassemble tous les enregistrements qui ne sont pas déjà dans la table temporaire (LEFT OUTER JOIN … WHERE IS NULL). La boucle s’arrête si aucun nouvel enregistrement n’est trouvé. Finalement, tous les documents recueillis sont supprimés.

(Adapté de devioblog)

Boucler sur tous les enregistrements d’une table

Voici une façon simple et élégante (mais pas très rapide!) de boucler en SQL sur tous les enregistrements d’une table qui comporte une clé primaire unique:

-- changer type, id et table selon le type et le nom de la clé primaire et la table à manipuler
declare @id type
select @id = min(id) from table
while @id is not null
begin
-- modifier cette ligne selon l'opération à faire sur chaque enregistrement
select * from table where id = @id
select @id = min(id) from table where id > @id
end

Pour boucler sur tous les enregistrements d’une table qui ne comporte pas de clé primaire, la méthode est plus complexe et moins élégante; elle implique l’utilisation d’une table temporaire. Voirhttp://support.microsoft.com/kb/111401 pour plus de détails.

WikiPlus de KWizCom

C’est connu, les fonctionalités de base de SharePoint côté Wiki sont faibles comparativement à d’autres offres sur le marché. La référence dans ce segment est sans contredit MediaWiki, l’engin derrière Wikipedia. Tout autre technologie sera nécessairement comparée à MediaWiki. Et, dans une telle comparaison, SharePoint ne fait généralement pas très bonne figure. En fait, c’était surtout vrai avant SharePoint Server 2010 qui offre maintenant des fonctionalités Enterprise Wiki qui commandent plus de respect! Par contre, si vous êtes toujours sur MOSS ou WSS 2007 ou si votre plateforme de prédilection gratuite reste SharePoint Foundation 2010, le produit WikiPlus de KWizCom, une compagnie canadienne (Markham, Ontario) soit dit en passant, pourrait sans doute vous intéresser!