Search
Archive

You are currently browsing the archives for the TechTips category.

Categories
Ad

Archive for the ‘TechTips’ Category

Dump YAML Strings with UTF-8 multibyte characters in Ruby

Tuesday, June 16th, 2009

Problem

You want to dump your Ruby object to YAML-formatted file, but your object contains UTF-8 multibyte characters. In this situation, original yaml dumper will output in a human-unfriendly format like

  - !binary |
   5a6X6LC35bKs

Solution

The easiest way to solve is to use ya2yaml.

 sudo gem install ya2yaml

Then, in your source code,

open("save.yml", "w") do |f| 
 f.write multiByteObj.ya2yaml
end

Export Selected Area from Illustrator

Monday, June 15th, 2009

Problem

You want to export some parts of artwork from Illustrator.

Solution


  1. Choose Trimarea tool (Shift+O) to create a Trim area.
  2. Select the artwork elements you want to export.
  3. Adjust the trimarea with your mouse if you need to.
  4. Choose File -> Print to show up Printer settings dialog.
  5. In the Dialog, go to Setup and change the value of Trimming to Trimarea.
  6. Click Finish to close the dialog.
  7. Choose File -> Export and select the format you want to export as.

If you choose to export your artwork as PNG format, you will see a preview image. You can check you just created a right trimarea.

gisty for gist and gisty for Ruby1.9.1

Sunday, June 14th, 2009

Introduction

gist is a simple web service by github for posting and sharing your cool code snippets. gisty is a command-line client for gist.

Installation of gisty

sudo gem install nokogiri
sudo gem sources -a http://gems.github.com
sudo gem install swdyh-gisty

Usage

Posting a source code is as easy as

 gisty post hello.c world.c

Also, you can ‘clone’ all your code snippets.

 gisty sync

For more information, type

 gisty help





And the problem is…

Problem

gisty does not work with Ruby1.9.1.

Solution

I made a forked version of gisty on github repos. Soon, you will be able to download this version

sudo gem install tomoya55-gisty

Notice: you cannot install tomoya55-gisty at this moment. I am now investigating what is going on on my gems. Thank you.

Copy File Paths from Finder

Saturday, June 13th, 2009

Problem

You want to copy the Path of file(s) shown in Finder.

Solution

090613-0001

CopyPath is a grat solution for our problem. After downloading CopyPath.zip, unzip it and copy the app to Application direcotry. Then drag the CopyPath Icon to Finder’s toolbar area. Now, you will see CopyPath button on your Finder.

When the button is clicked, the paths of files selected in Finder will be copied to your clipboard.

Thank you for nice application, David.

HTML Table height

Wednesday, June 10th, 2009

Problem

I want to set the height of table rows in HTML.

Solution

You can set the height attribute in TR tags.

50 not set
not set not set


<tr><td height="50px">50</td><td>not set</td></tr>



[NOTE]  Be careful. You cannot set the height attribute in TR.

jquery-in-place-editor Keeping-NewLine version.

Wednesday, June 10th, 2009

Problem

I am using jquery-in-place-editor plugin. Most of all, this plugin works nice. Except one point.
Newlines(n) are always ignored even if I use the ‘textarea’ input.

Solution

Here is the new version of jquery-in-place-editor plugin. I just added String#br2newline() function and changed to show $(element).html() when ‘textarea’ input is used. The original one showed $(element).text() in ‘textarea’, which always removes *ANY* html tags from the contents.

The scirpt can be downloaded from here.

/** 
 * Another In Place Editor - a jQuery edit in place plugin (Keeping-newline version)
 * 
 * 2009 NiceCabbage and Tomoya Hirano
 * 
 * License: BSD lincense.
 */
 
/*
 * Another In Place Editor - a jQuery edit in place plugin
 *
 * Copyright (c) 2009 Dave Hauenstein
 *
 * License:
 * This source file is subject to the BSD license bundled with this package.
 * Available online: {@link http://www.opensource.org/licenses/bsd-license.php}
 * If you did not receive a copy of the license, and are unable to obtain it,
 * email davehauenstein@gmail.com,
 * and I will send you a copy.
 *
 * Project home:
 * http://code.google.com/p/jquery-in-place-editor/
 *
 */
 
/*
 * Version 1.0.2
 *
 * bg_out (string) default: transparent hex code of background color on restore from hover
 * bg_over (string) default: #ffc hex code of background color on hover
 * callback (function) default: null function to be called when editing is complete; cancels ajax submission to the url param
 * cancel_button (string) default: <input type=”submit” class=”inplace_cancel” value=”Cancel”/> image button tag to use as “Cancel” button
 * default_text (string) default: “(Click here to add text)” text to show up if the element that has this functionality is empty
 * element_id (string) default: element_id name of parameter holding element_id
 * error (function) this function gets called if server responds with an error
 * field_type (string) “text”, “textarea”, or “select”; default: “text” The type of form field that will appear on instantiation
 * on_blur (string) “save” or null; default: “save” what to do on blur; will be overridden if $param show_buttons is true
 * original_html (string) default: original_html name of parameter holding original_html
 * params (string) example: first_name=dave&last_name=hauenstein paramters sent via the post request to the server
 * save_button (string) default: <input type=”submit” class=”inplace_save” value=”Save”/> image button tag to use as “Save” button
 * saving_image (string) default: uses saving text specify an image location instead of text while server is saving
 * saving_text (string) default: “Saving…” text to be used when server is saving information
 * select_options (string) comma delimited list of options if field_type is set to select
 * select_text (string)default text to show up in select box
 * show_buttons (boolean) default: false will show the buttons: cancel or save; will automatically cancel out the onBlur functionality
 * success (function) default: null this function gets called if server responds with a success
 * textarea_cols (integer) default: 25 set cols attribute of textarea, if field_type is set to textarea
 * textarea_rows (integer) default: 10 set rows attribute of textarea, if field_type is set to textarea
 * update_value (string) default: update_value name of parameter holding update_value
 * url (string) POST URL to send edited content
 * value_required (string) default: false if set to true, the element will not be saved unless a value is entered
 *
 */
 
jQuery.fn.editInPlace = function(options) {
 
	/* DEFINE THE DEFAULT SETTINGS, SWITCH THEM WITH THE OPTIONS USER PROVIDES */
	var settings = {
		url:				"",
		params:				"",
		field_type:			"text",
		select_options:		"",
		textarea_cols:		"25",
		textarea_rows:		"10",
		bg_over:			"#ffc",
		bg_out:				"transparent",
		saving_text:		"Saving...",
		saving_image:		"",
		default_text:		"(Click here to add text)",
		select_text:		"Choose new value",
		value_required:		null,
		element_id:			"element_id",
		update_value:		"update_value",
		original_html:		"original_html",
		save_button:		'<button class="inplace_save">Save</button>',
		cancel_button:		'<button class="inplace_cancel">Cancel</button>',
		show_buttons:		false,
		on_blur:			"save",
		callback:			null,
		callbackShowErrors: true,
		success:			null,
		error:				function(request){
                                alert("Failed to save value: " + request.responseText || 'Unspecified Error');
                            }
	};
 
	if(options) {
		jQuery.extend(settings, options);
	}
 
	/* preload the loading icon if it exists */
	if(settings.saving_image != ""){
		var loading_image = new Image();
		loading_image.src = settings.saving_image;
	}
 
	/* THIS FUNCTION WILL TRIM WHITESPACE FROM BEFORE/AFTER A STRING */
	String.prototype.trim = function() {
		return this.replace(/^\s+/, '')
							 .replace(/\s+$/, '');
	};
 
	/* THIS FUNCTION WILL ESCAPE ANY HTML ENTITIES SO "Quoted Values" work */
	String.prototype.escape_html = function() {
		return this.replace(/&/g, "&amp;")
							 .replace(/</g, "&lt;")
							 .replace(/>/g, "&gt;")
							 .replace(/"/g, "&quot;");
  	};
 
  	String.prototype.br2newline = function() {
		return this.replace(/<br\s*\/>/g, "\n")
					.replace(/<br\s*>/g, "\n");
  	};
 
	/* CREATE THE INPLACE EDITOR */
	return this.each(function(){
 
		if(jQuery(this).html() == "") jQuery(this).html(settings.default_text);
 
		var editing = false;
 
		//save the original element - for change of scope
		var original_element = jQuery(this);
 
		var click_count = 0;
 
		jQuery(this)
 
		.mouseover(function(){
			jQuery(this).css("background", settings.bg_over);
		})
 
		.mouseout(function(){
			jQuery(this).css("background", settings.bg_out);
		})
 
		.click(function(){
			click_count++;
 
			if(!editing)
			{
				editing = true;
 
				//save original text - for cancellation functionality
				var original_html = jQuery(this).html();
				var buttons_code  = (settings.show_buttons) ? settings.save_button + ' ' + settings.cancel_button : '';
 
				//if html is our default text, clear it out to prevent saving accidentally
				if (original_html == settings.default_text) jQuery(this).html('');
 
				if (settings.field_type == "textarea")
				{
					var use_field_type = '<textarea name="inplace_value" class="inplace_field" rows="' + settings.textarea_rows + '" cols="' + settings.textarea_cols + '">' + original_html.br2newline().trim().escape_html() + '</textarea>';
				}
				else if(settings.field_type == "text")
				{
					var use_field_type = '<input type="text" name="inplace_value" class="inplace_field" value="' +
											jQuery(this).text().trim().escape_html() + '" />';
				}
				else if(settings.field_type == "select")
				{
					var optionsArray = settings.select_options.split(',');
					var use_field_type = '<select name="inplace_value" class="inplace_field"><option value="">' + settings.select_text + '</option>';
						for(var i=0; i<optionsArray.length; i++){
							var optionsValuesArray = optionsArray[i].split(':');
							var use_value = optionsValuesArray[1] || optionsValuesArray[0];
							var selected = use_value == original_html ? 'selected="selected" ' : '';
							use_field_type += '<option ' + selected + 'value="' + use_value.trim().escape_html() + '">' + optionsValuesArray[0].trim().escape_html() + '</option>';
                        }
						use_field_type += '</select>';
				}
 
				/* insert the new in place form after the element they click, then empty out the original element */
				jQuery(this).html('<form class="inplace_form" style="display: inline; margin: 0; padding: 0;">' + use_field_type + ' ' + buttons_code + '</form>');
 
			}/* END- if(!editing) -END */
 
			if(click_count == 1)
			{
				function cancelAction()
				{
					editing = false;
					click_count = 0;
 
					/* put the original background color in */
					original_element.css("background", settings.bg_out);
 
					/* put back the original text */
					original_element.html(original_html);
 
					return false;
				}
 
				function saveAction()
				{
					/* put the original background color in */
					original_element.css("background", settings.bg_out);
 
                    var this_elem = jQuery(this);
 
					var new_html = (this_elem.is('form')) ? this_elem.children(0).val() : this_elem.parent().children(0).val();
 
					/* set saving message */
					if(settings.saving_image != ""){
						var saving_message = '<img src="' + settings.saving_image + '" alt="Saving..." />';
					} else {
						var saving_message = settings.saving_text;
					}
 
					/* place the saving text/image in the original element */
					original_element.html(saving_message);
 
					if(settings.params != ""){
						settings.params = "&" + settings.params;
					}
 
					if(settings.callback) {
						html = settings.callback(original_element.attr("id"), new_html, original_html, settings.params);
						editing = false;
						click_count = 0;
						if (html) {
							/* put the newly updated info into the original element */
							original_element.html(html || new_html);
						} else {
							/* failure; put original back */
							if(settings.callbackShowErrors)
							{
							    alert("Failed to save value: " + new_html);
							}
							original_element.html(original_html);
						}
					} else if (settings.value_required && (new_html == "" || new_html == undefined)) {
						editing = false;
						click_count = 0;
						original_element.html(original_html);
						alert("Error: You must enter a value to save this field");
					} else {
						jQuery.ajax({
							url: settings.url,
							type: "POST",
							data: settings.update_value + '=' + new_html + '&' + settings.element_id + '=' + original_element.attr("id") + settings.params + '&' + settings.original_html + '=' + original_html,
							dataType: "html",
							complete: function(request){
								editing = false;
								click_count = 0;
							},
							success: function(html){
								/* if the text returned by the server is empty, */
   								/* put a marker as text in the original element */
								var new_text = html || settings.default_text;
 
								/* put the newly updated info into the original element */
								original_element.html(new_text);
								if (settings.success) settings.success(html, original_element);
							},
							error: function(request) {
								original_element.html(original_html);
								if (settings.error) settings.error(request, original_element);
							}
						});
					}
 
					return false;
				}
 
				/* set the focus to the new input element */
				original_element.children("form").children(".inplace_field").focus().select();
 
				/* CLICK CANCEL BUTTON functionality */
				original_element.children("form").children(".inplace_cancel").click(cancelAction);
 
				/* CLICK SAVE BUTTON functionality */
				original_element.children("form").children(".inplace_save").click(saveAction);
 
                /* if cancel/save buttons should be shown, cancel blur functionality */
                if(!settings.show_buttons){
                    /* if on_blur is set to save, set the save funcion */
    				if(settings.on_blur == "save")
    					original_element.children("form").children(".inplace_field").blur(saveAction);
    				/* if on_blur is set to cancel, set the cancel funcion */
    				else
    					original_element.children("form").children(".inplace_field").blur(cancelAction);
                }
 
				/* hit esc key */
				$(document).keyup(function(event){
				    if (event.keyCode == 27) {
						cancelAction();
				    }
				});
 
                original_element.children("form").submit(saveAction);
 
			}/* END- if(click_count == 1) -END */
		});
	});
};

And the Server-side script example in Ruby.

cgi = CGI.new
print cgi.header
print cgi['update_value'].gsub( /\n/, '<br>' )

Enjoy it!

Advanced Tables

Tuesday, June 9th, 2009

Problem

I want to merge two or more cells in a HTML Table

Solution

You can use “colspan” or “rowspan” attributes.

merged cell
cell1 cell2 cell3

<tr><th colspan="3">merged cell</th></tr>
<tr><td>cell1</td><td>cell2</td><td>cell3</td></tr>
merged cell2 cell3
cell4 cell5

<tr><td rowspan="2">merged</td><td>cell2</td><td>cell3</td></tr>
<tr><td>cell4</td><td>cell5</td></tr>

Check Syntax of Apache httpd.conf

Monday, June 8th, 2009

Problem

I want to check my httpd.conf and its including files.

Solution

Try running httpd.exe with “-t” option.

Hosts file in Windows

Monday, June 8th, 2009

Problem

Where can I find the hosts file in Windows?
I want to add “me-only” domainnames since I am currently developing new web site.

Solution

The hosts file can be found at

C:\Windows\system32\drivers/etc\hosts

Fortunately, the syntax is the same as that of your familiar Linux hosts.
So you can add new entry like,

12.34.56.78     www.example.com

More Than One Classname to one HTML Tag

Monday, June 8th, 2009

Problem:

I want to add one more classnames to one HTML tag

Solution:

It is not so hard, just put all the classnames with separated by spaces, like

<div class="class1 class2 class3"> ... </div>