Capistrano: deploy files other than used in development - ruby-on-rails

I have a rails application that uses some bash scripts that have different values (paths) in them for development and production. I want to use capistrano to deploy the app using the values suitable for production.
So for example in #{Rails.root}+'script.sh':
#!/bin/bash
/usr/local/bin/convert -colorspace sRGB -background transparent -font Myriad-Pro-Condensed -fill grey0 -stroke yellow -strokewidth 2 -size 640x480 -gravity $3 label:"$2" $1.png
For production I will need:
#!/bin/bash
/usr/bin/convert -colorspace sRGB -background transparent -font Myriad-Pro-Condensed -fill grey0 -stroke yellow -strokewidth 2 -size 640x480 -gravity $3 label:"$2" $1.png
Is there a solution which involves changing files on the fly, while deploying (with some gsub command, that changes values)?

An ERB template is probably the most straightforward. Inside the template you can access all the Capistrano variables so you can tell what stage you are in, etc. The cap code would look something like this:
template = File.read(File.join(File.dirname(__FILE__), "templates/script.sh.erb"))
result = ERB.new(template).result(binding)
put result, "#{release_path}/script.sh"

Related

Combine multiple command line commands into one single command (pipeline)

How do I combine the following ImageMagick command line commands into a single instruction:
convert -trim "C:\test\test.webp" -quality 95 "C:\test\testMaxNew.webp"
convert "C:\test\testMaxNew.webp" -resize 750x750 "C:\test\testMediumNew.webp"
convert "C:\test\testMediumNew.webp" -thumbnail 100x100^ "C:\test\testSmallNew.webp"
After some trial and error I came up with this:
convert -trim C:\test\test.webp -quality 95 -write mpr:XY +delete \( mpr:XY +write C:\test\testLargeNew.webp +delete \) \( mpr:XY -resize 750x750 +write C:\test\testMediumNew.webp +delete \) \( mpr:XY -resize 100x100^ -gravity center -extent 100x100 +write C:\test\testSmallNew.webp +delete \)
This does the trick but the following errors are reported in the command line prompt:
> convert: unable to open image '\(': No such file or directory #
> error/blob.c/OpenBlob/2695. convert: no decode delegate for this image
> format `' # error/constitute.c/ReadImage/508. convert: unable to open
> image '\)': No such file or directory # error/blob.c/OpenBlob/2695.
> convert: no decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\(':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\)':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: unable to open image '\(':
> No such file or directory # error/blob.c/OpenBlob/2695. convert: no
> decode delegate for this image format `' #
> error/constitute.c/ReadImage/508. convert: no images defined `\)' #
> error/convert.c/ConvertImageCommand/3235.
Can someone explain why I am getting these errors and if my code is correct?
The reason I am trying to combine multiple commands is to minimize processing time.
Version: ImageMagick 7.0.2-0 Q16 x64 on Windows 10
These should do what you want.
Best to read the input right after convert.
I am not sure why you need to resize and thumbnail.
So in Imagemagick try one of the following:
convert "C:\test\test.webp" -trim +repage -quality 95 -resize 750x750 -thumbnail 100x100^ "C:\test\testSmallNew.webp"
or just
convert "C:\test\test.webp" -trim +repage -quality 95 -thumbnail 100x100^ "C:\test\testSmallNew.webp"
Just adding an answer to clarify a couple of things that are not a good fit for comments.
You already have some excellent advice from Fred (#fmw42) as regards reading your input image immediately after convert because that way your command will continue to work when you upgrade to ImageMagick v7 which has already been available a couple of years.
You have added a command that works to your question, but that is a bit clumsy inasmuch as it creates an MPR which you don't need and also creates and destroys images unnecessarily - adding to system load which is undesirable if you have many images to process. I think you can see the following is simpler to understand and maintain, makes fewer copies and deletes and demands on memory, and should achieve the same effect as your command:
convert INPUT.webp -trim +repage -gravity center -quality 95 ^
+write LARGE.webp ^
-resize 350x350 +write MEDIUM.webp ^
-resize 100x100^ -extent 100x100 SMALL.webp

ImageMagick: Watermark image and keep file name

I have this code but I would like to edit it so the exported file name is the same as the file name used to make it
mogrify -composite -gravity center ~/Desktop/civmap-client-master/data/watermark.png ~/Desktop/civmap-client-master/data/nowm/*.png ~/Desktop/civmap-client-master/data/wm/*.png
It just throws an error when I used *.png as my exported file name. Please note I have multiple files in the /nowm/ directory. I am using a Mac.
Thanks alot :)
The mogrify command does not accept -composite as an operation as it takes just 2 images. You will have to use a loop:
cd ~/Desktop/where/the/input/images/are
for f in *.png; do
echo $f
convert -gravity center "$f" "~/Desktop/path/to/watermark.png" -composite "~/Desktop/path/to/output/$f"
done

Converting special characters with ImageMagick

I am using a PowerShell script to batch convert Unicode characters to PNG files. See http://pastebin.com/aGJzk4Hh.
I was able to figure out that to convert the " character one must use the designation label:\".
The other special characters are not so simple.
C:\ImageMagick\convert.exe -background transparent -fill hsb(0,0,0) \
-font Arial -pointsize 18 -size 18x26 -gravity center label:"#" \
C:\Users\erics_000\Desktop\Output\Chars\40.png
convert.exe: UnableToAccessPath # error/property.c/InterpretImageProperties/3330.
convert.exe: NoImagesDefined `C:\Users\erics_000\Desktop\Output\Chars\40.png' # error/convert.c/ConvertImageCommand/3230.
as well as:
C:\ImageMagick\convert.exe -background transparent -fill hsb(0,0,0) \
-font Arial -pointsize 18 -size 18x26 -gravity center label:"\" \
C:\Users\erics_000\Desktop\Output\Chars\5C.png
convert.exe: NoImagesDefined `label:" C:\Users\erics_000\Desktop\Output\Chars\5C.png' # error/convert.c/ConvertImageCommand/3230.
have been very problematic for me.
I have tried every way I know how to escape those characters by way of \ however nothing yet has proven to work. I will need to be able to convert all Unicode characters, \ and # included.
Is it known how these can be converted to PNG files with ImageMagick?
1st question: Did you check that your version of Arial does include glyphs for the Unicode characters in question?
Ok, if it is also about the \ and # characters, then that shouldn't pose a problem. This leads me to the...
2nd question: Which version of ImageMagick do you have installed? Can you report the result of convert -version?
Here is my result with ImageMagick v6.9.0-0 on a Mac OS X Mavericks 10.9 system:
convert -background black -fill red -pointsize 96 label:' # \\ # \\ # ' sample.png
and (note the blanks starting and ending my string!):
convert -background transparent -fill hsb\(0,0,0\) -font Arial \
-pointsize 180 -size 190x210 -gravity center label:' # ' \
-frame 1 \
sample2.png
If you need to emit real Unicode glyphs from an input consisting of Unicode character codes, you can do this with the help of Perl. I guess that Powershell has also a method for this, but I'm not familiar with it):
perl -e 'binmode(STDOUT, ":utf8"); \
print " Smiley: \x{263A} "' \
| convert -background black \
-fill red \
-pointsize 98 \
-font Menlo \
label:#- \
smiley.png
(Note: the #- syntax just tells convert to read input string for the label from standard input...)

ImageMagick annotate with PHP variable

I currently run the following command to annotate an image with the variable $handle
When running on a LAMP, everything worked fine and the $handle variable was put into the image. However running on a WAMP, the two apostrophes around the variable are being included into the variable. Which adds a ' to the front and end of the variable. Here is what I'm running. Any ideas why?
exec("C:\ImageMagick\convert $final -font handle_font.ttf -pointsize $font_size -fill
black -annotate $pos_black '$handle' -fill white -annotate $pos_white '$handle'
-flatten $final");
On windows you need to swap the ' for " and in your case escape it with a \
\"$handle\"
Write your code like this and you can then echo out the $cmd and see what it contains:
$cmd = " $final -font handle_font.ttf -pointsize $font_size -fill black -annotate $pos_black \"$handle\" -fill white -annotate $pos_white \"$handle\" -flatten ";
echo $cmd.'<br>';
exec("C:\ImageMagick\convert $cmd $final");

PHP use of IMAGEMAGICK or imagick or magicwand

I use Imagemagick (www.imagemagick.org)
Since i am on hostgator i also have imagick and magickwand installed.
I can do simple manipulation with imagick and magickwand but if i want to reproduce the advanced tutorials at imagemagick.org i fail.
Goal:
make this working http://www.imagemagick.org/Usage/advanced/#jigsaw
Questions:
How can i do this with imagick or magickwand?
Could i somehow also communicate with the module imagemagick through command line, like exec(....)?
Thanks 4 short help
You can use exec() or shell_exec().
For example:
exec('/path/to/your/imagick/convert jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png');
One more reminder, exec() will not work in PHP safe mode.
Okay. The solution using the command-line commands straight is like the following:
exec("/usr/lib/convert user/set/seinfeld/image/image/data/apple_cinema_30.jpg -edge .5 -blur 0x.5 jaw_ege.png");
so obviously you have to know the path to the module and set the path to the images correctly (a).
will update if necessary with the instructions for imagick/magickwand.
I think it is to complicated to be run in Imagick - not saying it could not be - and as said above the best bet would be Imagemagick command line and exec( ). Build it up one command at a time; you may be able to combine commands later. Do not use jpg for any intermediate images as you will start to loose quality.
It depends what effect you are after as Anthony has a Bash script you could use linked towards the bottom of that section of the page.
You can run that with php using exec:
Upload the script to your server
CHMOD it to either 755 or 777 depending on your server setup
// Run the script
exec("/FULL PATH TO JIGSAW/jigsaw options input.jpg mask.png output.png 2>&1", $array);
//Display any errors
echo "<br>".print_r($array)."<br></pre>";
I do not know if this will work on a Hostgator account but I can not see why not.
Also I have not tried it and you need a mask image to go with your input image.
I have just tried this on my server and get an error: /bin/bash^M: bad interpreter: No such file or directory
This means nothing to me!
Making one jigsaw piece using Anthony's images and code with Imagemagick commaand line and exec( )
exec("convert jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png");
$cmd = " holocaust_md.jpg \( jigsaw_edge.png -negate \) -geometry +365+96 ".
" -compose multiply -composite -crop 100x100+365+96 +repage ";
exec("convert $cmd jigsaw_outline.png");
$cmd = " holocaust_md.jpg -crop 100x100+365+96! -background none -flatten ".
" +repage \( jigsaw_tmpl.png +matte \) -compose CopyOpacity -composite ".
" -rotate -20 -gravity center -crop 100x100+0+0 +repage ";
exec("convert $cmd jigsaw_cutout.png");
$cmd = " jigsaw_cutout.png \( +clone -channel A -separate +channel -negate ".
" -background black -virtual-pixel background -blur 0x2 -shade 120x21.78 ".
" -contrast-stretch 0% +sigmoidal-contrast 7x50% -fill grey50 -colorize 10% ".
" +clone +swap -compose overlay -composite \) -compose In -composite ";
exec("convert $cmd jigsaw_bevel.png");
$cmd = " jigsaw_bevel.png \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) ".
" \( +clone -repage +1+2 \) \( +clone -repage +1+3 \) \( +clone -repage +2+4 \) ".
" \( +clone -repage +2+5 \) -background none -compose DstOver -flatten";
exec("convert $cmd jigsaw_thickness.png");
$cmd = " jigsaw_thickness.png \( +clone -background Black -shadow 50x3+4+4 \) ".
" -background none -compose DstOver -flatten";
exec("convert $cmd jigsaw_shadow.png");

Resources