<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1225072078993032081</id><updated>2012-02-16T15:34:44.222-05:00</updated><category term='Boston'/><category term='tomcat'/><category term='password enryption'/><category term='учеба'/><category term='японский'/><category term='MBTA'/><title type='text'>BikeDreamer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-8580546162063210809</id><published>2010-07-11T20:29:00.008-04:00</published><updated>2011-05-13T21:25:19.703-04:00</updated><title type='text'>Android guide to anime</title><content type='html'>I have my beautiful HTC EVO with big screen and was wondering, how can I watch an anime on it?&lt;br /&gt;My native language is Russian so I usually download anime with ass/ssa subtitles, which is not supported by android. Also, video files often come in MKV container with several audio tracks. Not supported by android either. Grrr.&lt;br /&gt;&lt;br /&gt;So, here my way of converting video files with subtitles to android format.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The problem could be separated into three steps:&lt;br /&gt;&lt;br /&gt;If original file in MKV container, subtitles should be extracted in separate file.&lt;br /&gt;We need to overlay ass/ssa subtitles over video and select correct audio stream.&lt;br /&gt;Then video should be encoded into supported format.&lt;br /&gt;1. Extracting subtitles from MKV&lt;br /&gt;&lt;br /&gt;If you have subtitles as separate file, you can skip this step and proceed to next one.&lt;br /&gt;&lt;br /&gt;Subtitles could be extracted from MKV file using mkvextract programm from MKVToolnix.&lt;br /&gt;&lt;br /&gt;Here is command line:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: shell"&gt;&lt;br /&gt;mkvextract tracks &amp;quot;Anime.mkv&amp;quot; X:&amp;quot;Anime.ass&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;'X' is a track number. Usually subtitles is the last track in MKV.&lt;br /&gt;&lt;br /&gt;2. Overlay subtitles over video and audio track selection&lt;br /&gt;&lt;br /&gt;Following program and libraries will be used in the step.&lt;br /&gt;&lt;br /&gt;AVISynth - tool for video post processing. Uses its own simple scripting language.&lt;br /&gt;&lt;br /&gt;MPC-HC - famous video player. Also can play AVISynth script files. Useful for testing.&lt;br /&gt;&lt;br /&gt;VSFilter - can be used as plugin for AVISynth for subtitle overlay.&lt;br /&gt;&lt;br /&gt;FFmpegSource - plugin for AVISynth to work with MP4/MKV files.&lt;br /&gt;&lt;br /&gt;As you can read on official web site, AviSynth is a powerful tool for video post-production. It provides ways of editing and processing videos. AviSynth works as a frameserver, providing instant editing without the need for temporary files. We will use ASISynth's script files as source video files for next step (actual encoding).&lt;br /&gt;&lt;br /&gt;Download and install AVISynth and MPC-HC. Download VSFilter and FFmpegSource and extract them into AVISynth's plugin directory.&lt;br /&gt;&lt;br /&gt;FFmpegSource's archive contains FFMS2.avsi file with set of functions. We are interested in "FFmpegSource2"&lt;br /&gt;&lt;br /&gt;Since video will be resized to fit android's resolution, we need access to video stream.&lt;br /&gt;&lt;br /&gt;Open FFMS2.avsi in any text editor and change&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;&lt;br /&gt;v = ffvideosource(...&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: cpp"&gt;&lt;br /&gt;&lt;br /&gt;global vFFmpegSource2 = ffvideosource(..,&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: cpp"&gt;&lt;br /&gt;&lt;br /&gt;return audiodubex(v,a)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: cpp"&gt;&lt;br /&gt;return audiodubex(vFFmpegSource2,a)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, you can access properties of video stream.&lt;br /&gt;&lt;br /&gt;I created following script to produce video steam  for encoding.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: cpp"&gt;&lt;br /&gt;vdeo = &amp;quot;Anime.mkv&amp;quot;&lt;br /&gt;sbtl = &amp;quot;Anime.ass&amp;quot;&lt;br /&gt;atrack=2&lt;br /&gt;targetW = 800.&lt;br /&gt;targetH = 480.&lt;br /&gt;&lt;br /&gt;FFmpegSource2(vdeo, vtrack=-1, atrack=atrack)&lt;br /&gt;converttoyv12()&lt;br /&gt;TextSub(sbtl)&lt;br /&gt;&lt;br /&gt;w =vFFmpegSource2.Width&lt;br /&gt;h =vFFmpegSource2.Height&lt;br /&gt;evoAR = targetW/targetH&lt;br /&gt;clippAR = 1.*w/h&lt;br /&gt;miltiplier = (clippAR&amp;gt;evoAR)?(targetW/w):(targetH/h)&lt;br /&gt;resizeW = floor(miltiplier*w)-floor(miltiplier*w)%2&lt;br /&gt;resizeH = floor(miltiplier*h)-floor(miltiplier*h)%2&lt;br /&gt;SincResize(resizeW,resizeH)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the script you can see three sections:&lt;br /&gt;&lt;br /&gt;Configuration section. First two lines are file's names of video file and subtitles. Then truck number of audio stream. Then size of the screen of android device. Dots are required since these values are float (not integer) type.&lt;br /&gt;This section reads video file with specified audio track and overlay subtitles.&lt;br /&gt;And final section resize video stream to fit device's resolution and keeps original ratio.&lt;br /&gt;Save the script as AVS file, for example Anime-with-subtitles.avs and try to play it with MPC-HC. If everything is correct, you should see video with subtitles over it. Let's proceed to final step.&lt;br /&gt;&lt;br /&gt;3. Encoding to MP4&lt;br /&gt;&lt;br /&gt;One of media format supported by Android OS is H.264 AVC in MP4 container.&lt;br /&gt;&lt;br /&gt;Here we will use FFmpeg.&lt;br /&gt;&lt;br /&gt;Android support only Baseline profile of H.264 and don't support some features so you need to configure x264 correct way. The easiest way to operate with all parameters of ffmpeg and its libraries via presets.&lt;br /&gt;&lt;br /&gt;Here is my preset file for android libx264-android.ffpreset:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: cpp"&gt;&lt;br /&gt;&lt;br /&gt;b=1000k&lt;br /&gt;coder=0&lt;br /&gt;flags=+loop&lt;br /&gt;cmp=+chroma&lt;br /&gt;partitions=+parti8x8+parti4x4+partp8x8+partb8x8&lt;br /&gt;me_method=umh&lt;br /&gt;subq=8&lt;br /&gt;me_range=16&lt;br /&gt;g=250&lt;br /&gt;keyint_min=25&lt;br /&gt;sc_threshold=40&lt;br /&gt;i_qfactor=0.71&lt;br /&gt;b_strategy=2&lt;br /&gt;qcomp=0.6&lt;br /&gt;qmin=10&lt;br /&gt;qmax=51&lt;br /&gt;qdiff=4&lt;br /&gt;bf=0&lt;br /&gt;refs=5&lt;br /&gt;directpred=3&lt;br /&gt;trellis=1&lt;br /&gt;flags2=+bpyramid+mixed_refs-wpred-dct8x8+fastpskip&lt;br /&gt;wpredp=0&lt;br /&gt;rc_lookahead=50&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First line is a bitrate, you can change it to fit your needs.&lt;br /&gt;&lt;br /&gt;And finally, command line to encode:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: shell"&gt;&lt;br /&gt;ffmpeg -i Anime-with-subtitles.avs -vcodec libx264 -vpre android -threads 0 Anime.mp4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, you can upload Anime.mp4 to your android device and watch it whenever you what.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-8580546162063210809?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/8580546162063210809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=8580546162063210809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/8580546162063210809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/8580546162063210809'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2010/07/android-guide-to-anime.html' title='Android guide to anime'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-5298677167797256733</id><published>2010-01-05T19:17:00.002-05:00</published><updated>2010-01-05T19:23:37.631-05:00</updated><title type='text'>Horrible perfomance of HashSet on Google App engine</title><content type='html'>I'm writing my own small project on Google app engine using Java, GWT, Spring and JDO.&lt;br /&gt;Recently I noticed that some operation are taking tooooo long to execute. I've inserted some logs and figured out that adding element to persistent HashSet on Google app engine takes something between 5 to 10 seconds. &lt;br /&gt;Ive switched to ArrayList and now the operations perform really fast. &lt;br /&gt;So, stay away from HashSet on Google app engine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-5298677167797256733?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/5298677167797256733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=5298677167797256733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/5298677167797256733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/5298677167797256733'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2010/01/horrible-perfomance-of-hashset-on.html' title='Horrible perfomance of HashSet on Google App engine'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-7882518728991916625</id><published>2009-11-27T12:47:00.008-05:00</published><updated>2009-11-27T14:03:23.409-05:00</updated><title type='text'>WebSphere automated deployment on Hudson</title><content type='html'>Hudson CI server provides plug-in for automated deployment to Tomcat or JBoss servers. But on my current job we use IBM WebSphere as application server in cluster environment. To implement nightly builds with automated testing we had to figure out way to automate deployment.&lt;br /&gt;General idea and code is based on &lt;a href="http://lresende.blogspot.com/2008/02/automating-websphere-with-maven-and.html"&gt;Luciano Resende's posting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Usual deployment procedure for IBM WebSphere cluster is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Stop cluster&lt;/li&gt;&lt;li&gt;Undeploy application&lt;/li&gt;&lt;li&gt;Deploy application and change application parameters like classloaders' order&lt;/li&gt;&lt;li&gt;Start cluster&lt;/li&gt;&lt;li&gt;As a part of automated testing procedure, we had to wait till start completes and then start test&lt;/li&gt;&lt;/ol&gt;All these steps could take 10-15 minutes depending on environment,  was security enabled or not, etc.&lt;br /&gt;To implement automated deployment for WebSphere we can use &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/txml_j2se.html"&gt;wsadmin thin client&lt;/a&gt; and Apache ant in conjunction with bash scripts.&lt;br /&gt;&lt;br /&gt;In order to use wsadmin remotely, several files need to be &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/txml_j2se.html"&gt;copied from IBM Websphere node manager&lt;/a&gt;.&lt;br /&gt;Wsadmin script, provided on IBM's site, didn't work for me, so I had to change it slightly.&lt;br /&gt;My version of wsadmin&lt;br /&gt;&lt;pre name="code" class="brush: bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;#set -x&lt;br /&gt;# example wsadmin launcher&lt;br /&gt;binDir=`dirname "$0"`&lt;br /&gt;# WAS_HOME should point to the directory for the thin client&lt;br /&gt;WAS_HOME="$binDir"&lt;br /&gt;USER_INSTALL_ROOT="$WAS_HOME"&lt;br /&gt;# JAVA_HOME should point to where java is installed for the thin client&lt;br /&gt;&lt;br /&gt;WAS_LOGGING="-Djava.util.logging.manager=com.ibm.ws.bootstrap.WsLogManager -Djava.util.logging.configureByServer=true"&lt;br /&gt;&lt;br /&gt;if [ -f ${JAVA_HOME}/bin/java ]; then&lt;br /&gt;  JAVA_EXE="${JAVA_HOME}/bin/java"&lt;br /&gt;else&lt;br /&gt;  JAVA_EXE="${JAVA_HOME}/jre/bin/java"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;CLIENTSOAP=-Dcom.ibm.SOAP.ConfigURL=file:"$USER_INSTALL_ROOT"/properties/soap.client.props&lt;br /&gt;CLIENTSAS=-Dcom.ibm.CORBA.ConfigURL=file:"$USER_INSTALL_ROOT"/properties/sas.client.props&lt;br /&gt;CLIENTSSL=-Dcom.ibm.SSL.ConfigURL=file:"$USER_INSTALL_ROOT"/properties/ssl.client.props&lt;br /&gt;&lt;br /&gt;wsadminTraceString=-Dcom.ibm.ws.scripting.traceString=com.ibm.*=all=enabled&lt;br /&gt;wsadminTraceFile=-Dcom.ibm.ws.scripting.traceFile="$USER_INSTALL_ROOT"/logs/wsadmin.traceout&lt;br /&gt;wsadminValOut=-Dcom.ibm.ws.scripting.validationOutput="$USER_INSTALL_ROOT"/logs/wsadmin.valout&lt;br /&gt;&lt;br /&gt;# For debugging the utility itself&lt;br /&gt;WAS_DEBUG="-Djava.compiler=NONE -Xdebug -Xnoagent"&lt;br /&gt;#-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777"&lt;br /&gt;&lt;br /&gt;SHELL=com.ibm.ws.scripting.WasxShell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Parse the input arguments&lt;br /&gt;isJavaOption=false&lt;br /&gt;nonJavaOptionCount=1&lt;br /&gt;for option in "$@" ; do&lt;br /&gt;if [ "$option" = "-javaoption" ] ; then&lt;br /&gt;   isJavaOption=true&lt;br /&gt;else&lt;br /&gt;   if [ "$isJavaOption" = "true" ] ; then&lt;br /&gt;      javaOption="$javaOption $option"&lt;br /&gt;      isJavaOption=false&lt;br /&gt;   else&lt;br /&gt;      nonJavaOption[$nonJavaOptionCount]="$option"&lt;br /&gt;      nonJavaOptionCount=$((nonJavaOptionCount+1))&lt;br /&gt;   fi&lt;br /&gt;fi&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;DELIM=" "&lt;br /&gt;C_PATH="$WAS_HOME/com.ibm.ws.admin.client_6.1.0.jar:$WAS_HOME/com.ibm.ws.security.crypto_6.1.0.jar"&lt;br /&gt;&lt;br /&gt;#Platform specific args...&lt;br /&gt;PLATFORM='/bin/uname'&lt;br /&gt;case $PLATFORM in&lt;br /&gt;AIX | Linux | SunOS | HP-UX)&lt;br /&gt;  CONSOLE_ENCODING=-Dws.output.encoding=console ;;&lt;br /&gt;OS/390)&lt;br /&gt;  EXTRA_D_ARGS="-Dfile.encoding=ISO8859-1 $DELIM-Djava.ext.dirs="$JAVA_EXT_DIRS""&lt;br /&gt;  EXTRA_X_ARGS="-Xnoargsconversion" ;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;# Set java options for performance&lt;br /&gt;PLATFORM=`/bin/uname`&lt;br /&gt;case $PLATFORM in&lt;br /&gt;AIX)&lt;br /&gt;    PERF_JVM_OPTIONS="-Xms256m -Xmx256m -Xquickstart" ;;&lt;br /&gt;Linux)&lt;br /&gt;    PERF_JVM_OPTIONS="-Xms256m -Xmx256m -Xj9 -Xquickstart" ;;&lt;br /&gt;SunOS)&lt;br /&gt;    PERF_JVM_OPTIONS="-Xms256m -Xmx256m -XX:PermSize=40m" ;;&lt;br /&gt;HP-UX)&lt;br /&gt;    PERF_JVM_OPTIONS="-Xms256m -Xmx256m -XX:PermSize=40m" ;;&lt;br /&gt;OS/390)&lt;br /&gt;    PERF_JVM_OPTIONS="-Xms256m -Xmx256m" ;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;"$JAVA_EXE" \&lt;br /&gt;$EXTRA_X_ARGS \&lt;br /&gt;$CONSOLE_ENCODING \&lt;br /&gt;$javaOption \&lt;br /&gt;$WAS_DEBUG \&lt;br /&gt;"$CLIENTSAS" \&lt;br /&gt;"$CLIENTSSL" \&lt;br /&gt;"$CLIENTSOAP" \&lt;br /&gt;${JAASSOAP:+"$JAASSOAP"} \&lt;br /&gt;-Dconfig_consistency_check="$CONFIG_CONSISTENCY_CHECK" \&lt;br /&gt;-Dwas.install.root="$WAS_HOME" \&lt;br /&gt;-Duser.install.root="$USER_INSTALL_ROOT" \&lt;br /&gt;$EXTRA_D_ARGS \&lt;br /&gt;$PERF_JVM_OPTIONS \&lt;br /&gt;$WAS_LOGGING \&lt;br /&gt;$wsadminTraceFile \&lt;br /&gt;$wsadminTraceString \&lt;br /&gt;$wsadminValOut \&lt;br /&gt;$wsadminHost \&lt;br /&gt;$wsadminConnType \&lt;br /&gt;$wsadminPort \&lt;br /&gt;$wsadminLang \&lt;br /&gt;-classpath "$C_PATH" \&lt;br /&gt;$SHELL "${nonJavaOption[@]}"&lt;br /&gt;&lt;br /&gt;exit $?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since we want use in on Hudson, probably on other server and locally, we need Ant script. &lt;br /&gt;It's kinda big and a lot of parameters repeats but it gives idea that's happening.&lt;br /&gt;&lt;pre name="code" class="brush: xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;project name="was-integration" basedir="."&amp;gt;&lt;br /&gt; &amp;lt;property environment="env"/&amp;gt;&lt;br /&gt; &amp;lt;property name="was.python.script" value="./wsIntegration.py"/&amp;gt;&lt;br /&gt; &amp;lt;property name="application.name" value="APPLICATION"/&amp;gt;&lt;br /&gt; &amp;lt;property name="application.cell" value="CELL"/&amp;gt;&lt;br /&gt; &amp;lt;property name="application.cluster" value="CLUSTER"/&amp;gt;&lt;br /&gt; &amp;lt;property name="host" value="HOST"/&amp;gt;&lt;br /&gt; &amp;lt;property name="port" value="PORT"/&amp;gt;&lt;br /&gt; &amp;lt;property name="application.ear" value="PATH_TO_EAR"/&amp;gt;&lt;br /&gt; &amp;lt;property name="wsadmin" value="${basedir}/wsadmin.sh"/&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;target name="clusterState" &amp;gt;&lt;br /&gt;   &amp;lt;exec dir="." executable="${wsadmin}" outputproperty="currentState"&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-conntype"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="SOAP"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-lang"/&amp;gt; &lt;br /&gt;    &amp;lt;arg value="jython"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-host"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-port" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-f"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${was.python.script}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="clusterState"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;target name="clusterStart" &amp;gt;&lt;br /&gt;   &amp;lt;exec dir="." executable="${wsadmin}"&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-conntype"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="SOAP"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-lang"/&amp;gt; &lt;br /&gt;    &amp;lt;arg value="jython"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-host"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-port" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-f"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${was.python.script}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="clusterStart"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;target name="clusterStopt" &amp;gt;&lt;br /&gt;   &amp;lt;exec dir="." executable="${wsadmin}"&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-conntype"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="SOAP"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-lang"/&amp;gt; &lt;br /&gt;    &amp;lt;arg value="jython"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-host"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-port" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-f"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${was.python.script}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="clusterStop"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="undeployApplication" &amp;gt;&lt;br /&gt;   &amp;lt;exec dir="." executable="${wsadmin}"&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-conntype"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="SOAP"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-lang"/&amp;gt; &lt;br /&gt;    &amp;lt;arg value="jython"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-host"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-port" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-f"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${was.python.script}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="undeployApplication"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.name}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;target name="redeployApplication" &amp;gt;&lt;br /&gt;   &amp;lt;exec dir="." executable="${wsadmin}"&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-conntype"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="SOAP"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-lang"/&amp;gt; &lt;br /&gt;    &amp;lt;arg value="jython"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-host"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-port" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-javaoption" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-Dwdm.http.host=${host}" /&amp;gt;&lt;br /&gt;    &amp;lt;arg value="-f"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${was.python.script}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="redeployApplication"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.ear}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;    &amp;lt;arg value="${application.name}"/&amp;gt;&lt;br /&gt;   &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="fullRedeploy"&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="clusterStopt"/&amp;gt;&lt;br /&gt;  &amp;lt;exec dir="." executable="./waitForState.sh"&amp;gt;&lt;br /&gt;   &amp;lt;arg value="Cluster State: websphere.cluster.stopped"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;  &amp;lt;/exec&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="undeployApplication"/&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="redeployApplication"/&amp;gt;&lt;br /&gt;  &amp;lt;antcall target="clusterStart"/&amp;gt;&lt;br /&gt;  &amp;lt;exec dir="." executable="./waitForState.sh"&amp;gt;&lt;br /&gt;   &amp;lt;arg value="Cluster State: websphere.cluster.running"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${host}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${port}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${application.cell}"/&amp;gt;&lt;br /&gt;   &amp;lt;arg value="${application.cluster}"/&amp;gt;&lt;br /&gt;  &amp;lt;/exec&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Most interesting last part then we stop cluster, wait till it shut downs completely, undeploy application, redeploy application, start cluster and wait will it starts successfully. &lt;br /&gt;&lt;br /&gt;We use jython as wsadmin programming language. &lt;br /&gt;Source code for wsIntegration.py&lt;br /&gt;&lt;pre name="code" class="brush: python"&gt;&lt;br /&gt;import sys&lt;br /&gt;def clusterStop(cell, cluster):&lt;br /&gt;  cluster = AdminControl.completeObjectName('cell='+cell+',type=Cluster,name='+cluster+',*')&lt;br /&gt;  print "Stop Cluster : %s"  % ( repr(cluster) )&lt;br /&gt;  AdminControl.invoke(cluster, 'stop')&lt;br /&gt;&lt;br /&gt;def clusterStart(cell, cluster):&lt;br /&gt;  cluster = AdminControl.completeObjectName('cell='+cell+',type=Cluster,name='+cluster+',*')&lt;br /&gt;  print "Start Cluster : %s"  % ( repr(cluster) )&lt;br /&gt;  AdminControl.invoke(cluster, 'start')&lt;br /&gt;&lt;br /&gt;def clusterState(cell, cluster):&lt;br /&gt;  cluster = AdminControl.completeObjectName('cell='+cell+',type=Cluster,name='+cluster+',*')&lt;br /&gt;  state = AdminControl.getAttribute(cluster, 'state')&lt;br /&gt;  print "Cluster State: %s" %(state)&lt;br /&gt;&lt;br /&gt;def appState(app):&lt;br /&gt;  state = AdminControl.completeObjectName('type=Application,name='+app+',*')&lt;br /&gt;  print "App State: %s" %(state)&lt;br /&gt;&lt;br /&gt;def undeployApplication(appName):&lt;br /&gt;  AdminApp.uninstall( appName )&lt;br /&gt;  AdminConfig.save()&lt;br /&gt;&lt;br /&gt;def redeployApplication(pathToFile, cell, cluster, appName):&lt;br /&gt;  print "installApplicationOnServer: fileName=%s appName=%s Cell=%s Cluster=%s" % ( pathToFile, appName, cell, cluster )&lt;br /&gt;  AdminApp.install(pathToFile,'[-nopreCompileJSPs -distributeApp -nouseMetaDataFromBinary -nodeployejb -appname "'+appName+'" -createMBeansForResources -noreloadEnabled -nodeployws -MapModulesToServers [["WEB_APP_NAME" WEB_APP_NAME.war,WEB-INF/web.xml WebSphere:cell='+cell+',cluster='+cluster+' ]] -MapWebModToVH [["WEB_APP_NAME" WEB_APP_NAME.war,WEB-INF/web.xml shared_host ]] -verbose]')&lt;br /&gt;  AdminConfig.save()&lt;br /&gt;  """modify classloader model for application"""&lt;br /&gt;  deploymentID = AdminConfig.getid('/Deployment:'+appName+'/')&lt;br /&gt;  deploymentObject = AdminConfig.showAttribute(deploymentID, 'deployedObject')&lt;br /&gt;  classldr = AdminConfig.showAttribute(deploymentObject, 'classloader')&lt;br /&gt;  AdminConfig.modify(classldr, [['mode', 'PARENT_LAST']])&lt;br /&gt;  """Modify WAR class loader model"""&lt;br /&gt;  AdminConfig.show(deploymentObject, 'warClassLoaderPolicy')&lt;br /&gt;  AdminConfig.modify(deploymentObject, [['warClassLoaderPolicy', 'SINGLE']])&lt;br /&gt;  AdminConfig.save()&lt;br /&gt;&lt;br /&gt;"""-----------------------------------------------------------&lt;br /&gt;   Phyton script to interface with WAS Admin/Management Tools&lt;br /&gt;-----------------------------------------------------------"""&lt;br /&gt;&lt;br /&gt;if len(sys.argv) &lt; 1:&lt;br /&gt;    print "wasAdminIntegration.py : need parameters : functionName &lt;args&gt;"&lt;br /&gt;    sys.exit(0)&lt;br /&gt;if(sys.argv[0] == 'clusterStop'):&lt;br /&gt;    clusterStop(sys.argv[1], sys.argv[2])&lt;br /&gt;if(sys.argv[0] == 'clusterStart'):&lt;br /&gt;    clusterStart(sys.argv[1], sys.argv[2])&lt;br /&gt;if(sys.argv[0] == 'clusterState'):&lt;br /&gt;    clusterState(sys.argv[1], sys.argv[2])&lt;br /&gt;if(sys.argv[0] == 'undeployApplication'):&lt;br /&gt;    undeployApplication(sys.argv[1])&lt;br /&gt;if(sys.argv[0] == 'appState'):&lt;br /&gt;    appState(sys.argv[1])&lt;br /&gt;if(sys.argv[0] == 'redeployApplication'):&lt;br /&gt;    redeployApplication(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this code, replace "WEB_APP_NAME" with real application name or change the script so it can be passed with the rest of parameters.&lt;br /&gt;&lt;br /&gt;For waiting part of the scripts, we will user same jython script in conjuction with bash.&lt;br /&gt;Source for waitForState.sh:&lt;br /&gt;&lt;pre name="code" class="brush: bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;binDir=`dirname "$0"`&lt;br /&gt;REQURED_STATE=$1&lt;br /&gt;WAS_HOST=$2&lt;br /&gt;WAS_PORT=$3&lt;br /&gt;WAS_CELL=$4&lt;br /&gt;WAS_CLUSTER=$5&lt;br /&gt;&lt;br /&gt;if [  ! -n "$REQURED_STATE"  ] || [  ! -n "$WAS_HOST"  ] || [  ! -n "$WAS_PORT"  ] || [  ! -n "$WAS_CELL"  ] || [  ! -n "$WAS_CLUSTER"  ];&lt;br /&gt;then&lt;br /&gt;echo "Usage: waitForState.sh &lt;state&gt; &lt;host&gt; &lt;port&gt; &lt;cell&gt; &lt;cluster&gt;"&lt;br /&gt;exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;CURR_STATE="" &lt;br /&gt;echo "CURR_STATE: $CURR_STATE"&lt;br /&gt;while [[ "$CURR_STATE" != "$REQURED_STATE" ]]&lt;br /&gt;do&lt;br /&gt;  sleep 20&lt;br /&gt; CURR_STATE="$($binDir/wsadmin.sh -conntype SOAP -lang jython -host $WAS_HOST -port $WAS_PORT -f ./wsAdminIntegration.py clusterState $WAS_CELL $WAS_CLUSTER |grep State:)" &lt;br /&gt; echo "Current State: $CURR_STATE"&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, now we can use all these code in conjunction just by calling  &lt;br /&gt;&lt;pre name="code" class="brush: bash"&gt;&lt;br /&gt;ant fullRedeploy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Output log should be monitored for Websphere errors. If it return "Result: 99" for every operation, then everything is fine, otherwise, something went wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-7882518728991916625?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/7882518728991916625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=7882518728991916625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/7882518728991916625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/7882518728991916625'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/11/websphere-automated-deployment-on.html' title='WebSphere automated deployment on Hudson'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-6854154505153583165</id><published>2009-11-02T16:00:00.014-05:00</published><updated>2009-11-27T13:16:01.977-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='password enryption'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Tomcat DataSource password encryption.</title><content type='html'>Sometime ago I ran into the problem with Tomcat DataSource definition - it doesn't allow encrypted password!&lt;br /&gt;Other enterprise application servers like IBM Websphere or Weblogic support that in some way, either by encrypting password during DataSource creation or during first start, if password was provided in clear text. &lt;br /&gt;Tomcat just doesn't do that, and because of that cannot pass Security Audit in my company. &lt;br /&gt;Spring tc server (which is a variation of Tomcat), provides functionality through &lt;a href="http://static.springsource.com/projects/tc-server/6.0/admin/cadmencrypt.html"&gt;custom property reader&lt;/a&gt;.&lt;br /&gt;Spring's changes have been already committed to Tomcat's trunc but at the moment it's not clear when they will hit release. &lt;br /&gt;And also, Spring tc is not free.&lt;br /&gt;&lt;br /&gt;So, we need to be able to specify DataSource with encrypted password in Tomcat. &lt;br /&gt;In Tomcat, DataSource is declared as "Resource". Something like &lt;br /&gt;&lt;pre name="code" class="brush: xml"&gt;&lt;br /&gt;&amp;lt;Resource  name="jdbc/MyDS" auth="Container" type="javax.sql.DataSource"  &lt;br /&gt;      driverClassName="oracle.jdbc.OracleDriver" url="CONNECTION_STRING" &lt;br /&gt;      username="USER_NAME"&lt;br /&gt;      password="PASSWORD"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this case, Tomcat sees that attribute 'type' equals to 'javax.sql.DataSource' and creates connection pool using BasicDataSourceFactory from tomcat-dbcp.jar library. &lt;br /&gt;But this happens only if you didn't specify 'factory' attribute. If you did, Tomcat will use the factory to create Resource object, and we will utilize the mean to implement password encryption for DataSource.&lt;br /&gt;&lt;br /&gt;Implementation of custom Object factory is shown below. &lt;br /&gt;It reads properties 'passwordProvider' and 'passwordFile' from Resource's configuration, decrypts password from file, adds it to configuration and then creates Resource object (in our case pooled DataSource) using standard BasicDataSourceFactory implementation.&lt;br /&gt;I don't provide implementation of MyPasswordProvider class. It's up to you to implement encoding mechanism with needed level of security.  &lt;br /&gt;&lt;pre name="code" class="brush: java"&gt;&lt;br /&gt;package my.home;&lt;br /&gt;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.util.Hashtable;&lt;br /&gt;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.Name;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import javax.naming.RefAddr;&lt;br /&gt;import javax.naming.Reference;&lt;br /&gt;import javax.naming.StringRefAddr;&lt;br /&gt;import javax.naming.spi.ObjectFactory;&lt;br /&gt;&lt;br /&gt;import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;&lt;br /&gt;&lt;br /&gt;public class DataSourceWithEncryptedPasswordFactoryimplements ObjectFactory {&lt;br /&gt; public static final String DBCP_DATASOURCE_FACTORY = "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory";&lt;br /&gt; public static final String PROP_PASSWORD = "password"; &lt;br /&gt; public static final String PASSWORD_PROVIDER = "passwordProvider";&lt;br /&gt; public static final String PASSWORD_FILE = "passwordFile";&lt;br /&gt; &lt;br /&gt; private BasicDataSourceFactory basicDataSourceFactory = null;&lt;br /&gt; private MyPasswordProvider passwordProvider = null;&lt;br /&gt; &lt;br /&gt; public EncryptedPasswordDataSourceFactory() {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Object getObjectInstance(Object obj, Name name, Context nameCtx,&lt;br /&gt;   Hashtable&lt;?, ?&gt; environment) throws Exception {&lt;br /&gt;  try {&lt;br /&gt;   basicDataSourceFactory = (BasicDataSourceFactory) Class.forName(DBCP_DATASOURCE_FACTORY).newInstance();&lt;br /&gt;  } catch (Throwable t) {&lt;br /&gt;   NamingException ex = new NamingException("Could not create resource factory instance internal");&lt;br /&gt;   ex.initCause(t);&lt;br /&gt;   throw ex;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  Reference ref = (Reference)obj;&lt;br /&gt;  &lt;br /&gt;  String sPasswordProvider = ref.get(PASSWORD_PROVIDER).getContent().toString();&lt;br /&gt;  if (sPasswordProvider != null &amp;&amp; sPasswordProvider.length() &gt; 0){&lt;br /&gt;   ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;   passwordProvider = (MyPasswordProvider)Class.forName(sPasswordProvider, true, loader).newInstance();&lt;br /&gt;   &lt;br /&gt;   String sPasswordFile = ref.get(PASSWORD_FILE).getContent().toString();&lt;br /&gt;   if (sPasswordFile != null &amp;&amp; sPasswordFile.length() &gt; 0){&lt;br /&gt;    URL file = loader.getResource(sPasswordFile);  &lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   String password = passwordProvider.getPassword(file);&lt;br /&gt;   &lt;br /&gt;   StringRefAddr newPasswordRA = new StringRefAddr(PROP_PASSWORD, password);&lt;br /&gt;   ref.add(0, newPasswordRA);&lt;br /&gt;  } &lt;br /&gt;  &lt;br /&gt;  return basicDataSourceFactory.getObjectInstance(obj, name, nameCtx, environment);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For the factory, Resource definition will look like that:&lt;br /&gt;&lt;pre name="code" class="brush: xml"&gt;&lt;br /&gt;&amp;lt;Resource  name="jdbc/MyDS" auth="Container" type="javax.sql.DataSource"  &lt;br /&gt;      factory="my.home.DataSourceWithEncryptedPasswordFactory"&lt;br /&gt;      passwordProvider="my.home.MyPasswordProvider"&lt;br /&gt;      passwordFile="PASSWORDFILE" &lt;br /&gt;      driverClassName="oracle.jdbc.OracleDriver" url="CONNECTION_STRING" &lt;br /&gt;      username="USER_NAME"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I hope this will help someone who is stuck with unencrypted passwords in Tomcat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-6854154505153583165?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/6854154505153583165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=6854154505153583165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/6854154505153583165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/6854154505153583165'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/11/aaa-int-z-0-bbb.html' title='Tomcat DataSource password encryption.'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-4660068096623336184</id><published>2009-07-08T14:42:00.003-04:00</published><updated>2009-07-08T15:12:09.642-04:00</updated><title type='text'>RAV4 - починка по гарантии</title><content type='html'>Где-то с год назад мы обнаружили, что в нашем свежекупленом RAV4 появляются довольно неприятные шумы когда слушаешь музыку с iPod'а, который заряжается. &lt;br /&gt;Так как iPod разряжался именно в те моменты, когда был нужен, я полез в просторы инета в поисках решения сей проблемы. &lt;br /&gt;Нашел сайт &lt;a href="http://rav4world.com"&gt;RAV4World&lt;/a&gt; и начал прочесывать его на наличие каких-либо упоминаний данной проблемы.&lt;br /&gt;В разделе TSBs (Technical Service Bulletins) нашел вот что&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;TSB Number: T-SB-0067-08 (replaced AU004-07)&lt;br /&gt;Bulletin Title: NOISE FROM AUXILIARY PORT WITH EXTERNAL DEVICE&lt;br /&gt;Release Date: My 21, 2008&lt;br /&gt;Applicable Year(s): 2006 - 2008&lt;br /&gt;&lt;br /&gt;Description: Some customers may notice noise in the auxiliary mode of the radio when using an MP3 player or other external audio source connected to the 12V power port of the vehicle. An improved auxiliary port and in-line filter has been developed to improve this condition. Use the repair procedure to install the new in-line filter and auxiliary port. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Что было точным описанием моей проблемы. И оно даже чинится по гарантии!&lt;br /&gt;&lt;br /&gt;Ну дальше вроде все должно быть просто, овезти машину к дилеру и починить. Ну что может быть проще?&lt;br /&gt;&lt;br /&gt;Ан нет, дилер об этом бюллетене не знает, и что бы он об этом узнал надо очень постараться.&lt;br /&gt;Обычные смертные на телефоне не знают о том, что TSB существуют и надо привлекать их менеджеров и менеджеров менеджеров что бы обяснить что же я от них хочу. &lt;br /&gt;И даже тогда они об этом TSB не знают и надо его факсом им послать. Хотя, насколько я понимаю, TSB высылаются только диллерам и обычные люди о них знать не должны. &lt;br /&gt;После этого надо раз в несколько дней названивать и спрашивать, как же там продвигается? И вот, в какой-то момент они говорят - мы детали заказали и когда их получим - позвоним.&lt;br /&gt;Ну ОК - ждем. &lt;br /&gt;И вот они позвонили, мы назначили сервис и поехали туда. Кстати сказать, надо этот сервис пройти в течении месяца, а то детали назад в тойоту отошлют.&lt;br /&gt;В самом дилершипе, мальчик. который принимает машины на сервис, не может переварить то, что нам надо нечто большее чем заменя масла. И опять его менеджер и менеджер менеджера и спустя минут 20 они таки понимают что им надо сделать. &lt;br /&gt;Уффф.&lt;br /&gt;Спустя некоторое время получам машине и теперь можно одновреммено слушать и заряжять iPod.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-4660068096623336184?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/4660068096623336184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=4660068096623336184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/4660068096623336184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/4660068096623336184'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/07/rav4.html' title='RAV4 - починка по гарантии'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-3133872980147383530</id><published>2009-05-12T22:10:00.002-04:00</published><updated>2009-05-12T22:15:26.488-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='учеба'/><category scheme='http://www.blogger.com/atom/ns#' term='японский'/><title type='text'>И как они разбирают?</title><content type='html'>Вот интересно, как японцы разбирают, как читать иероглиф は? ха или ва?&lt;br /&gt;Особенно если все предложение написано хираганой?&lt;br /&gt;Это знание,наверно, передается с молоком матери.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-3133872980147383530?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/3133872980147383530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=3133872980147383530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/3133872980147383530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/3133872980147383530'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/05/blog-post_8269.html' title='И как они разбирают?'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-1093436707094510807</id><published>2009-05-12T18:31:00.002-04:00</published><updated>2009-05-12T18:38:01.878-04:00</updated><title type='text'>Тоже откусано...</title><content type='html'>Кто-то там явно прошелся&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/78547742@N00/3499836948/" title="DSC_0008 by BikeDreamer, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3574/3499836948_92a6f1c34e.jpg" alt="DSC_0008" height="500" width="334" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-1093436707094510807?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/1093436707094510807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=1093436707094510807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/1093436707094510807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/1093436707094510807'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/05/blog-post_12.html' title='Тоже откусано...'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3574/3499836948_92a6f1c34e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-905915317459852046</id><published>2009-05-11T14:39:00.001-04:00</published><updated>2009-05-11T14:39:30.454-04:00</updated><title type='text'>покусаный знак</title><content type='html'>&lt;div style="text-align: left; padding: 3px;"&gt;&lt;a href="http://www.flickr.com/photos/78547742@N00/3499024681/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3661/3499024681_dd70f4bfc4.jpg" style="border: solid 2px #000000;" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.8em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/78547742@N00/3499024681/"&gt;DSC_0019&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/78547742@N00/"&gt;BikeDreamer&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-905915317459852046?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/905915317459852046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=905915317459852046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/905915317459852046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/905915317459852046'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/05/blog-post.html' title='покусаный знак'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3661/3499024681_dd70f4bfc4_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1225072078993032081.post-3834744826978435824</id><published>2009-05-07T11:23:00.003-04:00</published><updated>2009-09-23T14:35:18.965-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MBTA'/><category scheme='http://www.blogger.com/atom/ns#' term='Boston'/><title type='text'>MBTA Lost&amp;Found</title><content type='html'>Был приятно удивлен работой Lost and Found в нашем MBTA.&lt;br /&gt;Зачитался, вчера, книгу в поезде и оставил проездной на месяц воткнутым в сиденье. Обнаружил это тольео вечером, когда возвращялся домой.&lt;br /&gt;Думаю - блин, придется еше сотню выкладывать на биледы в этом месяце.&lt;br /&gt;&lt;br /&gt;Спросил сегодня утром проводника, "А не находили ли вы проездной на май вчера"&lt;br /&gt;Он: "А как же. Иди ты", говорит, "в Lost and Found на South Station и скажи что оставил проездной в поезде P510. Они тебе его и вернут."&lt;br /&gt;Так я и поступил, в результате чего снова с проездным.&lt;br /&gt;&lt;br /&gt;Пока я получал проездной, женщина принесла в Lost&amp;amp;Found черный зонт. Ох, думаю много их сейчас там...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1225072078993032081-3834744826978435824?l=yury.thingswedo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yury.thingswedo.org/feeds/3834744826978435824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1225072078993032081&amp;postID=3834744826978435824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/3834744826978435824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1225072078993032081/posts/default/3834744826978435824'/><link rel='alternate' type='text/html' href='http://yury.thingswedo.org/2009/05/mbta-lost.html' title='MBTA Lost&amp;Found'/><author><name>Bike Dreamer</name><uri>http://www.blogger.com/profile/00928224689377296218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_y9CRIib-LCI/S3MzbQwiWAI/AAAAAAAABRo/E8X0HNeA5Ac/S220/DSC_4163.JPG'/></author><thr:total>0</thr:total></entry></feed>
