How to Configure a VNC Server in Linux

Step 1

Find out if VNC is already installed on your Linux distro. Users of Ubuntu and Fedora, two of the more common distros, already have VNC servers installed and don’t need to install anything.
Not running one of these two mainstream distros? Run a search in your distro’s package manager for VNC clients—if you’re running Gnome, look for “vinagre”; if you’re running KDE look for “kfrb.” If the packages aren’t already installed, install them using your distro’s tools.

Step 2

Configure VNC. How to do this varies depending on which desktop you’re using. Gnome users can click “System,” then “Preferences,” then “Remote Desktop,” to bring up the configuration window; KDE users should click “System Settings,” then “Sharing,” then “Desktop Sharing,” then “Configure,” to bring up the dialogue. Allow users to see your desktop by clicking the appropriate box and then adding a password.

Step 3

Test the configuration. Using another computer on the network, attempt to connect to your IP with a VNC client by entering the computer’s IP address (find the IP address by typing “ifconfig” at a terminal.) If all went well, the desktop of the computer with the server installed should pop up as expected. Congratulations!

Instruction on how install Perl DBD on IBM AIX 5.3 Unix

It is challenging to install perl DBD on IBM AIX. There are several different ways to install and compile Perl DBD on AIX. Definitely check out the REAME file. I have tried many different ways, and the following steps actually got me through the complete installation without error.

First you need to install Perl and DBI. When setting environment variables, you should update the following according to your path.

Set the following environment variables:
export PATH=$PATH:/usr/vacpp/bin
export ORACCENV='cc=xlc_r'
export LIBPATH=$LIBPATH:/a01/oracle/lib32:/usr/ccs/lib
export LD_RUN_PATH=/a01/oracle/lib32:/usr/ccs/lib

Run the following commands:

cpan

install T/TI/TIMB/DBI-1.53.tar.gz

cpan

look P/PY/PYTHIAN/DBD-Oracle-1.22.tar.gz

perl Makefile.PL -nob

Run as root:
ln -s /usr/lib /lib32

export ORACLE_USERID=oracle_user/oracle_password@ccbprd

perl Makefile.PL -m $ORACLE_HOME/rdbms/demo/demo_rdbms32.mk

perl -p -i -e 's/-q32//g' Makefile

make test

Now, if everything OK, run:

make install

VB.NET Crystal Reports Formula Fields

If you have a Crystal Reports with Qty and Price , you need an additional field in your Crystal Reports for the Total of QTY X PRICE . In this situation you have to use the Formula Field in Crystal Reports.
In this tutorial we are showing the all orders with qty and price and the total of each row , that means each in each row we are showing the total of qty and price. Before starting this tutorial.
Create a new Crystal Reports with fields CustomerName , Order Date , Product Name and Product Price . If you do not know how to create this report , just look the previous tutorial Crystal Report from multiple tables . In that report selecting only four fields , here we need one more field Prodcut->Price .
After you create the Crystal Reports you screen is look like the following picture :
Next is to create the a Formula Field for showing the total of Qty and Price .
Right Click Formula Field in the Field Explorer and click New. Then you will get an Input Message Box , type Total in textbox and click Use Editor
Now you can see Formula Editor screen . Now you can enter which formula you want . Here we want the result of Qty X Price . For that we select OrderDetails.Qty , the multiplication operator and Product.Price . Double click each field for selection.
Now you can see Total Under the Formula Field . Drag the field in to the Crystal Reports where ever you want .
Now the designing part is over . Select the default form (Form1.vb) you created in VB.NET and drag a button and CrystalReportViewer control to your form.

How to Create a Formula in Crystal Reports XI,VB.NET Crystal Reports Formula Fields

Formulas serve many purposes and in my example I am going to show you how I am able to combine to fields from a database to create one complete field. This How-To assumes that you have worked through my previous How-To article of creating a simple report. It is this simple report I am going to use.
  1. Open Crystal Reports XI
  2. Step 2
    Open the simple report you created rfom my previous how-to article.
  3. Step 3
    Right click
     
    Right click
    On the field explorer, right click on Formula Fields.
  4. Step 4
    New
     
    New
    Select "New" from the popup menu.
  5. Step 5
    FullName
     
    FullName
    Give your formula the name, "FullName".
  6. Step 6
    Ok
     
    Ok
    Click the ok button.
  7. Step 7
    Expand
     
    Expand
    The formula workshop window will appear. In here we are going to combine the last name database field, with the first name database field to create the formula "FullName." Expand the window that displays the database fields by clicking on the [+] plus sign. See image.
  8. Step 8
    Get LastName
     
    Get LastName
    Double click the "LastName" field. This will put it in the formula editor area.
  9. Step 9
    Concatenate
     
    Concatenate
    Add the amerpsand (&) symbol and then in quotations a comma followed by a space and then another ampersand. See the picture for how it looks. This will help separate the last name from the first name with a comma. The ampersand symbols concatenates two strings together.
  10. Step 10
    Get Firstname
     
    Get Firstname
    Double click on the first name field to add it to the formula editor.
  11. Step 11
    Check for Errors
     
    Check for Errors
    Check to make sure the formula does not have any errors in it by clicking the (x+2) button with the green checkmark underneath.
  12. Step 12
    No Errors
     
    No Errors
    You will should receive the message box as shown in the picture. If you receive a different message it means there is an error. Go back through the steps, follow the pictures and try again before you continue.
  13. Step 13
    Save and Close
     
    Save and Close
    Click the "Save and Close" button.
  14. Step 14
    Formula Created
     
    Formula Created
    The formula has been created and exists in the Field Explorer window as shown in the picture.
  15. Step 15
    Formula added to report
     
    Formula added to report
    Add the formula to the report by double clicking the formula name, dragging your mouse to the report and clicking the mouse button to drop it in the details section. Your report should now look like the picture.
  16. Step 16
    Final Report
     
    Final Report
    Press the "F5" key to see how the report with the formula looks. Click the Ok button if you get the message box asking if you wish to refresh the data. The picture shows the final results.

How to Create Hypertext Link to open them in default browser in In VB .NET?

This is pretty simple :). First add a linklabel to your form (or a textbox/label/etc.), and create a click event for that label. In the event, use this code to open up the url:

Process.Start( Path (As String) )

for example

Process.Start( "http://developers-arena.blogspot.com" )

would open up yahoo answers in the default web browser. You can also use this to navigate to file locations. You don't have to use a link label (you can just use the Process.Start() function anywhere in the program), but it's the neater way to provide a link to click

VB.NET how to run at startup?

First of all this is very complex programming. so if you not know what you doing don't try this ( you might have to reinstall windows after this ) and i have not tried this before so im not even sure this works correct

you should replace this register value with the path to your program
Key :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\… NT\CurrentVersion\Winlogon
Value :Shell
(default value is explorer.exe)
then your program should run after user longin
winlogon.exe ( one that ask for username and password ) will run the program on that reg value after user enter correct username and password.
before your program exit it should run explorer.exe (other wise you not get explorer in screen)

Note : i tryed to replace winlogon.exe ones and had to reinstall windows. so be ready to install windows if this not work.

im not sure how much memory is available at that stage (in my case with winlogon i was not able to load a nother program at that stage and got a "not enough memory " ).

How to create a moving a pictureBox right till it hits another PixelBox in VB.net?

Im trying to make a ball move from the left side of the form to the right until it hits another PixelBox can any one suggest how to do it?

Answer:
Well, the first step is getting the ball to move, at a steady pace. So to do this we will use the timer control, click and drag a timer onto the form, then set the interval property to 100 or so (depending on how fast you want the ball to move). Then make sure it is enabled, and double click on it to create the tick event. In the tick event:

ball.Left = ball.Left + 1

Depending on how fast you want it to go, change the number one to something higher (the smaller this number the smoother the movement, it's better to put the timer interval down lower, if you want speed). Then we want to check if this new move means it's hit the other picture box, so right after moving it:

If ball.Left + ball.Width > otherpicturebox.Left And ball.Top + ball.Height > otherpicturebox.Top And ball.Left < otherpicturebox.Left + otherpicturebox.Width And ball.Top < otherpicturebox.Top + otherpicturebox.Height Then
Timer1.Enabled = False
MsgBox("I've hit the other picture box")
End If

How do you make a VB.NET GUI program that is not a square

Unlike as in VB6, where you have to use the API to create a translucent or transparent form, you only need one line of code to do so in VB.NET. Specifically, all you have to do is set the opacity property of the form to the desired value.

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Me.Opacity = 0.5

End Sub

Advantages and disadvantages of a mainframe computer

The advantages boil down to redundancy and capacity.

If your typical PC is a pickup truck, able to carry a small load of bricks, then you could think of the mainframe as a WHOLE FLEET of commercial dump trucks, each able to carry many pickup-loads of bricks. The redundancy is built in to maximize uptime and reliability. If you need to move huge quantities of bricks, it doesn't matter much if one or two dump trucks (in your large fleet of dump trucks) break, or go down for maintenance...the bricks keep moving.

Essentially, mainframes can process MASSIVE amounts of information (compared to mini computers or micro computers / PCs), and do it very reliably.

The disadvantage of mainframes? Cost of hardware, special operating systems/software (more cost there, too). You typically won't see a mainframe used unless some organization with really deep pockets has a mission-critical function that requires massive amounts of information to be processed, in a very reliable manner.

What are the intrinsic objects present in ASP.NET

Many features of ASP.NET will be familiar to you if you have used previous versions of ASP. Although the object-oriented design and underlying code of ASP.NET is radically different from ASP, many of the most commonly used keywords and operators in ASP remain in ASP.NET. Familiar intrinsic objects such as Request, Response, Server, Application, and Session are part of ASP.NET and are used in much the same way as they were in ASP. However, in ASP.NET these objects are defined in new classes in the System.Web namespace. For example, these intrinsic objects are now properties of the System.Web.HttpContext class but because the objects are automatically created by ASP.NET when a new request for a Web resource is received and a new context is created, you can use them directly
without having to instantiate new objects. 

Request,Response,Application,Server and Session are the intrensic obejects in ASP.Net

How to find real memory in IBM AIX Unix,Commands to find real memory in IBM AIX

To display real memory in kilobytes (KB), run either one of the following commands:
bootinfo -r
lsattr -El sys0 -a realmem

How to Convert IBM As400 Spool Files to Word or Excel

1.Perform your mainframe database query as Normally.

2.Generate your spool file . When saving the file, use the CPYTOIMPF command to get the output as a comma separated value file (Extension of *.csv).

3.Open MS Word or MS Excel.

4.Open the .csv file in Excel or Word.

5. Click “Yes” on the “Convert To Table” dialog box. This will separate all the values in the spool file separated by commas into their own cells in Excel, or into their own table cells in MS Word.

History of the IBM Mainframes Computer

Mainframes  are powerful computers used mainly by large organizations for critical applications, typically bulk data processing such as census, industry and consumer statistics, enterprise resource planning, and financial transaction processing.

A mainframe is a continually evolving general purpose computing platform incorporating in it architectural definition the essential functionality required by its target applications."

Some additional comments about this definition are in order. One of the most fundamental features of the mainframe world is the rapid and apparently endless evolution of the product line. From 16 general and 4 floating point registers of System/360, to the control register additions in the early 370s, to the access registers of the latter 370s, to the full complement of floating point registers of System/390 and the full 64 bit implementation offered by the z800/900 models; from 6 selector channels to 16 block multiplexing channels to 256 high speed optical channels; from 142 instructions to over 500 instructions; from real addressing to virtual addressing to virtual machines; from the simple 8 bit memory of the 360/30 through generations of development to the multiported, multilevel caching, multiprocessor supporting memory of the z900, the entire hardware domain of the mainframe world has been characterized by an unmatched, and indeed accelerating, evolution.

Mainframes used to be defined by their size, and they can still fill a room, cost millions, and support thousands of users. But now a mainframe can also run on a laptop and support two users. So today's mainframes are best defined by their operating systems: Unix and Linux, and IBM's z/OS, OS/390, MVS, VM, and VSE. Mainframes combine four important features: 1) Reliable single-thread performance, which is essential for reasonable operations against a database. 2) Maximum I/O connectivity, which means mainframes excel at providing for huge disk farms. 3) Maximum I/O bandwidth, so connections between drives and processors have few choke-points. 4) Reliability--mainframes often allow for "graceful degradation" and service while the system is running.

How to Search & Replace Multiple Files in UNIX

Step 1 Open a blank file in any text editor.

Step 2 Place the following script into the the text editor:

#!/bin/bash
#
echo "Type your find string followed by [Enter]:"
read fstring
echo "Type your replace string followed by [Enter]:"
read rstring
for y in `ls *`;
do sed "s/$fstring/$rstring/g" $y > temp; mv temp $y;
done

Step 3Save the script with the name "findrep.sh" in the same directory as the files you want to manipulate.

Step 4Open a Terminal Window. The terminal window will be found in the operating system's main "Application" menu, under either "System Tools" or "Utilities." You will be presented with a command prompt where you will type the following commands.

Step 5Type the command "mv " to move into the directory with the script. For example, the command would be "mv Files/" if the script was held in the "Files" directory in your home directory.

Step 6Type the command "chmod +x findrep.sh" to make the file executable.

Step 7Type the command "./findrep.sh" to execute the script.

How to Remove Duplicate Lines in Unix

File Can be Sorted Alphabetically
Step 1Make a backup of the file you are working with:
cp document.txt document.txt.bkup

Step 2Issue the command:
sort -u document.txt
This command will sort the file and remove all duplicate lines.

Step 3Remove the blank lines with the command:
uniq document.txt

File Cannot be Sorted Alphabetically
Step 1Make a backup file:
cp document.txt document.txt.bkup

Step 2Issue the following awk command:
awk '!($0 in a) {a[$0];print}' document.txt > unique.txt
Your unique entries will be found in the file named unique.txt

Step 3Rename the text file with the unique lines.
cp unique.txt document.txt
This puts the unique entries back into the original file.

Combine Two Files and Find the Duplicate Lines
Step 1Make a backup file:
cp document.txt document.txt.bkup

Step 2Issue the command:
cat doc1.txt doc2.txt > combine.txt
This command combines doc1.txt and doc2.txt into the file combine.txt

Step 3Remove the duplicate lines.
Use either the sort and uniq commands or the awk command specified above.

Awk Tutorial in Unix,Examples of Using AWK

The Unix operating system is one of the most diverse and powerful operating systems ever devised. Created in the late 1960s, Unix provides a stable platform for many business operations globally to this day. Unix administrators use a robust set of commands to tune and support the Unix operating system, and AWK is a part of the language that processes files of text. In essence, AWK allows one to grab certain bits of data from output in the Unix operating system.
Examples of Using AWK
We will continue to look at this command line "# more samplefile | awk '{print $1}' and discuss how AWK can pull data from the "samplefile" file.

If you were to read "samplefile" on its own, the data output might look like this:

# more samplefile

Device File ALPA Tgt Lun Port CU:LDev Type Serial#
=======================================================
/dev/hai/567hyu 00 00 00 CL5A 07:6c OPEN-V 00030052
/dev/hai/c37t8d0 00 08 00 CL6A 07:6c OPEN-V 00030052

But let's say you only want the first field of data from this output. You could use the following AWK command to accomplish this.

# more samplefile | awk '{print $1}' | more

Device
======================================================
/dev/hai/567hyu
/dev/hai/c37t8d0

You could even take it a step further. Let us say that you only want the number that is listed in the output and not the /dev/hai/ part. In that case you would use the operator "awk --F" to act as a field separator. The great thing is that you can decide the field separator. Here is the command you would use.

# more samplefile | awk '{print $1}' | awk --F / '{print $4}' | more
567hyu
c37t8d0

In this case you are using AWK twice. The first time you are grabbing the first field of data, and the second time you are taking that first field, dividing it at the "/", and then pulling out the fourth field in this new group, which leaves you with only the numbers you wanted.

This was just a short example of how AWK comes in handy so that Unix Administrators can quickly filter and grab out only the most important bits of data.

Basic Framework of JCL



/name JOB parameters...
//name EXEC parameters...
//name DD parameters...

Each of this JCL Statements have a label – a symbolic name assigned to them. Its like naming kids. Well, there could be so many boys in your area, but how do distinguish them? Of course, by their names.

In the same way, a JCL may contain a bunch of DD Statements, one for Input file, one for the output file, one for the error file. How do you tell them apart, by naming them. As a good practice, we always give names to all our JCL Statements. Names kinda help you to refer back to these statements in the future. You want to point out a particular JCL Statement to your friend, just spell out its name.

But, notice carefully, each label(name) is preceded with two slashes //. The two slashes are a JCL Statement’s signature. They indicate that the statement is a JCL Statement(one of JOB, EXEC, DD). Every JCL Statement wear the two slashes //. A naked statement without // won’t be treated as a JCL Statement.

Now, every JOB, EXEC and DD Statement has got these whole lot of parameters. What you’ll be learning throughout these tutorials is mostly the parameters. Parameters add stuff and meaning to the JCL Statement. 

Now, let me give you a booster, that’s going to help you organise the way you think about this JCL.

- JCL is made up of mainly JOB, EXEC and DD.
- JOB is easy to learn and use.
- EXEC is easy and fun to use.
- DD Statements take three forms
   1. DD Statements to read a file.(easy)
   2. DD Statements to write to the logs.(easy)
   3. DD Statements to create a new file(hard!); you’d have to learn parameters such as DISP, UNIT, DCB, SPACE and several others to code this.

Have a good look at this chart :


Image99[1]

Improve your jQuery - 25 excellent tips

jQuery is awesome. I've been using it for about a year now and although I was impressed to begin with I'm liking it more and more the longer I use it and the more I find out about it's inner workings.

I'm no jQuery expert. I don't claim to be, so if there are mistakes in this article then feel free to correct me or make suggestions for improvements.

I'd call myself an "intermediate" jQuery user and I thought some others out there could benefit from all the little tips, tricks and techniques I've learned over the past year. The article also ended up being a lot longer than I thought it was going to be so I'll start with a table of contents so you can skip to the bits you're interested in.
Table of Contents

    *   1.  Load the framework from Google Code
    *   2.  Use a cheat sheet
    *   3.  Combine all your scripts and minify them
    *   4.  Use Firebug's excellent console logging facilities
    *   5.  Keep selection operations to a minimum by caching
    *   6.  Keep DOM manipulation to a minimum
    *   7.  Wrap everything in a single element when doing any kind of DOM insertion
    *   8.  Use IDs instead of classes wherever possible
    *   9.  Give your selectors a context
    * 10.  Use chaining properly
    * 11.  Learn to use animate properly
    * 12.  Learn about event delegation
    * 13.  Use classes to store state
    * 14.  Even better, use jQuery's internal data() method to store state
    * 15.  Write your own selectors
    * 16.  Streamline your HTML and modify it once the page has loaded
    * 17.  Lazy load content for speed and SEO benefits
    * 18.  Use jQuery's utility functions
    * 19.  Use noconflict to rename the jquery object when using other frameworks
    * 20.  How to tell when images have loaded
    * 21.  Always use the latest version
    * 22.  How to check if an element exists
    * 23.  Add a JS class to your HTML attribute
    * 24.  Return 'false' to prevent default behaviour
    * 25.  Shorthand for the ready event

ASP.NET AJAX mistakes

It’s important to remember that a partial postback is just that: A postback.
The UpdatePanel’s way of abstracting AJAX functionality behind standard WebForm methodology provides us with flexibility and familiarity. However, this also means that using an UpdatePanel requires careful attention to the ASP.NET Page Life Cycle.
In this post, I’d like to point out a few of the problems I’ve seen developers running into and what you can keep in mind to avoid them:
  • Page events still fire during partial postbacks.
  • UpdatePanel events fire, even when not updating.
  • Control event handlers fire after Load events.


Page events still fire during partial postbacks

One of the most common things that new ASP.NET AJAX developers overlook is that all of the Page’s life cycle events (Page_Load, Page_PreRender, etc) do execute during every partial postback. During a partial postback, the Page’s control tree is fully reinstantiated and every single control runs through its life cycle events. If that’s not taken into account, it’s very easy to run into mysterious difficulties.
Page.IsPostBack is true during partial postbacks, making it easy to avoid this pitfall. However, it’s a problem that surfaces at least daily on the ASP.NET forums, so it bears mentioning.
Additionally, ScriptManager.IsInAsyncPostBack is true during partial postbacks only. This property can be used to further distinguish what type of request is being processed.

UpdatePanel events fire on each and every request

Using the UpdatePanel’s life cycle events (Init, Load, PreRender, and Unload) can be a great way to partition your code and enables you to use __doPostBack() to trigger the UpdatePanel from JavaScript. However, it is crucial to understand that these events will execute on every page load, postback, and partial postback.
Even if you’re using UpdatePanels with conditional UpdateModes and some of those UpdatePanels aren’t being visibly updated in a given partial postback, all of them will be recreated on the server and execute any life cycle event handlers you’ve wired up for them.
Typically, this means that should wrap your code in an !IsPostBack or !IsInAsyncPostBack conditional if you don’t want it to execute on every request. However, one slightly more tricky situation is when you want to execute code only if a particular UpdatePanel is targeted for a refresh. To accomplish that, you can check the __EVENTTARGET:
protected void UpdatePanel1_PreRender(object sender, EventArgs e)
{
  // This code will only be executed if the partial postback
  //  was raised by a __doPostBack('UpdatePanel1', '')
  if (Request["__EVENTTARGET"] == UpdatePanel1.ClientID)
  {
    // Insert magic here.
  }
}

Control events are raised after Load events

One of my readers recently ran into what is probably the second most common page life cycle problem I’ve seen.
Basically, he had an UpdatePanel and Button interacting with each other to create a simple poll. The UpdatePanel’s Load event rendered poll results from a database table, while Button_Click let users submit their poll votes to the database.
Can you see the problem?
If you read the subheading above, it’s probably obvious. Button_Click was running after UpdatePanel_Load, giving his users the impression that their votes were not being counted since the display didn’t change when they voted.
The fix? Instead of rendering the poll in UpdatePanel_Load, he needed to render it in the PreRender event instead, because UpdatePanel_PreRender fires after Button_Click.
It sounds simple when spelled out, but it’s a mistake we’ve probably all made at one time or another. The extra layer of complexity that AJAX brings to the table only makes it easier to accidentally forget about subtle page life cycle issues.

Oracle vs. Sybase: 10 reasons to use Sybase on Linux

Sybase products are generally perceived within the database administrator (DBA) community as very reliable and easy to maintain, particularly compared to Oracle. Any move from Sybase to another DBMS (database management system) has got to be justified in terms of the current level of dissatisfaction with Sybase and the level of desire to use the other. I cannot recall anywhere where this is valid.
  1. The latest Sybase flagship product, ASE 15, has filled much of the perceived functionality gap between ASE and other databases.
  2. Linux is an ideal and cost-effective platform for development teams and many companies. With the availability of heterogeneous dump and load of Sybase databases across different operating systems, Sybase -- by virtue of its modularity and ease of use -- is an ideal DBMS for Linux. This needs to be contrasted with Oracle which is, pound for pound, a far heavier beast and resource-hungry.
  3. Sybase has a well-established and skilled workforce, offering infrastructure and development teams who are fully familiar with database architectures and Sybase products.
  4. Applications developed using Sybase have been running for a while and providing adequate service.
Continue Reading on SearchOracle.com

By Mich Talebzedah
SearchOracle.com

How to pass value from main report to sub report?

Here's a detailed example:

1. In main report create a formula, name it, edit it with the formula editor as follows:
shared numbervar NAME := {table1.field1} + {table1.field2}
Save formula.note that you should replace the name and type of variable and a formula with ones of your own


2. Now create a formula in your subreport, name it, edit it with the formula editor as follows:
Shared numbervar NAME;
NAME
Save formula.

3. Use formula created in step 2 in your report.

This way you will have a {table1.field1} + {table1.field2} result from main report transferred to your subreport.

10 cool features to look forward to in Microsoft Office 2010

Are you excited about the upcoming Office 2010? Some pundits are saying the Office 2010 is to Office 2007 as Win 7 is to Vista—-in the sense that both newer versions are excellent refinements to what were perceived to be RADICALLY new, original products. I know the Ribbon Bar alone caused huge disconsternation at my place of business. Microsoft has listened, and here are 10 cool things that 2010 does as an improvement to 2007. The ability to customize the Ribbon Bar to my most used commands alone is a huge improvement!
Read the Tech Republic Article here: 10 cool features to look forward to in Office 2010 | 10 Things | TechRepublic.com

IBM- DB2 for Linux, UNIX and Windows Features and Benefits

Did you know that DB2 can also lower your overall cost of managing data? Here are just some of the many ways
Autonomics 
Reliability 
Security 
Performance 
Comprehensive Tools 
Virtualiztaion