tag:blogger.com,1999:blog-15907080377030538542024-03-13T08:16:53.197+01:00Greg's BlogBreadcrumbs, mostly. Java. BIRT. SQL. Cisco contact centers. IVR's.Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.comBlogger91125tag:blogger.com,1999:blog-1590708037703053854.post-14781666273220940532023-02-28T11:18:00.004+01:002023-03-01T08:41:22.500+01:00UCCX scripts can haz String templates<p>" (<a href="https://en.wikipedia.org/wiki/Quotation_mark" target="_blank">double quotes</a>) are _usually_ a problem within a String that must be enclosed by "'s.<br /></p><p>Now, pretend you need to construct a JSON string in a UCCX/IP IVR AEF script - which needs you to use double quotes around Strings - but it also has to be dynamic: there must be a way to add values that may come from an external source.</p><p>String concatenation is <strike>sooo 80's and ugly</strike> anti pattern and not elegant. </p><p>Let's implement String interpolation instead - with templates. It's simple, it's reusable and easy to test.<br /></p><p><i>Of course</i>, the UCCX scripting toolbox has got everything we need:<br /></p><ul style="text-align: left;"><li>the <span style="font-family: courier;">u</span> prefix* which allows escaping double qoutes using \" (without this prefix it just won't accept \") and</li><li>the <span style="font-family: courier;">String.format( String template, Object[] arguments )</span> static method.</li></ul><p></p><p>First, the template:</p><p><span style="font-family: courier;">String template = u"{\"fruit\":\"%1s\"}"</span></p><p>This just translates to a simple JSON object, a Map or a list of key-value pairs if you insist, with a one key: <span style="font-family: courier;">fruit</span>. <span style="font-family: courier;"><br />%1s</span> is placeholder, meaning "take the first argument and format it as a String". In this example, <span style="font-family: courier;">template</span> is just a UCCX String variable: </p><p><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAAVCAIAAACGzw0GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACa0lEQVR4nO2cPXPDIAyGRc//txm79HLJkjU/tWuXuoNbQoSMhI1jMO8zpD2sSOgDge1r3fV2//x4J2Dgcrmcz+e9ZwGyQeIAEbnr7f7z/bX3NAAAYFsGIsKmZwQHhEZB4gARve09AQAAeAVodgCALkCzAwB0waPZOecK6k1rK2vr9TjnJhcWOCJ+xQWokrkWQRqWyrlEMAG75liDOJIWKFIec/rViR0DnOwWMo6j/1yJc278h7Q6K2IRpFGDbMxC2WSF2qaaYQKLO9Q4jofsboxh+uHbOVtvPqDhCLsahknMriifsFU54fxjLygqyngwAQu4t+Kv2i3ajfZD2CPEfmHRQMm80HNtezH1zGWfzFyni3tWc4trU/6aHVtFYkGwqyys8XdjDf4Io9qqGVbZ4fj0S653vkZDAWZF/K5qcYl7/SEe0sP4s081L7H+OEHMaKw8nlXukT+99OZuTQrestTGII7mrpNEaNS1d+A1ae87jR5yj0e1O664sZFWKl7GcmNere+lkJtdQZ/F+9+NbNWG6rsXC7fTA3f/+mllzYtneQbba9W2WL/XK1FeUBRZeJaNpZSt2jD6Dipki8f2qk7jvmhBvFHYwqlWeDrZhTf204gxsmn5uXfky2y1haWwWP2xxzRZYem5lC1sFx9VczqVxkSHz/jU89rhF1cuj2bH2j+Ti5/I5sqLV+cEKscYDdV346CqXHwNgq4nkrt5JAbjdxoWyVIrwlJI9mLrAfmZHWgUbOZF6OEBVkgn/hZodj2EqSGQjpV0GMBOXMb/swMAdMFARKfTae9pAADAtuBvYwEAXYBmBwDogl8lt2y1GO22CwAAAABJRU5ErkJggg==" /> <br /></p><p>Pretend, at some point we collect the value we need in order to construct our JSON string. Perhaps from a database. This value is stored in a String variable <span style="font-family: courier;">externalValue</span>. In this example, <span style="font-family: courier;">externalValue = "banana"</span>.</p><p></p><p>Let's put <span style="font-family: courier;">template</span> and <span style="font-family: courier;">externalValue</span> together in order to create the value of <span style="font-family: courier;">completeJsonString</span>.<br /></p><p><span style="font-family: courier;">Set completeJsonString = String.format(template, new Object[] {externalValue} ) <br /></span></p><p><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfkAAAAXCAIAAACH7aH1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADv0lEQVR4nO2cQW7cMAxF5aKHyb5zpzlDVwOvcobJmUb73sZdGHBdiaQokZI1wX8IgmBsi18UTVGyM8u2baGV5X4PMW6vF3s0hBDC9nw2mwAAAGDnB3dgXdfy1XyiDyFszyeyPAAAzMBiqutvNyHXAwAAmAQ216/r+ng8eln9/adTywAA8O5snx/ubZrq+naryPUAAMDQI9fb9usBAAC8A6jrAQBgLnrU9T+5A8r9+q8vlZkYA/lKzrlLwgSwfX4Mmx5kWxolR6dcNOcu4jT09tIYJb7eyxtPmj0+cfeePZB6Q7qaFFar9nx+nrbI9rlDxfYd2ZtNGhdsNbglMH0cEA9srtc/mI1Rc04M4VfyoRwQ78uRO+xNVbmod6IfpmSSef17kwyo7AfHAeWCZ6qB6BQYQlWRzzHuWOt6L8hoOCdNckrMywHhk9xccVVRVKKsR2p1kq2RGs7tnEtUsinlKqpIPyUaDyeGZHkawbV2NbbOFJWQ5nKKzkxSSdK+UKsmiYYMeyF0AzUoQg1bRBBwHGoLEs3tRsZVcYjJibPrIrUWa10f416zN5IHRO41bsYT1uPJ3+Q9cD6kbC2/JTSVUa3O/ITzodwbwsSQ9FpIW/qFdlclSg/nRvPBzYNKEFxltzaQikr0JXbRmWQ3awtGskFBqjxz1ML1iLOoD5LzCUr/1J4vd0Q+3+i3IoW6Xv4dwr4Ln27OKOHSGVlAXUJRiVJq8xByLnJHE4hjlDhiCSTfIPQKJPdrLzdHhhNZeQh22yTJV5ElmouJoy+Db6JCXS//DuZnszvcOuty9BmweI5xdOVYt6Op68co8UJexxRxDEKNEos58lpy8eGC7+3JrQx6S5IHJQ/ytnCSh2YwDu/Xx6j5IfZ5OJfNk0ocy7G20R3min2lfP65SskkvFGx3DaTna+qyj4DPEPuMQoKO0myJ+Wp7hqH93As5LurexTmn+d18fL/80DykwYBSfuCEvIE7vy8j0qd3Aa0vo+50Ta6KiHvq4YBla0EUbA8sjLFQKo1p0w05LWahbLg29qbgmyqeSGbm0j+ThbKDYMV6m8H+XzyaK2w3hOD9ftw7nfts9nX69+2/iS7NFctpi5nno5fq8TLeo9ezDNGwSYmuZZsaqrO9obrrHHXsYi1rrc8mwWDaa6Rv6uS3m8+WJhElctTxGLmuupx5WDkNWXvvuN7LgEAYC561PX4PhwAAJiLobl+8P/NAgAA6Mc1dT0AAICReH5/fYxxWRabHgAAAP541vW3221//xJrBQAAmIq/hnGRNu3aQ+4AAAAASUVORK5CYII=" /></p><p>What just happened? </p><p><a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String,%20java.lang.Object...)">String.format</a> is an elegant, yet underrated Java method. UCCX scripting is Java scripting, but instead of varargs it uses an array of objects.<br /></p><p>The first argument is the template. The template value has a placeholder. Placeholders start with the percent sign, followed by the position (1, 2, n) and a format - in our case, s is just an instruction to pass it along (~ format the incoming String as a String).<br /></p><p>Format what: the second argument's values. This needs to be an array of Objects (<span style="font-family: courier;">Object[]</span>) which we construct and initialize on the fly, this is why <span style="font-family: courier;">new Object[] { externalValue }</span>.</p><p>Let's test it (easiest: by using the debug methods available in CCX Editor): <br /></p><p><img alt="" src="data:image/png;base64,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" /></p><p>And hey presto, we receive a nice JSON string: <span style="font-family: courier;">U"{\"fruit\":\"banana\"}"</span> which is of course <span style="font-family: courier;">{"fruit":"banana"}</span>.</p><p><br /></p><p>* Thanks <a href="https://twitter.com/dmacias" target="_blank">@dmacias</a> for the tip with the <span style="font-family: courier;">u</span> prefix.<br /></p>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-6324857867943656812022-04-06T11:09:00.006+02:002022-04-06T11:15:30.255+02:00Groovy one-liner to check passwords stored in ICM Person tablePasswords are stored as MD5 hashes in the UCCE/PCCE/ICM Person table*. If you ever need to check for weak passwords, use the following one-liner:
<pre><code class="language-groovy">assert passwordEncryptedInDb.replace("{enc:1}","").decodeBase64()
==
passwordPlain.digest('md5').decodeHex()
</code></pre>
And of course, we get the passwordEncryptedInDb value using
<pre><code class="language-sql">SELECT per.Password FROM Person per
JOIN Agent ag ON ag.PersonID = per.PersonID
WHERE ag.PeripheralNumber = @loginId
</code></pre>
* non-SSOGreg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-4198354495522611052022-02-12T12:27:00.002+01:002022-02-12T12:28:02.580+01:00WAV file / Youtube video → GStreamer → RTP/UDP stream → CiscoTerminal<p><a href="https://gstreamer.freedesktop.org/">GStreamer</a> makes streaming "from" a G.711 audio file easy.</p><p>6001.wav is already encoded as G.711uLaw: <br /></p><pre><code class="bash">
$ gst-launch-1.0 -v filesrc location = /home/greg/jars/audio/6001.wav ! wavparse ! rtppcmupay ! udpsink host=127.0.0.1 port=19001
</code></pre><p> </p><p>And with ffmpeg and yt-dlp:
</p><pre><code class="bash">
gst-launch-1.0 -v souphttpsrc location=$(yt-dlp -x -g https://www.youtube.com/watch?v=ljnxZypkjn0) ! decodebin ! audioconvert ! audioresample ! mulawenc ! rtppcmupay ! udpsink host=127.0.0.1 port=19001
</code></pre><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjFV-UlQDl29aISFrcRfhE-HWmEqCxvFavsFeMTQhAPMAhQjados3nQR2ananw4KqwZM94CmkW5zGhI-0mFrDW8iC9iV0x_9hGtAIpuX7UfvhAejxmn5bBzTZePVUXXWSeZQm98UDLG39_XdHIzEXf9xBUfbchc3w2wDjFHCF3Iw_qbXghE1Ce4iPkhVQ=s1311" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="891" data-original-width="1311" height="430" src="https://blogger.googleusercontent.com/img/a/AVvXsEjFV-UlQDl29aISFrcRfhE-HWmEqCxvFavsFeMTQhAPMAhQjados3nQR2ananw4KqwZM94CmkW5zGhI-0mFrDW8iC9iV0x_9hGtAIpuX7UfvhAejxmn5bBzTZePVUXXWSeZQm98UDLG39_XdHIzEXf9xBUfbchc3w2wDjFHCF3Iw_qbXghE1Ce4iPkhVQ=w635-h430" width="635" /></a></div><br /><p><br /></p>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-17249802702029236792021-06-16T10:56:00.001+02:002021-06-16T10:56:05.073+02:00Grails: inject bean from a config file (via grailsApplication) in resources.groovy directly without BootStrap.groovyI used to do this:
resources.groovy:
<pre><code class="language-groovy">
beans = {
envSettings(ConcurrentHashMap) {bean ->
/* k: String, v: String */
}
}
</code></pre>
And then in BootStrap.groovy:
<pre><code class="language-groovy">
String label = grailsApplication.config.getProperty('envSettings.label', String, 'N/A')
Boolean nonProd = grailsApplication.config.getProperty('envSettings.nonProd', Boolean, true)
envSettings["label"] = label
envSettings["nonProd"] = nonProd
</code></pre>
It looks like we can do that without BootStrap.groovy.
It's sooo simple.
resources.groovy:
<pre><code class="language-groovy">
beans = {
prefixDflt String, grailsApplication.config.getProperty("prefix.dflt", String, "")
}
</code></pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-59739957432766953712021-01-09T18:31:00.000+01:002021-01-09T18:31:02.663+01:00Transact-SQL percentage<pre><code class="language-sql">DECLARE @t TABLE (id INT PRIMARY KEY, name VARCHAR(10), amount INT)
INSERT INTO @t VALUES (1,'apple',10)
INSERT INTO @t VALUES (2,'pear',20)
INSERT INTO @t VALUES (3,'plum',50)
SELECT
t.id,
t.name,
t.amount,
CAST(t.amount AS FLOAT)/SUM(amount) OVER () AS [percent]
FROM @t t
</code></pre>
<img alt="" src="data:image/png;base64,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" />
Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-78882248074954140882020-09-22T09:55:00.000+02:002020-09-22T09:55:01.502+02:00This was a life saver yesterday - haveged<a href="https://stackoverflow.com/questions/137212/how-to-deal-with-a-slow-securerandom-generator" target="_blank">https://stackoverflow.com/a/47097219</a>
Also here:
<a href="http://www.issihosts.com/haveged/" target="_blank">http://www.issihosts.com/haveged/</a>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-89326165113967496662018-05-22T19:22:00.003+02:002018-05-22T19:22:48.353+02:00VMWare PowerCLI backup of ESXi 5.5 hosts.<pre><code class="language-powershell">Set-ExecutionPolicy RemoteSigned
Add-PSSnapin VMware.VimAutomation.Core
$server="10.123.45.67"
$user="user"
$pass="1superSecretP@ssword!!!"
Connect-VIServer -Server $server -User $user -Password $pass
$now=Get-Date -format "yyyy-MM-dd_HH-mm-ss"
$newdir="b:\vmware-backups\$now"
new-item $newdir -itemtype directory
get-vmhost | get-vmhostfirmware -BackupConfiguration -DestinationPath $newdir
Disconnect-VIServer -Server $server -Confirm:$false
</code></pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-45117413013096287962018-04-24T16:00:00.001+02:002018-04-24T16:00:25.560+02:00Apache POI 3.17 with Groovy/Grapes kept reporting javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not foundLike this:
<pre><code class="language-java">Caught: javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161)
at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:141)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:97)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149)
at org.apache.poi.ss.usermodel.WorkbookFactory$create.call(Unknown Source)
at poitest.run(poitest.groovy:14)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
</code></pre>
Solution <a href="https://github.com/centic9/poi-on-android/issues/8">here</a>.
This works:
<pre><code class="language-groovy">@GrabConfig(systemClassLoader=true)
@Grapes([
@Grab(group='org.apache.poi', module='poi', version='3.17'),
@Grab(group='org.apache.poi', module='poi-ooxml', version='3.17'),
@Grab(group='org.apache.poi', module='ooxml-schemas', version='1.3'),
@Grab(group='com.fasterxml', module='aalto-xml', version='1.1.0')
])
import org.apache.poi.ss.usermodel.*
import org.apache.poi.ss.usermodel.WorkbookFactory
System.setProperty("javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl")
System.setProperty("javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl")
System.setProperty("javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl")
Workbook wb = WorkbookFactory.create(new FileInputStream("./blah.xlsx"))
println wb.dump()
</code></pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-49698182665262040912018-03-21T15:35:00.000+01:002018-03-21T15:35:11.961+01:00Apply traffic light icons to a custom range of cells in Excel using VBA<pre>
<code class="language-vbnet">
Sub iconsets0()
Dim rg As Range
Dim iset As IconSetCondition
Dim positiveCells As Range
Dim negativeCells As Range
'observed range:
Set rg = Range("C7", "G25")
rg.FormatConditions.Delete
For Each c In rg
If c.Value >= 0 Then
If Not positiveCells Is Nothing Then
Set positiveCells = Union(positiveCells, c)
Else
Set positiveCells = c
End If
End If
If c.Value < 0 Then
If Not negativeCells Is Nothing Then
Set negativeCells = Union(negativeCells, c)
Else
Set negativeCells = c
End If
End If
Next c
' apply to cells with positive number values:
Set positiveSet = positiveCells.FormatConditions.AddIconSetCondition
With positiveSet
.IconSet = ActiveWorkbook.iconsets(xl3TrafficLights1)
.ReverseOrder = True
.ShowIconOnly = False
End With
With positiveSet.IconCriteria(2)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "10"
End With
With positiveSet.IconCriteria(3)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "25"
End With
' apply to cells with negative number values:
Set negativeSet = negativeCells.FormatConditions.AddIconSetCondition
With negativeSet
.IconSet = ActiveWorkbook.iconsets(xl3TrafficLights1)
.ReverseOrder = False
.ShowIconOnly = False
End With
With negativeSet.IconCriteria(2)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "-25"
End With
With negativeSet.IconCriteria(3)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "-10"
End With
End Sub
</code>
</pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-47355825017054781232018-03-15T13:08:00.001+01:002018-03-15T13:08:35.177+01:00To install posh-gvm1. Set JAVA_HOME to the root directory of the JDK.<br />
2. Run this before invoking gvm:<br />
<pre><code class="language-powershell">[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
</code></pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-57138685228782071762018-03-01T15:35:00.001+01:002018-03-01T15:35:25.258+01:00JTDS → Microsoft JDBC Driver for SQL ServerGreg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-68555165170282071762018-02-23T12:55:00.001+01:002018-02-23T12:55:09.482+01:00Importing a PKCS12 keystore into a JKS keystoreWow, I did not know <span style="font-family: "Courier New", Courier, monospace;">keytool </span>can actually do this.<br />
<br />
<pre><code class="language-bash">keytool -importkeystore -destkeystore keystore.jks -srckeystore keystore.p12 -alias tomcat</code></pre>
<br />
Via <a href="https://blogs.oracle.com/jtc/installing-trusted-certificates-into-a-java-keystore" target="_blank">Jim Connor's Blog</a>.Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-1208431766546563662018-02-21T12:56:00.000+01:002018-02-21T12:56:18.361+01:00Grails: adjust Hibernate settings to prevent "org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement"Grails 3.3.2 project. GORM, Hibernate, JTDS (with Microsoft SQL Server). I kept getting the following exception:<br />
<br />
<pre><code class="language-java">
Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:524)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:470)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:273)
at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:203)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:110)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:176)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:65)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:478)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:422)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:711)
at org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.buildSessionFactory(HibernateMappingContextConfiguration.java:274)
at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:86)
at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39)
at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23)
at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64)
at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52)
at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24)
at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:196)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1076)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
(...)
</init></init></code></pre>
<br />
Adding the <span style="font-family: "Courier New", Courier, monospace;">default_catalog:</span> (name of the database here) and <span style="font-family: "Courier New", Courier, monospace;">default_schema:</span> (name of the schema, usually dbo) underneath the <span style="font-family: "Courier New", Courier, monospace;">hibernate:</span> section in <span style="font-family: "Courier New", Courier, monospace;">application.yml</span> solved the issue.Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-58790020087751789462018-02-15T19:45:00.001+01:002018-02-15T19:45:08.939+01:00Packaged Contact Center Enterprise (PCCE) does support Departments.And you don't need CCMP for it.<br />
<br />
<a href="https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/pcce/pcce_11_6_1/maintenance/Guide/pcce_b_admin-config-11_6/pcce_b_admin-config-11_6_chapter_0100.html#PCCE_RF_BEE6861D_00">https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/pcce/pcce_11_6_1/maintenance/Guide/pcce_b_admin-config-11_6/pcce_b_admin-config-11_6_chapter_0100.html#PCCE_RF_BEE6861D_00</a>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-444293166742131902018-02-15T09:36:00.001+01:002018-02-15T09:36:20.061+01:00Installed a Let's Encrypt SSL certificate. It was about time.<a href="https://letsencrypt.org/">https://letsencrypt.org/</a>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-53492202601567181522018-02-14T13:20:00.002+01:002018-02-14T13:20:30.066+01:00And the winner for script highlighting is: prism.js<a href="http://prismjs.com/index.html">http://prismjs.com/index.html</a>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-60660633806886759942018-02-14T09:53:00.000+01:002018-02-14T09:53:09.304+01:00PowerShell function to show screen where you can change password and lock<span style="font-family: "Courier New", Courier, monospace;">(New-Object -COM Shell.Application).WindowsSecurity()</span>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-42525771542667422052018-02-12T18:46:00.000+01:002018-02-14T13:17:57.937+01:00Stop+Disable and Make Automatic+Start Windows Services using PowerShell.When you need to make sure all Cisco services (Windows services) are stopped and set to manual but you need to do this on 20 servers and there's at least 10 services per server then you start doing things like this:<br /><br />
Stop and set Startup type to Manual:<br /><br />
<pre><code class="language-powershell">
Get-Service |Where-Object {($_.DisplayName -like 'Cisco*')} |foreach {Stop-Service $_.Name}
Get-Service |Where-Object {($_.DisplayName -like 'Cisco*')} |foreach {Set-Service $_.Name -StartupType Manual}
</code></pre>
Set Startup type to Automatic and start:<br /><br />
<pre><code class="language-powershell">
Get-Service |Where-Object {($_.DisplayName -like 'Cisco*')} |foreach {Set-Service $_.Name -StartupType Automatic}
Get-Service |Where-Object {($_.DisplayName -like 'Cisco*')} |foreach {Start-Service $_.Name}
</code></pre>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-23041699776822441712017-04-15T10:32:00.001+02:002017-04-15T10:32:19.847+02:00Intel Corporation Centrino Wireless-N 2230 (rev c4) vs Ubuntu<pre class="bbcode_code" style="height: 36px;"><span style="font-family: "Courier New",Courier,monospace;">echo "options iwlwifi 11n_disable=8" | sudo tee -a /etc/modprobe.d/iwlwifi.conf</span></pre>
<pre class="bbcode_code" style="height: 36px;"><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Via <a href="https://ubuntuforums.org/showthread.php?t=2246457">https://ubuntuforums.org/showthread.php?t=2246457</a></span></pre>
<pre class="bbcode_code" style="height: 36px;"> </pre>
Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-17126817418558557642017-01-18T18:12:00.001+01:002017-01-18T18:12:10.222+01:00This was a life saver after a 14.04->16.06 Ubuntu (in VMWare) et0 disappearedhttp://askubuntu.com/questions/824376/failed-to-start-raise-network-interfaces-after-upgrading-to-16-04Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-32208410691235923482016-11-30T06:49:00.001+01:002016-11-30T06:49:11.303+01:00Fix CacheManager with same name grails-cache-ehcacheThis was a life saver:<br />
<br />
<a href="http://www.first8.nl/blog/fix-cachemanager-with-same-name-grails-cache-ehcache/" target="_blank">http://www.first8.nl/blog/fix-cachemanager-with-same-name-grails-cache-ehcache/</a>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-86489008477872348022016-02-11T18:44:00.004+01:002016-02-11T18:44:52.333+01:00How to mount a VirtualBox shared folder Linux guest<pre class="qoate-code">sudo mount -t vboxsf -o uid=$UID,gid=$(id -g) ShareName NewFolder</pre>
Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-75315531670410132732015-10-29T16:48:00.004+01:002015-10-29T16:48:56.926+01:00Use sudo dpkg --configure -a if apt-get dist-upgrade was interrupted.Via <a href="http://askubuntu.com/questions/253925/how-to-safely-abort-apt-get-install">http://askubuntu.com/questions/253925/how-to-safely-abort-apt-get-install</a>.<br />
<br />Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-15928450011208273222014-03-18T21:45:00.004+01:002014-03-18T21:47:26.537+01:00If df -i gives you 100%, use thiscd /<br />
sudo find . -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n<br />
<br />
Via http://www.kossboss.com/freeinodesGreg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0tag:blogger.com,1999:blog-1590708037703053854.post-25977602651639658742013-09-18T14:58:00.004+02:002013-09-18T14:59:10.227+02:00List entities of an ICM script<br />
<br />
<span style="font-size: xx-small;"><span style="font-family: "Courier New",Courier,monospace;">USE ccc_awdb<br />SELECT scr.*,<br />CASE(scr.TargetType)<br />WHEN 1 THEN 'Service'<br />WHEN 2 THEN 'Skill_Group'<br />WHEN 3 THEN 'Agent'<br />WHEN 4 THEN 'Translation_Route'<br />WHEN 7 THEN 'Call_Type'<br />WHEN 8 THEN 'Enterprise_Service'<br />WHEN 14 THEN 'Peripheral'<br />WHEN 16 THEN 'Trunk_Group'<br />WHEN 17 THEN 'Route'<br />WHEN 20 THEN 'Master_Script'<br />WHEN 33 THEN 'Network_Vru_Script'<br />WHEN 37 THEN 'Expanded_Call_Variable'</span><span style="font-family: "Courier New",Courier,monospace;"><br />END AS Type,<br />CASE(scr.TargetType)<br />WHEN 1 THEN (SELECT EnterpriseName FROM Service WHERE SkillTargetID = scr.ForeignKey)<br />WHEN 2 THEN (SELECT EnterpriseName FROM Skill_Group WHERE SkillTargetID = scr.ForeignKey)<br />WHEN 3 THEN (SELECT EnterpriseName FROM Agent WHERE SkillTargetID = scr.ForeignKey)<br />WHEN 4 THEN (SELECT EnterpriseName FROM Translation_Route WHERE SkillTargetID = scr.ForeignKey)<br />WHEN 7 THEN (SELECT EnterpriseName FROM Call_Type WHERE CallTypeID = scr.ForeignKey)<br />WHEN 8 THEN (SELECT EnterpriseName FROM Enterprise_Service WHERE EnterpriseServiceID = scr.ForeignKey)<br />WHEN 14 THEN (SELECT EnterpriseName FROM Peripheral WHERE PeripheralID = scr.ForeignKey)<br />WHEN 16 THEN (SELECT EnterpriseName FROM Trunk_Group WHERE TrunkGroupID = scr.ForeignKey)<br />WHEN 17 THEN (SELECT EnterpriseName FROM Route WHERE RouteID = scr.ForeignKey)<br />WHEN 20 THEN (SELECT EnterpriseName FROM Master_Script WHERE MasterScriptID = scr.ForeignKey)<br />WHEN 33 THEN (SELECT EnterpriseName FROM Network_Vru_Script WHERE NetworkVruScriptID = scr.ForeignKey)<br />WHEN 37 THEN (SELECT EnterpriseName FROM Expanded_Call_Variable WHERE ExpandedCallVariableID = scr.ForeignKey)<br />END AS EnterpriseName<br />FROM Master_Script ms <br />INNER JOIN Script s ON s.MasterScriptID = ms.MasterScriptID AND s.Version = ms.CurrentVersion<br />INNER JOIN Script_Cross_Reference scr ON scr.ScriptID = s.ScriptID<br />WHERE ms.EnterpriseName = 'NM_AkviziceEL'</span></span>Greg Szabóhttp://www.blogger.com/profile/01279301086659523629noreply@blogger.com0