Send mail via Jenkins CI email-ext plugin not until a job fails n times

The Jenkins email-ext plugin is very helpful when you want to be informed about your builds with the help of an email. There are many triggers available for which state you want to get a notification. But when you want to receive an email not until e.g. the 5th build is failed you need to add your own groovy script to the trigger ‚Script – After Build‘.

The following script will send a mail first when a previous amount of builds are worse than the given threshold ‚hudson.model.Result.SUCCESS‘. In the example below an email is triggered only when a maximum number of 5 builds one after another has been aborted or failed.

A possible use case: Jenkins as a monitoring system that runs WebDriver tests every 5 min.

def max = 5;
def item = jenkins.model.Jenkins.instance.getItem(this.binding.build.project.name);

def threshold = hudson.model.Result.SUCCESS;
def threshCount = 0;

if(this.binding.build.result.isWorseThan(threshold)) {
    def builds = item.getBuilds();
    def count = 0;
    for (build in builds) {
        if (count <= max && threshCount < max && build.result.isWorseThan(threshold)) {
            threshCount++;
        } else {
            println(threshCount + " of max. " + max + " builds [aborted|failed].");
            break;
        }
        count++;
    }
}
// Boolean decides if a mail has to be triggered
threshCount >= max;
Script - After Build trigger of the Jenkins CI email-ext plugin

Script – After Build trigger of the Jenkins CI email-ext plugin

Veröffentlicht unter Jenkins | Verschlagwortet mit , , , | Kommentar hinterlassen

WebDriver: Add preconfigured extension to ChromeDriver with Java

This blog post contains a possible method how to add a preconfigured chrome extension to the ChromeDriver for WebDriver with Java. The technical approach is to set the LocalStorage for the plugin, which contains the main information. The plugin that will be configured here is the ModHeader plugin. It enables the possibility to modify the header of the current page.

Therefor you need to download the *.crx file. If you are using Chrome you can use the plugin ‚Give me CRX‘ (https://chrome.google.com/webstore/detail/give-me-crx/acpimoebmfjpfnbhjgdgiacjfebmmmci).

Example: Mod Header 1.2.4

modheader

public void testAddChromeExtension() {

	ChromeOptions chromeOptions = new ChromeOptions();
	chromeOptions.addExtension(new File("/path/to/mod_header_1.2.4.crx"));

	String extensionID = "idgpnmonknjnojddfkpgkljpfnnfcklj";

	Map<String, String> profileMap = new HashMap<>();
	profileMap.put("NAME_1","VALUE_1");
	profileMap.put("NAME_2","VALUE_2");

	String profilesString = createModHeaderProfiles(profileMap);
   
	createLocalStorageColumnForChromeExtension(extensionID, "profiles", profilesString, true);
	createLocalStorageColumnForChromeExtension(extensionID, "selectedProfile", "0", false);

	DesiredCapabilities capabilities = DesiredCapabilities.chrome();
	capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

	WebDriver driver = new ChromeDriver(capabilities);

	...
	...

}
private String createModHeaderProfiles(Map _keyValueMap) {
	String headerSets = "";
	for (Map.Entry entry : _keyValueMap.entrySet()) {
		headerSets = headerSets + ",{" +
				"\"name\":\"" + entry.getKey() + "\"," +
				"\"value\":\"" + entry.getValue() + "\"," +
				"\"comment\":\"\"," +
				"\"enabled\":true}";
	}
	String filledHeaders = "{\"headers\":[" + headerSets.replaceFirst(",", "") + "],";
	String emptyHeaders = "{\"headers\":[{\"name\":\"\",\"value\":\"\",\"comment\":\"\",\"enabled\":true}],";
	String filters = "\"filters\":[{\"host\":\"\",\"behavior\":\"true\",\"comment\":\"\"}]}";

	return "[" + filledHeaders + filters + "," + emptyHeaders + filters + "," + emptyHeaders + filters + "," + emptyHeaders + filters + "]";
}
private void createLocalStorageColumnForChromeExtension(String _extensionID, String _key, String _value, boolean _dropTable) {

	String dbString = "chrome-extension_" + _extensionID + "_0.localstorage";
	String pathString = currentSessionChromeProfile.getPath() + "/Default/Local Storage/";
	File path = new File(pathString);
	if (!path.exists()) {
		path.mkdir();
	}

	Connection connection = null;
	try {
		Class.forName("org.sqlite.JDBC");
		connection = DriverManager.getConnection("jdbc:sqlite:" + pathString + dbString);
		Statement statement = connection.createStatement();

		if (_dropTable) {
			statement.executeUpdate("DROP TABLE IF EXISTS ItemTable");
			statement.executeUpdate("CREATE TABLE ItemTable (key TEXT UNIQUE ON CONFLICT FAIL, value BLOB NOT NULL ON CONFLICT FAIL)");
		}
		PreparedStatement ps = connection.prepareStatement("INSERT INTO ItemTable VALUES('" + _key + "',?)");
		ps.setBytes(1, _value.getBytes("UTF-16le"));
		ps.executeUpdate();
	} catch (ClassNotFoundException | UnsupportedEncodingException | SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

Afterwards ‚LocalStorage‘ is set:

devtools_modheader

Extension popup with configured LocalStorage

Veröffentlicht unter WebDriver | Verschlagwortet mit , , , , | Kommentar hinterlassen

Searching for playlists at Deezer

Because there is no possibility to search for playlists on the main web site of the music streaming platform Deezer, Google is the one you have to ask:

  1. Open Google
  2. When you want to search for a playlist for wedding party songs, write to the search field ’site:www.deezer.com/playlist wedding party‘ and push the enter button.
  3. Thats it! Easy, isn’t it?🙂
Veröffentlicht unter Uncategorized | Verschlagwortet mit , , | Kommentar hinterlassen

Forschungsstudien zur hybriden Musikempfehlung – Ein kleiner Einblick

Zu den Themengebieten der hybriden Musikempfehlungsgenerierung existieren zahlreiche Forschungsberichte. Wichtig dabei ist oft die Verknüpfung der kollaborativen und inhaltsbasierten Filtertechniken zur Verbesserung der Empfehlungsgenauigkeit. Yoshii et al. (2006) entwickelten hierzu eine Methode der Musikempfehlung, die Ratings von Nutzern und Audioinformationen verbindet. Als sogenanntes ’aspect model’ wurde ein Bayes’sches Netz gewählt, welches nicht erkennbare Nutzerpräferenzen durch verborgene, statistisch ermittelte Variablen ergänzt. Sie konnten zeigen, dass die eingesetzte Methode die beiden konventionellen Methoden in Hinsicht der Empfehlungsgenauigkeit übertrafen. Auch wurde der ’kalte Start’ überwunden, denn Musikstücke konnten empfohlen werden, auch wenn sie keine Ratings durch User erhalten hatten. Li et al. (2007) stellten ein kollaboratives Musik-Empfehlung-System für Online-Telefonklingeltöne vor. Es basierte auf einem Wahrscheinlichkeitssystem, welches Elemente in Gruppen oder Gemeinschaften klassifiziert. Dabei wurde die Gaußverteilung genutzt um Vorhersagen für die Nutzer anhand der vorangegangenen Ratings zu erstellen. Das Ziel war die Verknüpfung von Audio-Eigenschaft und kollaborativem Filter mit Hilfe der K-Medoids-Clustermethode. Es zeigte sich, dass die vorgestellte Methode die beiden Standardmethoden, kollaboratives und inhaltliches Filtern im Einzelnen, übertraf. Magno & Sable (2008) führten eine Feature-Analyse durch, indem sie die Mel-Frequenz-Cepstrum-Koeffizienten (Mel-Frequency Ceptral Coefficients – MFCCs) der zu untersuchenden Songs bestimmten. Die Koeffizienten wurden in drei verschiedenen Algorithmen verwendet, um daraus Empfehlungen für Nutzer zu generieren. Es konnte gezeigt werden, dass ein signalbasierter Empfehlungsalgorithmus, hier im speziellen ein Expectation-Maximization-Algorithmus verfeinert mit einem Monte-Carlo-Sampling, mit den kommerziellen Algorithmen bekannter Firmen mithalten konnte. Auch Yoshii et al. (2008) machten sich die MFCCs zunutze und stellten einen hybriden Empfehlungsalgorithmus vor, bei welchem ein generatives Wahrscheinlichkeitsmodell herangezogen wurde, das die kollaborativen und inhaltsbasierten Daten verbinden konnte. Mit diesem sogenannten „three-way aspect model“ war es möglich steigende Userzahlen und Ratings (Ratingmodell von Amazon) einfach in das System zu integrieren. Im Vergleich zu den Einzelfiltermethoden in 4 verschiedenen Versionen (speicher- oder modellbasiert verknüpft mit kollaborativ oder inhaltsbasiert), war die vorgeschlagene Methode hinsichtlich der Empfehlungs-Genauigkeit ebenbürtig bzw. überlegen. Auch bei der Empfehlungs-Ungenauigkeit lag das „three-way aspect model“ vorn, da dieses im Mittel am niedrigsten war. Yoshii & Goto (2009) präsentierten ein kontinuierliches pLSI-basiertes (probabilistic latent semantic indexing) Modell für hybride Musikempfehlung. Da bei dieser Methode die Anzahl der Parameter sehr hoch und dies ein Indikator für eine unangemessene Empfehlung von bestimmten Items an alle User ist („hubs“), untersuchten Yoshii & Goto drei Glättungstechniken zur Behebung des Problems. Gaußsche Parameterverknüpfung und künstlerbasierte Item-Gruppierung konnten die Modellkomplexität reduzieren und somit die Genauigkeit des hybriden Musikempfehlungsdienstes verbessern. Die Parameterverknüpfung reduzierte die Anzahl der sogenannten „hubs“ zusätzlich. Die dritte Glättungstechnik (multinomiale Glättung) konnte nicht überzeugen, da sie die Empfehlungsgenauigkeit sogar noch verschlechterte. Lu & Tseng (2009) zeigten mit ihrem personalisierten hybriden Musikempfehlungssystem, dass die Empfehlungsgenauigkeit bei 90% liegen kann, wenn neben kollaborativen und inhaltsbasierten auch emotionenbasierte Filtertechniken herangezogen werden. Bu et al. (2010) stellten eine Methode vor, die Social-Media-Informationen mit akustikbasierten Musikinformationen verband. Da Social-Media-Informationen viele verschiedene Objekte und komplexe Beziehungen beinhalten können, wurde ein Hypergraph als Modell herangezogen. Dadurch war es möglich die vielen einzelnen Gebilde in geeigneten Objektmengen zu verknüpfen. Im Vergleich übertraf das postulierte Schema fünf weitere Einzelempfehlungsalgorithmen (u.a. kollaborativ, akustikbasiert oder auch inhaltsbasiert, Einzelmethoden des Modells) signifikant. In einer weiteren Methode kombinierten auch Su et al. (2010) musikalischen Inhalt und Kontextinformationen. In Verbindung eines Clusterverfahrens und der Hinzunahme einer heuristischen Vorgehensweise zur Nutzerpräferenzzusammenstellung war das vorgestellte Modell im Vergleich zu anderen Methoden (u.a. nutzerbasiert, gegenstandsbasiert) überlegen. Das System von Liu et al. (2010) konnte Musik-Wiedergabelisten erstellen indem es die Zeit analysierte, die ein Nutzer damit verbrachte bestimmte Musik-Titel zu hören. Zur individuellen Empfehlung wurden auch Features aus den Wellendaten und Noten der Musikstücke extrahiert. Als Systemkern kam ein modifiziertes neuronales Netzwerk zum tragen. Um einem möglichen „kalten Start“ aus dem Weg zu gehen zogen Liu et al. zusätzlich noch eine kollaborative Filtertechnik hinzu. Dieses Problem konnte dann auftreten, wenn ein neuer Nutzer noch keine Musik mit dem vorgeschlagenen System gehört hatte.

… Fortsetzung folgt …

Literatur
Bu, J., Tan, S., Chen, C., Wang, C., Wu, H., Zhang, L. & He, X. (2010): Music recommendation by unified hypergraph: combining social media information and music content. In: Proceedings of the international conference on Multimedia, 391–400.

Li, Q., Myaeng, S. H. & Kim, B. M. (2007): A probabilistic music recommender considering user opinions and audio features. In: Information processing & management, 43, 2: 473–487.

Liu, N.-H., Hsieh, S.-J. & Tsai, C.-F. (2010): An intelligent music playlist generator based on the time parameter with artificial neural networks. In: Expert Systems with Applications, 37, 4: 2815–2825.

Lu, C.-C. & Tseng, V. S. (2009): A novel method for personalized music recommendation. In: Expert Systems with Applications, 36, 6: 10035–10044.

Magno, T. & Sable, C. (2008): A Comparison of Signal-Based Music Recommendation to Genre Labels, Collaborative Filtering, Musicological Analysis, Human Recommendation, and Random Baseline. In: Proceedings of the 9th International Conference on Music Information Retrieval, 161–166. Philadelphia and USA. URL http://ismir2008.ismir.net/papers/ISMIR2008_157.pdf.

Su, J.-H., Yeh, H.-H., Yu, P. S. & Tseng, V. S. (2010): Music Recommendation Using Content and Context Information Mining. In: Intelligent Systems, IEEE, 25, 1: 16–26.

Yoshii, K. & Goto, M. (2009): Continuous pLSI and Smoothing Techniques for Hybrid Music Recommendation. In: Proceedings of the 10th International Society for Music Information Retrieval Conference, 339–344. Kobe and Japan. URL http://ismir2009.ismir.net/proceedings/OS4-1.pdf.

Yoshii, K., Goto, M., Komatani, K., Ogata, T. & Okuno, H. G. (2006): Hybrid collaborative and content-based music recommendation using probabilistic model with latent user preferences. In: Proceeding of the 7th International Conference on Music Information Retrieval (ISMIR 2006), 2006: 296–301. URL http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.79.3718.

Yoshii, K., Goto, M., Komatani, K., Ogata, T. & Okuno, H. G. (2008): An Efficient Hybrid Music Recommender System Using an Incrementally Trainable Probabilistic Generative Model. In: IEEE Transactions on Audio, Speech, and Language Processing, 16, 2: 435–447.

Veröffentlicht unter Uncategorized | Kommentar hinterlassen

(Link) Create your own deb package (example: haproxy loadbalancer)

http://byte-consult.be/2013/01/07/rolling-your-own-haproxy-deb-package/

Veröffentlicht unter Uncategorized | Kommentar hinterlassen

(Link) Jenkins – ProcessTreeKiller

https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller#

Veröffentlicht unter Uncategorized | Kommentar hinterlassen