- Licence Fondamentale d'Informatique
mardi 16 juillet 2013

Développez votre propre réveil (Alarme) avec votre android phone

Ce tutoriel est réalisé et proposé par bunjix, développeur d’application sous Android. Vous pouvez voir son blog surhttp://bunjix.fr.


Dans ce tuto je vais créer un réveil simple. Le but est de montrer comment se passe l’activation d’une alarme à une heure voulue.
D’abord mon fichier XML pour l’affichage de mes informations (très simple)
01.<?xml version="1.0" encoding="utf-8"?>
02.<RelativeLayout android:id="@+id/RelativeLayout01"
03.android:layout_width="fill_parent" android:layout_height="fill_parent"
05.android:gravity="center">
06.<CheckBox android:layout_height="wrap_content"
07.android:layout_width="fill_parent" android:text="07:00" android:id="@+id/heure"
08.android:textSize="40dip" android:gravity="center" android:onClick="changeHeure" />
09.</RelativeLayout>
Pour réaliser ce  réveil j’utilise la classe AlarmManager. Dans ma méthode onCreate j’ai 3 étapes:
1. Je charge les informations du réveil (voir plus bas pour l’explication).
2. Je gère l’affichage
3. Je planifie l’alarme.
01.@Override
02.public void onCreate(Bundle savedInstanceState) {
03.//Chargement des informations du reveil
04.charger();
05. 
06.super.onCreate(savedInstanceState);
07.setContentView(R.layout.main);
08. 
09.//Affichage
10.affichage();
11. 
12.//Planification
13.planifierAlarm();
14.}
Pour que le réveil soit fonctionnel, je souhaite qu’il se réactive si je reboot mon téléphone. Il faut donc que je sauvegarde l’heure de mon réveil et ses informations. Pour cela j’ai créé une classe Alarm qui implémente Serializable
Code classe Alarm
01.import java.io.Serializable;
02.import android.text.format.Time;
03. 
04.public class Alarm implements Serializable{
05.private static final long serialVersionUID = 1L;
06.private Time heure;
07.private boolean active;
08.public Time getHeure() {
09.return heure;
10.}
11.public void setHeure(Time heure) {
12.this.heure = heure;
13.}
14.public boolean isActive() {
15.return active;
16.}
17.public void setActive(boolean active) {
18.this.active = active;
19.}
20.}
Pour charger les informations du réveil, j’ai donc la fonction charger. La fonction tente de charger l’objet Alarm Serialisé dans le fichier alarm.serial.  Si ce fichier n’existe pas encore, on créer une alarm activé avec une heure fixée à 7h30.
01.public void charger(){
02.alarm = null;
03.try {
04.ObjectInputStream alarmOIS= new ObjectInputStream(openFileInput("alarm.serial"));
05.alarm = (Alarm) alarmOIS.readObject();
06.alarmOIS.close();
07.}
08.catch(FileNotFoundException fnfe){
09.alarm = new Alarm();
10.alarm.setActive(true);
11.Time t = new Time();
12.t.hour = 7;
13.t.minute = 30;
14.alarm.setHeure(t);
15.}
16.catch(IOException ioe) {
17.ioe.printStackTrace();
18.}
19.catch(ClassNotFoundException cnfe) {
20.cnfe.printStackTrace();
21.}
22.}
Pour sauver les infos du réveil j’implémente la méthode sauver() :
01.public void sauver(){
02.try {
03.ObjectOutputStream alarmOOS= newObjectOutputStream(openFileOutput("alarm.serial",MODE_WORLD_WRITEABLE));
04.alarmOOS.writeObject(alarm);
05.alarmOOS.flush();
06.alarmOOS.close();
07.}
08.catch(IOException ioe) {
09.ioe.printStackTrace();
10.}
11.}
Toujours dans mon Activity j’ai ma fonction affichage qui affiche simplement les informations du réveil (l’heure et l’état : activé/désactivé)
01.private void affichage() {
02.//Ici on a juste voulu créer un affichage de l'heure qui soit au format hh:mm.
03.String heureReveil = "";
04.heureReveil += alarm.getHeure().hour >10 ? alarm.getHeure().hour : "0" + alarm.getHeure().hour;
05.heureReveil +=":";
06.heureReveil += alarm.getHeure().minute >10 ? alarm.getHeure().minute : "0" + alarm.getHeure().minute;
07.CheckBox ck_alarm = (CheckBox)findViewById(R.id.heure);
08.ck_alarm.setText(heureReveil);
09.ck_alarm.setChecked(alarm.isActive());
10.}
Dans le fichier layout.xml qu’on peut voir au début, vous constaterez que pour la CheckBox, j’ai réglé l’attribut onClick (à partir de Android 1.6) avec la valeur changeHeure. Je dois donc implémenter la fonction :
Cette fonction se déclenchera donc au clic sur la checkbox ou l’heure. Elle s’occupera d’activer l’alarme ou de la désactiver. Si l’alarme passe en mode activée alors on affichera un TimePickerDialog afin de choisir l’heure.
Puis on replanifiera l’alarme.
01.public void changeHeure(View target){
02.CheckBox ck_alarm = (CheckBox)findViewById(R.id.heure);
03.//Si on active l'alarm alors on veut choisir l'heure.
04.if(ck_alarm.isChecked()){
05.TimePickerDialog dialog = new TimePickerDialog(this, this, alarm.getHeure().hour, alarm.getHeure().minute, true);
06.dialog.show();
07.}
08.//On replanifie l'alarme.
09.planifierAlarm();
10.}
Le deuxième argument du constructeur du TimePickerDialog correspond au callback, le listener OnTimeSetListener qui se déclenche à la validation de la nouvelle heure.
Notre activity implémente donc cette interface et nous avons donc la fonction OnTimeSet qui va changer l’heure de notre objet alarm et replanifier l’alarme.
01.@Override
02.public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
03.Time t = new Time();
04.t.hour = hourOfDay;
05.t.minute = minute;
06.alarm.setHeure(t);
07.affichage();
08.planifierAlarm();
09.}
Pour finir avec notre activity, nous avons la fameuse fonction planifierAlarm. Cette fonction va simplement supprimer (si elle existe) puis ajouter notre alarme dans le service AlarmManager.
Plusieurs étapes :
1. On récupère une instance du service AlarmManager
2. On crée un Intent qui va être appelé au déclenchement de l’alarme.
3. On crée le PendingIntent qui identifie notre Alarm avec un ALARM_ID (champ static de notre Activity)
4. On annule l’alarme si elle existe dans l’AlarmManager
5. Ajout de l’alarme
01.private void planifierAlarm() {
02.//Récupération de l'instance du service AlarmManager.
03.AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
04. 
05.//On instancie l'Intent qui va être appelé au moment du reveil.
06.Intent intent = new Intent(this, AlarmReceiver.class);
07. 
08.//On créer le pending Intent qui identifie l'Intent de reveil avec un ID et un/des flag(s)
09.PendingIntent pendingintent = PendingIntent.getBroadcast(this, ALARM_ID, intent, 0);
10. 
11.//On annule l'alarm pour replanifier si besoin
12.am.cancel(pendingintent);
13. 
14.if(alarm.isActive()){
15.//on va déclencher un calcul pour connaitre le temps qui nous sépare du prochain reveil.
16.Calendar reveil  = Calendar.getInstance();
17.reveil.set(Calendar.HOUR_OF_DAY, alarm.getHeure().hour);
18.reveil.set(Calendar.MINUTE, alarm.getHeure().minute);
19.if(reveil.compareTo(Calendar.getInstance()) == -1)
20.reveil.add(Calendar.DAY_OF_YEAR, 1);
21.Calendar cal = Calendar.getInstance();
22.reveil.set(Calendar.SECOND, 0);
23.cal.set(Calendar.SECOND, 0);
24.long diff = reveil.getTimeInMillis() - cal.getTimeInMillis();
25. 
26.//On ajoute le reveil au service de l'AlarmManager
27.am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis() + diff, pendingintent);
28.Toast.makeText(this, "Alarme programmé le " + reveil.get(Calendar.DAY_OF_MONTH) + " à " + reveil.get(Calendar.HOUR_OF_DAY) + ":" + reveil.get(Calendar.MINUTE), Toast.LENGTH_SHORT).show();
29.}
30.}
Il nous reste donc maintenant à écrire la classe AlarmReceiver qui va être déclenché au moment du réveil. Cette classe doit dériver de BroadcastReceiver
01.import android.content.BroadcastReceiver;
02.import android.content.Context;
03.import android.content.Intent;
04.import android.widget.Toast;
05. 
06.public class AlarmReceiver extends BroadcastReceiver{
07. 
08.@Override
09.public void onReceive(Context context, Intent intent) {
10.try {
11.Toast.makeText(context, "C'est l'heure !!!",Toast.LENGTH_LONG).show();
12.//On peut mettre ce que l'on veut. Vibreur, lecture d'un mp3 ou autre.
13.}
14.catch (Exception r) {
15.Toast.makeText(context, "Erreur.",Toast.LENGTH_SHORT).show();
16.r.printStackTrace();
17.}
18.}
19.}
On peut également créer une autre classe AlarmBootReceiver qui va être déclenché au démarrage du téléphone afin de recharger notre réveil.
Cette classe contient également les méthodes charger et planifierAlarm.
01.public class AlarmBootReceiver extends BroadcastReceiver{
02.Alarm alarm;
03.Context context;
04.@Override
05.public void onReceive(Context context, Intent intent) {
06.this.context = context;
07.charger();
08.planifierAlarm();
09.}
10. 
11....
12.}
Dernière étape, le manifest :
01.<?xml version="1.0" encoding="utf-8"?>
02.<manifest xmlns:android="http://schemas.android.com/apk/res/android"
03.package="com.bunjix.tuto.Reveil"
04.android:versionCode="1"
05.android:versionName="1.0">
06.<application android:icon="@drawable/icon" android:label="@string/app_name">
07.<activity android:name=".Reveil"
08.android:label="@string/app_name"android:theme="@android:style/Theme.Light">
09.<intent-filter>
10.<action android:name="android.intent.action.MAIN" />
11.<category android:name="android.intent.category.LAUNCHER" />
12.</intent-filter>
13.</activity>
14.<receiver android:name="com.bunjix.tuto.Reveil.AlarmReceiver" android:process=":remote" />
15.<receiver android:name="com.bunjix.tuto.Reveil.AlarmBootReceiver">
16.<intent-filter>
17.<action android:name="android.intent.action.BOOT_COMPLETED" />
18.</intent-filter>
19.</receiver>
20.</application>
21.<uses-sdk android:minSdkVersion="4" />
22. 
23.<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
24.</manifest>

dimanche 14 juillet 2013

Télécharger CCleaner



Aujourd'hui, les cookies, les fichiers temporaires, et divers autres moyens de suivi de votre empreinte Web sont par pour le cours. Certains de ces trackers sont utiles, tandis que d'autres peuvent être pote

ntiellement intrusive. Heureusement, il existe une myriade de produits de nettoyage freeware là-bas qui aident à garder votre système en échec. CCleaner est un des meilleurs pour sa facilité d'utilisation et de puissantes capacités de nettoyage.
Disposition simple et intuitive de CCleaner va plaire aux utilisateurs de tous niveaux de compétence. Ses quatre fonctions - Cleaner, Registry, Outils et Options - sont mis en évidence sur le côté gauche de la fenêtre. Nous avons commencé avec le premier Cleaner, qui décompose les options de nettoyage en deux onglets: Windows et les applications. Le programme fonctionne en première analyse de votre système et de lancer le nettoyeur lui-même. En sélectionnant les cases appropriées, nous avons pu nous laver les fichiers Internet temporaires, les cookies, l'historique et le cache dans Internet Explorer et Firefox en même temps, ainsi que vide de notre Corbeille et de débarrasser votre ordinateur des fichiers journaux de Windows. La fonction d'enregistrement agit de la même façon, vous permettant de cocher les options que vous souhaitez numériser des questions. En moins de 30 secondes, le programme avait scanné et affiché une longue liste d'entrées non valides que nous pourrions alors décider de fixer ou laisser seul en décochant les cases. En moins de temps qu'il n'en a fallu pour scanner, le programme fixé les questions que nous avions sélectionnés. Une remarque: Nous avons eu à exécuter le nettoyeur de registre trois fois de suite avant qu'il ne revint avec aucun problèmes rencontrés; chaque fois qu'elle est revenue avec de moins en moins les entrées non valides. Utilisation de la fonction Outils, nous avons pu gérer nos programmes de démarrage et de désinstaller des programmes avec succès. Nous avons particulièrement apprécié que CCleaner vous permet de gérer vos cookies pour que vous ne supprimez pas ceux qui sont utiles lorsque vous naviguez sur le Web. Comme avec tous les nettoyeurs de registre, nous vous recommandons de procéder avec prudence avant de fixer ou de supprimer des fichiers. CCleaner n'offre une fonction d'aide en ligne, mais pour le nettoyage de base, vous n'aurez probablement pas besoin.
Par défaut, le projet que vous avez opte pour l'installation de bureau et raccourcis du menu Démarrer, ainsi que l'ajout terme et les options ouvertes dans votre menu contextuel. Il vous opte également pour l'installation de Google Chrome et d'en faire votre navigateur par défaut, de sorte que vous aurez à décocher les cases de se retirer. installe CCleaner et désinstalle sans laisser de fichiers ou de dossiers derrière.


mardi 9 juillet 2013

Ajouter Slide Show dans ton blog blogger

Dans ce message, je vais vous montrer comment utiliser et insérer une Slider FeatureContent pour lesmodèles Blogger. 


Maintenant, le code javascript permet au blogueur afficher automatique tous les messages dans un slider d'un label ou libellé.
Ce tuto utilise deux javascripts un pour obtenir les messages à partir d'un label ou libellé spécifique et l'autre pour la rotation du contenu : Content Slider vedette v2.4

1- la première étape :

Mettez ce code ou le script pour les message par étiquette ou libellé avant </head>

&lt;script&gt; 
/* Script from:http://simplexdesign.blogspot.com/ */
imgr = new Array();
imgr[0] = &quot;http://lh3.ggpht.com/_kViOplhgIHI/TKxBIScZTiI/AAAAAAAAAWE/PM7AQ1lf6ME/noimages.jpg&quot;;
showRandomImg = true;
aBold = true;
summaryPost = 140; 

numposts1 = 5; 
label1 = &quot;Featured&quot;;
function removeHtmlTag(strx,chop){var s=strx.split(&quot;&lt;&quot;);for(var i=0;i&lt;s.length;i++){if(s[i].indexOf(&quot;&gt;&quot;)!=-1){s[i]=s[i].substring(s[i].indexOf(&quot;&gt;&quot;)+1,s[i].length)}}s=s.join(&quot;&quot;);s=s.substring(0,chop-1);return s}
function showrecentposts1(json){j=(showRandomImg)?Math.floor((imgr.length+1)*Math.random()):0;img=new Array();for(var i=0;i&lt;numposts1;i++){var entry=json.feed.entry[i];var posttitle=entry.title.$t;var pcm;var posturl;if(i==json.feed.entry.length)break;for(var k=0;k&lt;entry.link.length;k++){if(entry.link[k].rel=='alternate'){posturl=entry.link[k].href;break}}for(var k=0;k&lt;entry.link.length;k++){if(entry.link[k].rel=='replies'&amp;&amp;entry.link[k].type=='text/html'){pcm=entry.link[k].title.split(&quot;&quot;)[0];break}}
        
if (&quot;content&quot; in entry) {
var postcontent = entry.content.$t;}
else
if (&quot;summary&quot; in entry) {
var postcontent = entry.summary.$t;}
else var postcontent = &quot;&quot;;
postdate = entry.published.$t;
if(j&gt;imgr.length-1) j=0;
img[i] = imgr[j];
s = postcontent    ; a = s.indexOf(&quot;&lt;img&quot;); b = s.indexOf(&quot;src=\&quot;&quot;,a); c = s.indexOf(&quot;\&quot;&quot;,b+5); d = s.substr(b+5,c-b-5);
if((a!=-1)&amp;&amp;(b!=-1)&amp;&amp;(c!=-1)&amp;&amp;(d!=&quot;&quot;)) img[i] = d;
var month=[1,2,3,4,5,6,7,8,9,10,11,12];var month2=[&quot;Jan&quot;,&quot;Feb&quot;,&quot;Mar&quot;,&quot;Apr&quot;,&quot;May&quot;,&quot;Jun&quot;,&quot;Jul&quot;,&quot;Aug&quot;,&quot;Sep&quot;,&quot;Oct&quot;,&quot;Nov&quot;,&quot;Dec&quot;];var day=postdate.split(&quot;-&quot;)[2].substring(0,2);var m=postdate.split(&quot;-&quot;)[1];var y=postdate.split(&quot;-&quot;)[0];for(var u2=0;u2&lt;month.length;u2++){if(parseInt(m)==month[u2]){m=month2[u2];break;
}}
var daystr = day+ ' ' + m + ' ' + y ;
var trtd = '&lt;div class=&quot;contentdiv&quot;&gt;&lt;div class=&quot;sliderPostPhoto&quot;&gt;&lt;a href=&quot;'+posturl+'&quot;&gt;&lt;img width=&quot;590&quot; height=&quot;240&quot; class=&quot;alignnone&quot; src=&quot;'+img[i]+'&quot;/&gt;&lt;/a&gt;&lt;div class=&quot;sliderPostInfo&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;featuredPost&quot;&gt;&lt;h2&gt;&lt;a href=&quot;'+posturl+'&quot;&gt;'+posttitle+'&lt;/a&gt;&lt;/h2&gt;&lt;span&gt;'+daystr+'&lt;/span&gt;&lt;p&gt;'+removeHtmlTag(postcontent,summaryPost)+'...&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;';     
document.write(trtd);       
j++;
}}
&lt;/script&gt;

Vous pouvez modifier ce code, selon votre besoin

summaryPost = 140; -> le nombre de caractère en résumé
des messages
numposts1 = 5; -> nombre de messages

et, la taille de vos images

width=&quot;590&quot; height=&quot;240&quot; 

2- La second étape :

Mettez ce script pour curseur de contenu avant </body>

&lt;script src='http://dl.dropbox.com/u/12924430/contentslider.js'&gt;&lt;/script&gt; 
&lt;script&gt; 
featuredcontentslider.init({
id: &quot;slider1&quot;, //id of main slider DIV
contentsource: [&quot;inline&quot;, &quot;&quot;], //Valid values: [&quot;inline&quot;, &quot;&quot;] or [&quot;ajax&quot;, &quot;path_to_file&quot;]
toc: &quot;#increment&quot;, //Valid values: &quot;#increment&quot;, &quot;markup&quot;, [&quot;label1&quot;, &quot;label2&quot;, etc]
nextprev: [&quot;Previous&quot;, &quot;Next&quot;], //labels for &quot;prev&quot; and &quot;next&quot; links. Set to &quot;&quot; to hide.
enablefade: [true, 0.5], //[true/false, fadedegree]
autorotate: [true, 6000], //[true/false, pausetime]
onChange: function(previndex, curindex){ //event handler fired whenever script changes slide
//previndex holds index of last slide viewed b4 current (1=1st slide, 2nd=2nd etc)
//curindex holds index of currently shown slide (1=1st slide, 2nd=2nd etc)
}
})
&lt;/script&gt;
 

3 - La troisième étape :

Trouvez ce code <div id='main-wrapper'> et de mettre ce code par la suite.

 <b:if cond='data:blog.pageType == &quot;index&quot;'>
<div id='featured'>
<div class='sliderwrapper' id='slider1'>
<script>
document.write(&quot;&lt;script src=\&quot;/feeds/posts/default/-/&quot;+label1+&quot;?max-results=&quot;+numposts1+&quot;&amp;orderby=published&amp;alt=json-in-script&amp;callback=showrecentposts1\&quot;&gt;&lt;\/script&gt;&quot;);
</script>
</div>
<div class='pagination' id='paginate-slider1'>
</div>
</div>
</b:if>

4- La quatrième étape :
Ajouter de style pour «curseur contenu» avec du CSS. 
Mettez ce code avant ]]></b:skin>

#featured{margin-bottom:35px}
.sliderwrapper{position: relative;overflow: hidden;border: 10px solid #dedde5;border-bottom-width: 6px;height: 250px}
.sliderwrapper .contentdiv{background:#68667B;visibility: hidden;position: absolute;left: 0;top: 0;padding: 5px;height: 100%;filter:progid:DXImageTransform.Microsoft.alpha(opacity=100);-moz-opacity: 1;opacity: 1;}
.pagination{text-align: right;background-color:#dedde5;padding: 2px 10px 10px}
.pagination a{font-size:11px;color:#dedde5;padding: 0 5px;background:#68667B}
.pagination a:hover, .pagination a.selected{color:#68667B;background-color:#fff}
.featuredPost{width:95%;padding:5px 10px 10px;background:#68667b;background:rgba(104, 102, 123, 0.9);color:#dedde5;position:absolute;bottom:0}
.featuredPost a{color:#fff}
.featuredPost a:hover{color:#dedde5}
.featuredPost h2{margin:0;font-size:16px;line-height:1}
.featuredPost span{font-size:10px}
.featuredPost p{font-size:11px}

Vous devez régler à nouveau le code, en fonction de votre modèle 

5- La dernière étape :

- Créer un nouveau article et lui donner l'étiquette ou libellé « Featured ». 

- L'image utilisée est de taille de 590x240 pixels par défaut.

-Regardez la première étape si vous avez besoin de modifier ou changer l'étiquette ou libellé ( Label) «Featured » par votre libéllé de votre choix dans la premiére étape pour avoir dans votre slider les messages ou articles du libéllée de votre choix.
mardi 11 juin 2013

Retrieve C# code out of EXE Assembly

I lost some of my applications code coz of PC format, one of these applications is a C# Console Application, I managed to get the exe output of this application but I was not able to retrieve the code files so I used (.NET Reflector) to do this:

1-     Download the .NET Reflector.

2-     Download the Reflector.FileDisassembler.

3-     Extract the .Net Reflector

4-     Extract the Reflecter.FileDisaembler

5-     Copy the Reflector.FileDisassembler.dll to the .Net Relector Folder

6-     Start Relector.EXE

7-     From the View menu select Add-Ins


8-     In the Add-Ins Screen select Add and select Reflector.FileDisassembler.dll then close the Add-Ins screen


9-     From File menu select Open and select the exe file you want to retrieve its code


10- The reflector will load the file Assembly in the Assemblies section


11- Select the required file and from the Tools menu select File Disassembler

null

12- Click Generate and you will get your code

null

lundi 3 juin 2013

How to resolve HTTP Error 404 and launch localhost with WAMP Server for PHP & MySql?

Are you getting HTTP Error 404 found while launching the WAMP Server.
It may cause due to other software installed like Webmatrix and services or running that may obstacle theWAMP Server?
Please follow the below steps to resolve.
While launching the WAMP Server, it will turn to Orange instead of Green and also message will be displayed saying that server is WAMP Server Online.

Problem may occur due to other web service is installed and running at your system parallel.
Launch Wamp Server and put it online. Check whether the WAMP Server icon is changed to green at your system tray. If not turning into green……follow the steps below.
  1. Go to Run
  2. Type Services.msc
  3. Search in the Name column for Web Deployment Agent Service
  4. STOP the service
  5. Now Restart All Services in the WAMP Server
  6. Now you can see the WAMP Server will turn to green.
  7. Launch the WAMP in the Browser localhost
Now you can launch the localhost and execute your php scripts.

Thats it! Enjoy it! Share it!

How to view the saved password in Firefox Browser?

Do you know? While logging in with any websites your password can save or your password will be saved in yourFirefox browsers.
If you selected the remember password option while logging in, your password will be saved in the browser itself. You can view well.
Accidentally, you may have chosen this option or purposely, you may have chosen this option to remember.
But, it is not good practice to select the Remember Password option while logging in with Net banking,Checking mails etc.,, or any other your confidential user id and password credentials that can be saved in the browser itself.
Someone may view your password when they do use your system.
Always be careful with your login credentials.
Steps to view the password in the Firefox Browser:-
  1. Log in with your credentials at any website. For example, We used the Gmail ID to explain
  2. While logging in, Firefox will ask for to remember the password. Choose the option Remember Password.
  3. Just sign out where you logged in.
  4. Click Tools → Options → Security → Saved Passwords
  5. Select the password that you would like to see for the particular user id and then click the Show Passwords.
  6. Now, you can view your saved passwords.
dimanche 2 juin 2013

How To Install Photoshop In Ubuntu

Photoshop is an important tool to many of us here. There are people who stick with Windows or Mac for gaining a native environment to use this tool on. For Linux users,photoshopthere is Gimp, the perfect alternative to Photoshop . However, there are some users that are used for photoshop and they can not switch to Gimp for some reason..
Using wine to install Photoshop used to work fine upto Ubuntu version 10.04, but it now breaks for 10.10 and/or Natty.
This tutorial will show you the shortest way to install PS CS5 on the latest builds of Ubuntu available.
Things you’re going to need:
  • A Computer Running Ubuntu Maverick or Natty
  • A Computer running windows (Or a VM, your choice)
  • A Copy of the Adobe CS5 installer. This is publicly downloadable on the Adobe website(Shareware).
Let’s get started, shall we?
Install Adobe Cs5 on your windows machine first. We need to copy a few registry entries from there for PS to work fine in Ubuntu. After the installation, run regedit and navigate to “HKEY_LOCAL_MACHINE -> Software -> Adobe“
Right click on the Adobe folder and select “Export”, name this file “PS.reg”.
Switch to your Ubuntu machine now.
Install wine and the Microsoft true-type fonts with the command below.
sudo apt-get install wine ttf-mscorefonts-installer
Then run the following to create your own .wine folder.
winecfg
PS is a native windows app and has a few Windows based dependencies. We need to use winetricks to install this. Execute the following:
wget http://www.kegel.com/wine/winetricks
sh winetricks msxml6 gdiplus gecko vcrun2005sp1 vcrun2008 msxml3 atmlib
Now comes the tiresome part. Since we can’t use the installer on Ubuntu, we’ll need to copy the needed files over from Windows to Ubuntu. These are the files you need to copy and where they need to go.
C:Program FilesAdobe ----> $HOME/.wine/drive_c/Program Files/Adobe
C:Program FilesCommon FilesAdobe ----> $HOME/.wine/drive_c/Program Files/Common Files/Adobe
C:Documents and Settings$USERApplication DataAdobe ----> $HOME/.wine/drive_c/users/$USER/Applications Data/Adobe
C:windowssystem32odbcint.dll ----> $HOME/.wine/drive_c/windows/system32/odbcint.dll
Once that’s done, copy over your “PS.reg” file from your Windows machine to your home directory and execute the command below.
wine regedit adobe.reg
That’ll import the registry entries into the wine registry. We are done.
To test it out, go to go to “Home -> .wine -> drive_c -> Program Files -> Adobe ->Adobe Photoshop CS5“ with your favorite shell and right click on the ‘Photoshop.exe’ and select “Open with Wine Windows Program Loader”
PS CS5 should now load. You might consider creating a shortcut and placing it on your desktop for easier access.
 
-