-- While as a DBA
DECLARE
BEGIN
FOR x in (SELECT owner, table_name FROM all_tables WHERE OWNER IN('SCOTT', 'MYAPP', 'HR'))
LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.owner || '.' || x.table_name || ' TO myuser';
END LOOP;
END;
Wednesday, 17 November 2010
Granting access to multiple tables
Simple anonymous script to grant read access to a number of other user's tables
Sunday, 10 October 2010
Using JRebel with sbt
At the time of writing, JRebel are offering a free year's license for Scala development see http://sales.zeroturnaround.com/, this is how to install it:
1) Download and install JRebel from http://www.zeroturnaround.com/jrebel/current/
2) Edit the sbt command
3) go to your projects root directory and run:
1) Download and install JRebel from http://www.zeroturnaround.com/jrebel/current/
2) Edit the sbt command
java -Xmx512M -noverify -javaagent:/usr/bin/jrebel/jrebel.jar -jar `dirname $0`/sbt-launch.jar "$@"
3) go to your projects root directory and run:
sbt
sbt> update
sbt> jetty-run
sbt> ~ prepare-webapp
Wednesday, 15 September 2010
Creating Intellij Projects for SBT Projects
I'm currently working on an Open-Source Scala project and we have switched our build process from Maven2 to SBT or Simple Build Tool http://code.google.com/p/simple-build-tool/. We've mainly done this as our project will be based on the Akka and the Lift framework which have also now switched to SBT.
SBT provides many of the features of Maven such as loading dependencies from remote repositories but is much simpler and the configuration is done in Scala rather than using messy xml files.
As part of this project I have found that JetBrains IntelliJ IDEA Community Edition seems to be the best Scala IDE I have tried and also has an SBT plug-in. As a bonus SBT has an action which will generate an Intellij IDEA project file configured to work with SBT.
To use this, go to the root of your SBT project and type sbt to start sbt, then enter:
*sbtIdeaRepo at http://mpeltonen.github.com/maven/
*idea is com.github.mpeltonen sbt-idea-processor 0.1-SNAPSHOT
update
idea
This will generate the .ipr file which you can then use
==============================================================
Update
Plug-ins are now stored globally in a $HOME/.sbt/plugins/build.sbt or C:\Documents and Settings\username\.sbt\plugins file which for this plugin the following contents should be added:
resolvers += "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"libraryDependencies += "com.github.mpeltonen" %% "sbt-idea" % "0.10.0"
Also the task is now called gen-idea
Note: In window use the command line to create a .sbt directory
See https://github.com/harrah/xsbt/wiki/Plugins for more details
Decoding VBE and Re-Coding VBS Files
Based on original article here
Since 2003 Microsoft has provided a command line script encoder available from http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e7877f67-c447-4873-b1b0-21f0626a6329&DisplayLang=en This tool encodes the script so it can't be read by a casual user but is no protection against a determined hacker.
Usage:
screnc ScriptFile
Note: You will need to install the download and also add the directory to your path to use it.
If you have a vbe script which you need to view/edit use create a new .vbs file and add the following in it:
Usage:
YourDecryptScriptName.vbs FileToDecrypt.vbe
The script will decode the vbe file, display it in a message box and also create/overwrite a new file called FileToDecrypt.vbe.vbs which you can edit
Since 2003 Microsoft has provided a command line script encoder available from http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e7877f67-c447-4873-b1b0-21f0626a6329&DisplayLang=en This tool encodes the script so it can't be read by a casual user but is no protection against a determined hacker.
Usage:
screnc ScriptFile
Note: You will need to install the download and also add the directory to your path to use it.
If you have a vbe script which you need to view/edit use create a new .vbs file and add the following in it:
option explicit
Dim oArgs, txtFileName
'Optional argument : the encoded filename
txtFileName=""
Set oArgs = WScript.Arguments
Select Case oArgs.Count
Case 0 'No Arg, popup a dialog box to choose the file
txtFileName=BrowseForFolder("Choose an encoded file", &H4031, &H0011)
Case 1
If Instr(oArgs(0),"?")=0 Then '-? ou /? => aide
txtFileName=oArgs(0)
End If
Case Else
WScript.Echo "Too many parameters"
End Select
Set oArgs = Nothing
If txtFileName<>"" Then
Dim fso
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(txtFileName) Then
Dim oFile,txtFileContents
Set oFile = fso.OpenTextFile(txtFileName, 1)
txtFileContents=oFile.readAll
oFile.close
Set oFile=Nothing
Const TagInit="#@~^" '#@~^awQAAA==
Const TagFin="==^#~@" '& chr(0)
Dim lStartCode, lExitCode
Do
lExitCode=0
lStartCode=Instr(txtFileContents,TagInit)
If lStartCode>0 Then
If (Instr(lStartCode,txtFileContents,"==")-lStartCode)=10 Then 'If "==" follows the tag
lExitCode=Instr(lStartCode,txtFileContents,TagFin)
If lExitCode>0 Then
txtFileContents=Left(txtFileContents,lStartCode-1) & _
Decode(Mid(txtFileContents,lStartCode+12,lExitCode-lStartCode-12-6)) & _
Mid(txtFileContents,lExitCode+6)
End If
End If
End If
Loop Until lExitCode=0
writeToFile txtFileName & ".vbs", txtFileContents
WScript.Echo txtFileContents
Else
WScript.Echo txtFileName & " not found"
End If
Set fso=Nothing
Else
WScript.Echo "Please give a filename"
WScript.Echo "Usage : " & wscript.fullname & " " & WScript.ScriptFullName & ""
End If
Sub writeToFile(txtFileName, txtFileContents)
Dim txtstr
Set txtstr = fso.CreateTextFile(txtFileName, True)
txtstr.write txtFileContents
txtstr.close
Set txtstr=Nothing
End Sub
Function Decode(txtBinChars)
Dim se,i,c,j,index,txtBinCharsTemp
Dim tDecode(127)
Const Combinaison="1231232332321323132311233213233211323231311231321323112331123132"
Set se=WSCript.CreateObject("Scripting.Encoder")
For i=9 to 127
tDecode(i)="JLA"
Next
For i=9 to 127
txtBinCharsTemp=Mid(se.EncodeScriptFile(".vbs",string(3,i),0,""),13,3)
For j=1 to 3
c=Asc(Mid(txtBinCharsTemp,j,1))
tDecode(c)=Left(tDecode(c),j-1) & chr(i) & Mid(tDecode(c),j+1)
Next
Next
'Next line we correct a bug, otherwise a ")" could be decoded to a ">"
tDecode(42)=Left(tDecode(42),1) & ")" & Right(tDecode(42),1)
Set se=Nothing
txtBinChars=Replace(Replace(txtBinChars,"@&",chr(10)),"@#",chr(13))
txtBinChars=Replace(Replace(txtBinChars,"@*",">"),"@!","<")
txtBinChars=Replace(txtBinChars,"@$","@")
index=-1
For i=1 to Len(txtBinChars)
c=asc(Mid(txtBinChars,i,1))
If c<128 Then index=index+1
If (c=9) or ((c>31) and (c<128)) Then
If (c<>60) and (c<>62) and (c<>64) Then
txtBinChars=Left(txtBinChars,i-1) & Mid(tDecode(c),Mid(Combinaison,(index mod 64)+1,1),1) & Mid(txtBinChars,i+1)
End If
End If
Next
Decode=txtBinChars
End Function
Function BrowseForFolder(ByVal pstrPrompt, ByVal pintBrowseType, ByVal pintLocation)
Dim ShellObject, pstrTempFolder, x
Set ShellObject=WScript.CreateObject("Shell.Application")
On Error Resume Next
Set pstrTempFolder=ShellObject.BrowseForFolder(&H0,pstrPrompt,pintBrowseType,pintLocation)
BrowseForFolder=pstrTempFolder.ParentFolder.ParseName(pstrTempFolder.Title).Path
If Err.Number<>0 Then BrowseForFolder=""
Set pstrTempFolder=Nothing
Set ShellObject=Nothing
End Function
Usage:
YourDecryptScriptName.vbs FileToDecrypt.vbe
The script will decode the vbe file, display it in a message box and also create/overwrite a new file called FileToDecrypt.vbe.vbs which you can edit
Friday, 10 September 2010
Starting & Stopping Services on Ubuntu
Get a list of services:
ls /etc/init.d
Then Stop/Start using servicename followed by action:
sudo invoke-rc.d servicename stop
sudo invoke-rc.d servicename stop
ls /etc/init.d
Then Stop/Start using servicename followed by action:
sudo invoke-rc.d servicename stop
sudo invoke-rc.d servicename stop
Monday, 23 August 2010
Oracle SQL to read a BLOB
Oracle SQL to read a BLOB
CREATE OR REPLACE PROCEDURE read_blob
IS
l_blob BLOB;
l_blob_length NUMBER;
l_amount BINARY_INTEGER := 10000; -- must be <= ~32765.
l_offset INTEGER := 1;
l_buffer RAW(20000);
l_text_buffer VARCHAR2(32767);
l_break_at PLS_INTEGER := 141; -- must be <= 255.
BEGIN
SELECT PZPVSTREAM INTO l_blob FROM PEGARULES.XCS_WORK
WHERE pxinsname = 'W-10332';
-- Figure out how long the BLOB is.
l_blob_length := DBMS_LOB.GETLENGTH(l_blob);
-- We'll loop through the BLOB as many times as necessary to
-- get all its data.
FOR i IN 1..CEIL(l_blob_length/l_amount) LOOP
-- Read in the given chunk of the BLOB.
DBMS_LOB.READ(l_blob
, l_amount
, l_offset
, l_buffer);
-- The DBMS_LOB.READ procedure dictates that its output be RAW.
-- This next procedure converts that RAW data to character data.
l_text_buffer := UTL_RAW.CAST_TO_VARCHAR2(l_buffer);
-- Now that we have character data (up to l_amount characters long),
-- chunk it out so that we can call DBMS_OUTPUT (which only accepts
-- arguments less than or equal to 255 characters).
FOR j IN 1..CEIL(LENGTH(l_text_buffer) / l_break_at) LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(l_text_buffer
, (((j - 1) * l_break_at) + 1)
, LEAST(LENGTH(l_text_buffer)
-
((j - 1) * l_break_at)
, l_break_at)));
END LOOP;
-- For the next iteration through the BLOB, bump up your offset
-- location (i.e., where you start reading from).
l_offset := l_offset + l_amount;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('!ERROR: ' || SUBSTR(SQLERRM,1,247));
END;
/
Friday, 26 March 2010
Fixing Michael Galpin's Comet Tutorial
I recently stumbled across the following tutorial on Comet:
Build Comet applications using Scala, Lift, and jQuery
http://www.ibm.com/developerworks/ajax/tutorials/wa-aj-comet/index.html
I was interested in this tutorial as comet is an alternative architecture to Ajax. In Ajax the browser makes calls (polls) to the web server in the background and then updates the users web page. This issue with this approach is that there is a delay between a change and the polling call. Also when you have a large number of users there will be a lot of polling calls hitting the web server that will not update the users web page (as there was no change).
Comet takes an alternative approach where it keeps a connection open to the user's browser and uses this to push data to the use. The benefit of this approach is that it essentially uses the Observer Pattern an only has web traffic when an update has been made which reduces load on the web server and is more scalable.
a potential replacement for Comet is Web Sockets in HTML 5 but this isn't supported by all browsers at present.
Anyway, when I tried building the tutorial I found that Michael had used a snapshot build to get new features but as this is a snapshot it is removed later from the Maven repositories giving this error:
This is easily fixed by moving to the released version by changing pom.xml from:
to the release version:
But unfortunately there were changes between the snapshot and the release which threw the following errors:
[INFO] Compiling 7 source files to C:\dev\scala\lift\broken_auctionNet\target\cl
asses at 1269595709118
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:44: error: value appendEarly is not a member of object net.liftweb.http.
LiftRules
[INFO] LiftRules.appendEarly(makeUtf8)
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:66: error: not found: type Can
[INFO] private def createOne: Can[Connection] = try {
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:87: error: not found: type Can
[INFO] def newConnection(name: ConnectionIdentifier): Can[Connection] =
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\org\developerworks\co
met\AuctionActor.scala:18: error: type mismatch;
[INFO] found : java.lang.String("auction")
[INFO] required: net.liftweb.util.Box[String]
[INFO] def defaultPrefix = "auction"
[INFO] ^
[ERROR] four errors found
The Can errors are fixed by replacing Can with Box in the two places in boot.scala
To fix the final error replace:
by boxing it Full and make it an override as follows:
This fixes the errors but when you compile you get the following error in boot.scala:
[INFO] Compiling 7 source files to C:\dev\scala\lift\broken_auctionNet\target\cl
asses at 1269597516624
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:44: error: value appendEarly is not a member of object net.liftweb.http.
LiftRules
[INFO] LiftRules.appendEarly(makeUtf8)
[INFO] ^
[ERROR] one error found
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
This is fixed by changing the line from:
to:
The code now compiles but when you start it using mvn jetty:run you get the following
2010-03-26 10:06:39.757:WARN::failed org.mortbay.jetty.plugin.Jetty6PluginWebApp
Context@33c78b{/,C:\dev\scala\lift\broken_auctionNet\src\main\webapp}: java.lang
.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: (
)Ljava/lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::failed ContextHandlerCollection@171bc3f: java.lang
.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: (
)Ljava/lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::failed HandlerCollection@1fddb33: java.lang.Verify
Error: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: ()Ljava/
lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::Error starting handlers
java.lang.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang sig
nature: ()Ljava/lang/Object;) Can only throw Throwable objects
at net.liftweb.http.LiftRules$.(LiftRules.scala:171)
This is resolved by increasing the Scala version to 2.7.3 from:
to:
Build Comet applications using Scala, Lift, and jQuery
http://www.ibm.com/developerworks/ajax/tutorials/wa-aj-comet/index.html
I was interested in this tutorial as comet is an alternative architecture to Ajax. In Ajax the browser makes calls (polls) to the web server in the background and then updates the users web page. This issue with this approach is that there is a delay between a change and the polling call. Also when you have a large number of users there will be a lot of polling calls hitting the web server that will not update the users web page (as there was no change).
Comet takes an alternative approach where it keeps a connection open to the user's browser and uses this to push data to the use. The benefit of this approach is that it essentially uses the Observer Pattern an only has web traffic when an update has been made which reduces load on the web server and is more scalable.
a potential replacement for Comet is Web Sockets in HTML 5 but this isn't supported by all browsers at present.
Anyway, when I tried building the tutorial I found that Michael had used a snapshot build to get new features but as this is a snapshot it is removed later from the Maven repositories giving this error:
[INFO] Failed to resolve artifact.
Missing:
----------
1) net.liftweb:lift-core:jar:0.10-SNAPSHOT
This is easily fixed by moving to the released version by changing pom.xml from:
net.liftweb
lift-core
0.10-SNAPSHOT
to the release version:
net.liftweb
lift-core
0.10
But unfortunately there were changes between the snapshot and the release which threw the following errors:
[INFO] Compiling 7 source files to C:\dev\scala\lift\broken_auctionNet\target\cl
asses at 1269595709118
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:44: error: value appendEarly is not a member of object net.liftweb.http.
LiftRules
[INFO] LiftRules.appendEarly(makeUtf8)
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:66: error: not found: type Can
[INFO] private def createOne: Can[Connection] = try {
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:87: error: not found: type Can
[INFO] def newConnection(name: ConnectionIdentifier): Can[Connection] =
[INFO] ^
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\org\developerworks\co
met\AuctionActor.scala:18: error: type mismatch;
[INFO] found : java.lang.String("auction")
[INFO] required: net.liftweb.util.Box[String]
[INFO] def defaultPrefix = "auction"
[INFO] ^
[ERROR] four errors found
The Can errors are fixed by replacing Can with Box in the two places in boot.scala
To fix the final error replace:
def defaultPrefix = "auction"
by boxing it Full and make it an override as follows:
override def defaultPrefix = Full("auction")
This fixes the errors but when you compile you get the following error in boot.scala:
[INFO] Compiling 7 source files to C:\dev\scala\lift\broken_auctionNet\target\cl
asses at 1269597516624
[ERROR] C:\dev\scala\lift\broken_auctionNet\src\main\scala\bootstrap\liftweb\Boo
t.scala:44: error: value appendEarly is not a member of object net.liftweb.http.
LiftRules
[INFO] LiftRules.appendEarly(makeUtf8)
[INFO] ^
[ERROR] one error found
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
This is fixed by changing the line from:
LiftRules.appendEarly(makeUtf8)
to:
LiftRules.early.append(makeUtf8)
The code now compiles but when you start it using mvn jetty:run you get the following
2010-03-26 10:06:39.757:WARN::failed org.mortbay.jetty.plugin.Jetty6PluginWebApp
Context@33c78b{/,C:\dev\scala\lift\broken_auctionNet\src\main\webapp}: java.lang
.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: (
)Ljava/lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::failed ContextHandlerCollection@171bc3f: java.lang
.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: (
)Ljava/lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::failed HandlerCollection@1fddb33: java.lang.Verify
Error: (class: net/liftweb/util/EmptyBox, method: open_$bang signature: ()Ljava/
lang/Object;) Can only throw Throwable objects
2010-03-26 10:06:39.757:WARN::Error starting handlers
java.lang.VerifyError: (class: net/liftweb/util/EmptyBox, method: open_$bang sig
nature: ()Ljava/lang/Object;) Can only throw Throwable objects
at net.liftweb.http.LiftRules$.
This is resolved by increasing the Scala version to 2.7.3 from:
2.7.2
to:
2.7.3
Subscribe to:
Posts (Atom)