Just to clarify, I am referring to the cabin air filter:
That is pretty straight fwd except for the crawling under the passenger seat. To put back in the filter put it first and then put the cover that snaps, otherwise it's harder. Probably took 10 min first time I did it.
And to the intake air filter:
What you need to know is that the filter is below the engine cover. So, you need to get the cover out first. Follow this. Then take the screws out of the cover, open it up, replace the filter, close it (making sure the hinges get back it, which is the difficult part) and un-do the previous steps. To snap the cover back in, in my case, it just went in by putting pressure, but maybe I was lucky...
This other video is not very good, but FYI https://www.youtube.com/watch?v=damY97JjTQ4
This one took me (first time) about 1hr (I didn't know how to remove the engine cover till found the video...).
Cheers!
Saturday, October 4, 2014
Monday, June 9, 2014
3D effect without glasses
The following shows how to give the phone or tablet user the sensation of looking at an object in 3D by just using the front facing camera. I believe that this is a similar technique to what the Amazon phone is using to display 3D (see this link, just guessing as phone not out till June 18th). See more background at the end of the post. In the mean time, let's just jump into the technique.
Basically with the phone front facing camera we recognize where the viewer's head is respect to the screen and present the objects on the screen from the viewers perspective. With this I create a 3D effect without glasses (no stereo vision, though, just the angle, which is powerful enough).
The code is relatively simple but unfortunately I do not know how to access some low level stuff, so, work comes into getting things running fast with some hacks... I tried my best but still one can see some lagging... Check out this video. Disclaimer: this is just an experiment. I had only ~20 pictures for the full angle of view, I didn't really adjust the angle of those pics to the angle perceived from the front camera (I eye balled that...) and it was kind of tough to record with the other phone while moving... a camera attached to my head would have been nice for this, but anyhow, gives the idea... :).
The top level structure is:
Load in memory all potential pictures, taken a priori from the potential viewer's perspective, so that they can be presented real time as fast as possible (limited by my knowledge :P)
Remember to place your pictures in the root of the SDCard + "/DCIM/3D" or modify that part of the code.
Notice that we save in memory the encoded pictures. This is a trade-off between storing the full raw data (see my first attempt on this topic here), which would be faster as it wouldn't need real time decoding, but would require much larger memory; and not storing anything, which saves all the memory but it is much slower (read from flash + decode).
Capture the camera image
Capturing the image is something pretty trivial in Android. Nevertheless, in our case we want to capture an image but present something completely unrelated to that image. Somehow, Android doesn't seem to support that in a well documented way. I have a post on that here.
I took the same approach as I did here. The general real time image capture framework is done with OpenCV. From OpenCV tutorial: "Implementation of CvCameraViewListener interface allows you to add processing steps after frame grabbing from camera and before its rendering on screen. The most important function is onCameraFrame. It is callback function and it is called on retrieving frame from camera."
Search for the face
This phase, together with displaying the image, are the ones limiting the rendering speed. To speed it up, ideally I wanted to use the "embedded" method that comes with the phone. I.e., the one that is showing a square around the faces when you are using the camera app that comes with my phone (an HTC One). It seems to be fast and reliable. Unfortunately I do not know how to access it.
The next method down (and the one I used) is the one that comes with the Android SDK (see code below and more details here).
The last method in our tool set is the OpenCV approach. See details here.
Compute the viewer's angle respect to the display. This is pretty straightforward, so, just check the code... Ideally you got to adjust this well to the angle of the pictures you have taken but I didn't really do the effort.
Present that image Based on the angle, pick the right picture from memory to be shown, decode it and present it. As explained on the first phase, this is not trivial to do with minimum lag.
Without more delay, let's go into the code:
_3DActivity.java
Tutorial3View.java
AndroidManifest.xml
Notice the manifest android.permission.READ_EXTERNAL_STORAGE and android.permission.CAMERA
And tutorial2_surface_view.xml
Finally, as promissed, some background on this project.
A friend that I had shown this app back in January just sent me this link. It is about the Amazon phone which we believe that it is using the same trick as I do here... Of course, not saying that I was the first one to come up with this idea. Probably somebody had the same thought before. Other folks have used similar tricks (like using a Kinect or a hack of the Wiimote) to sense where the viewer's head is respect to the display and present the right image.
Using those approaches they also have a better/real/full-3D location of the eyes/face/head respect to the display which allows for even a better effect. With one camera you can find only the angle of the face respect to the display, but not the distance (although somebody could argue that you can use the size of the face to estimate that...). Amazon probably solves that with the use of few cameras/triangulation.
Another aspect for improvement is that if there are several viewers in the field of view (FOV) of the camera, then it can get confused respect who to show the image. You could still present respect to one as long as you track the same face, which is one level above what I do.
I also don't do vertical tracking, only horizontal, to the sides... No biggy... Just didn't have enough pics. To simplify the picture taking part, I was thinking to use OpenGL/virtual world, instead of real life pictures, but never finished that... That will certainly be faster to render to.
Finally, I am sure the final effect in Amazon's phone will be a production ready thing, a better effect than I got, I hope, lol! (disclaimer :) ).
Anyhow, just posting this to claim my bragging rights, no matter how small those may be :P
Cheers!
PS.: Please check the following links for a full index of OpenCV and Android posts with other super duper examples :P
Basically with the phone front facing camera we recognize where the viewer's head is respect to the screen and present the objects on the screen from the viewers perspective. With this I create a 3D effect without glasses (no stereo vision, though, just the angle, which is powerful enough).
The code is relatively simple but unfortunately I do not know how to access some low level stuff, so, work comes into getting things running fast with some hacks... I tried my best but still one can see some lagging... Check out this video. Disclaimer: this is just an experiment. I had only ~20 pictures for the full angle of view, I didn't really adjust the angle of those pics to the angle perceived from the front camera (I eye balled that...) and it was kind of tough to record with the other phone while moving... a camera attached to my head would have been nice for this, but anyhow, gives the idea... :).
The top level structure is:
Load in memory all potential pictures, taken a priori from the potential viewer's perspective, so that they can be presented real time as fast as possible (limited by my knowledge :P)
Remember to place your pictures in the root of the SDCard + "/DCIM/3D" or modify that part of the code.
Notice that we save in memory the encoded pictures. This is a trade-off between storing the full raw data (see my first attempt on this topic here), which would be faster as it wouldn't need real time decoding, but would require much larger memory; and not storing anything, which saves all the memory but it is much slower (read from flash + decode).
Capture the camera image
Capturing the image is something pretty trivial in Android. Nevertheless, in our case we want to capture an image but present something completely unrelated to that image. Somehow, Android doesn't seem to support that in a well documented way. I have a post on that here.
I took the same approach as I did here. The general real time image capture framework is done with OpenCV. From OpenCV tutorial: "Implementation of CvCameraViewListener interface allows you to add processing steps after frame grabbing from camera and before its rendering on screen. The most important function is onCameraFrame. It is callback function and it is called on retrieving frame from camera."
Search for the face
This phase, together with displaying the image, are the ones limiting the rendering speed. To speed it up, ideally I wanted to use the "embedded" method that comes with the phone. I.e., the one that is showing a square around the faces when you are using the camera app that comes with my phone (an HTC One). It seems to be fast and reliable. Unfortunately I do not know how to access it.
The next method down (and the one I used) is the one that comes with the Android SDK (see code below and more details here).
The last method in our tool set is the OpenCV approach. See details here.
Compute the viewer's angle respect to the display. This is pretty straightforward, so, just check the code... Ideally you got to adjust this well to the angle of the pictures you have taken but I didn't really do the effort.
Present that image Based on the angle, pick the right picture from memory to be shown, decode it and present it. As explained on the first phase, this is not trivial to do with minimum lag.
Without more delay, let's go into the code:
_3DActivity.java
/*
* Working demo of face detection (remember to put the camera/phone in horizontal)
* using OpenCV as framework, with Android Face recognition.
* AS GOOD AS IT GETS. Still not that smooth. Probably will do better when we
* present a graph with OpenGL.
*/
package com.cell0907.TDpic;
import java.io.File;
import java.util.Arrays;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvException;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfInt;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Point;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;
public class _3DActivity extends Activity implements CvCameraViewListener2 {
private static final int VIEW_MODE_CAMERA = 0;
private static final int VIEW_MODE_GREY = 1;
private static final int VIEW_MODE_FACES = 2;
private static final int VIEW_MODE_3D = 3;
private MenuItem mItemPreviewRGBA;
private MenuItem mItemPreviewGrey;
private MenuItem mItemPreviewFaces;
private MenuItem mItemPreview3D;
private int mViewMode;
private Mat mRgba;
private Mat mGrey;
private int screen_w, screen_h;
private Tutorial3View mOpenCvCameraView;
//private Bitmap[] mImageCache; // A place to store our pics
private MatOfByte[] mImageCache; // A place to store our pics in jpg format
private int numberofitems;
private int index;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
// Load native library after(!) OpenCV initialization
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
public _3DActivity() {
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.tutorial2_surface_view);
mOpenCvCameraView = (Tutorial3View) findViewById(R.id.tutorial2_activity_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
index=0;
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
screen_w=width;
screen_h=height;
mRgba = new Mat(screen_w, screen_h, CvType.CV_8UC4);
mGrey = new Mat(screen_w, screen_h, CvType.CV_8UC1);
load_images();
Log.v("MyActivity","Height: "+height+" Width: "+width);
}
public void onCameraViewStopped() {
mRgba.release();
mGrey.release();
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
long startTime = System.nanoTime();
long endTime;
boolean show=true;
mRgba=inputFrame.rgba();
if (mViewMode==VIEW_MODE_CAMERA) {
endTime = System.nanoTime();
if (show==true) Log.v("MyActivity","Elapsed time: "+ (float)(endTime - startTime)/1000000+"ms");
return mRgba;
}
if (mViewMode==VIEW_MODE_GREY){
Imgproc.cvtColor( mRgba, mGrey, Imgproc.COLOR_BGR2GRAY);
endTime = System.nanoTime();
if (show==true) Log.v("MyActivity","Elapsed time: "+ (float)(endTime - startTime)/1000000+"ms");
return mGrey;
}
// REDUCE THE RESOLUTION TO EXPEDITE THINGS
Mat low_res = new Mat(screen_w, screen_h, CvType.CV_8UC4);
Imgproc.resize(mRgba,low_res,new Size(),0.25,0.25,Imgproc.INTER_LINEAR);
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(low_res.width(), low_res.height(), Bitmap.Config.RGB_565);
Utils.matToBitmap(low_res, bmp);
}
catch (CvException e){Log.v("MyActivity",e.getMessage());}
int maxNumFaces = 1; // Set this to whatever you want
FaceDetector fd = new FaceDetector((int)(screen_w/4),(int)(screen_h/4),
maxNumFaces);
Face[] faces = new Face[maxNumFaces];
int numFacesFound=0;
try {
numFacesFound = fd.findFaces(bmp, faces);
} catch (IllegalArgumentException e) {
// From Docs:
// if the Bitmap dimensions don't match the dimensions defined at initialization
// or the given array is not sized equal to the maxFaces value defined at
// initialization
Log.v("MyActivity","Argument dimensions wrong");
}
if (mViewMode==VIEW_MODE_FACES) {
if (numFacesFound<maxNumFaces) maxNumFaces=numFacesFound;
for (int i = 0; i < maxNumFaces; ++i) {
Face face = faces[i];
PointF MidPoint = new PointF();
face.getMidPoint(MidPoint);
/* Log.v("MyActivity","Face " + i + " found with " + face.confidence() + " confidence!");
Log.v("MyActivity","Face " + i + " eye distance " + face.eyesDistance());
Log.v("MyActivity","Face " + i + " midpoint (between eyes) " + MidPoint);*/
Point center= new Point(4*MidPoint.x, 4*MidPoint.y);
Core.ellipse( mRgba, new Point(center.x,center.y), new Size(8*face.eyesDistance(), 8*face.eyesDistance()), 0, 0, 360, new Scalar( 255, 0, 255 ), 4, 8, 0 );
}
endTime = System.nanoTime();
if (show==true) Log.v("MyActivity","Elapsed time: "+ (float)(endTime - startTime)/1000000+"ms");
return mRgba;
//return low_res;
}
// 3D
if (numFacesFound>0){
Face face = faces[0];
PointF MidPoint = new PointF();
face.getMidPoint(MidPoint);
int face_x=4*(int)MidPoint.x;
// The face can show up from x0=k.screen_w to x1=(1-k)screen_w
// index=A.face_x+B
// 0 = A.k.screen_w + B
// N = A.(1-k).screen_w + B where N=numberofitems-1
// Therefore:
// A=N/((1-2k).screen_w)
// B=-A.k.screen_w=-N.k/(1-2k)
int N=numberofitems-1;
double k=0.1;
double A=N/((1-2*k)*screen_w);
double B=-N*k/(1-2*k);
index=(int)Math.floor(A*face_x+B);
index=numberofitems-index-1;
//Log.v("MyActivity","x: "+face_x+" index: "+index);
if (index<0) index=0;
if (index>numberofitems-1) index=numberofitems-1;
}
//mImageCache[index] is a array of bytes containing the jpg
mRgba=Highgui.imdecode(mImageCache[index],Highgui.CV_LOAD_IMAGE_COLOR);
endTime = System.nanoTime();
if (show==true) Log.v("MyActivity","Elapsed time: "+ (float)(endTime - startTime)/1000000+"ms");
//Log.v("MyActivity","Index: "+index);
return mRgba;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mItemPreviewRGBA = menu.add("RGBA");
mItemPreviewGrey = menu.add("Grey");
mItemPreviewFaces = menu.add("Faces");
mItemPreview3D = menu.add("3D");
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
if (item == mItemPreviewRGBA) {
mViewMode = VIEW_MODE_CAMERA;
} else if (item == mItemPreviewGrey) {
mViewMode = VIEW_MODE_GREY;
} else if (item == mItemPreviewFaces) {
mViewMode = VIEW_MODE_FACES;
} else if (item == mItemPreview3D) {
mViewMode = VIEW_MODE_3D;
}
return true;
}
//LOAD IMAGES
void load_images(){
//android.hardware.Camera.Size r=mOpenCvCameraView.getResolution();
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/DCIM/3D");
File[] file_list = myDir.listFiles();
Arrays.sort(file_list); // Otherwise file order is unpredictable
numberofitems=file_list.length;
//mImageCache=new Bitmap[numberofitems];
mImageCache=new MatOfByte[numberofitems];
Mat temp3 = new Mat(screen_w, screen_h, CvType.CV_8UC4);
MatOfInt compression_params=new MatOfInt(Highgui.CV_IMWRITE_JPEG_QUALITY,50);
Log.v("MyActivity","NOI: "+numberofitems);
for (int i=0;i<numberofitems;i++){
try{
mImageCache[i]=new MatOfByte();
Log.v("MyActivity","i: "+i);
Bitmap temp1=BitmapFactory.decodeFile(file_list[i].getPath());
Bitmap temp2=Bitmap.createScaledBitmap(temp1, screen_w , screen_h, true);
Utils.bitmapToMat(temp2,temp3);
//Log.v("MyActivity","w: "+temp3.width()+" l: "+temp3.height());
Highgui.imencode(".jpg", temp3, mImageCache[i],compression_params);
Log.v("MyActivity","Length: "+mImageCache[i].total());
} catch (Exception e) {
e.printStackTrace();
Log.v("MyActivity", "L: Error loading");
}
}
}
}
Tutorial3View.java
package com.cell0907.TDpic;
import java.io.FileOutputStream;
import java.util.List;
import org.opencv.android.JavaCameraView;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.util.AttributeSet;
import android.util.Log;
public class Tutorial3View extends JavaCameraView implements PictureCallback {
private static final String TAG = "MyActivity";
private String mPictureFileName;
public Tutorial3View(Context context, AttributeSet attrs) {
super(context, attrs);
}
public List<String> getEffectList() {
return mCamera.getParameters().getSupportedColorEffects();
}
public boolean isEffectSupported() {
return (mCamera.getParameters().getColorEffect() != null);
}
public String getEffect() {
return mCamera.getParameters().getColorEffect();
}
public void setEffect(String effect) {
Camera.Parameters params = mCamera.getParameters();
params.setColorEffect(effect);
mCamera.setParameters(params);
}
public List<Size> getResolutionList() {
return mCamera.getParameters().getSupportedPreviewSizes();
}
public void setResolution(Size resolution) {
disconnectCamera();
mMaxHeight = resolution.height;
mMaxWidth = resolution.width;
connectCamera(getWidth(), getHeight());
}
public Size getResolution() {
return mCamera.getParameters().getPreviewSize();
}
public void takePicture(final String fileName) {
Log.i(TAG, "Taking picture");
this.mPictureFileName = fileName;
// Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture.
// Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue
mCamera.setPreviewCallback(null);
// PictureCallback is implemented by the current class
mCamera.takePicture(null, null, this);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.i(TAG, "Saving a bitmap to file");
// The camera preview was automatically stopped. Start it again.
mCamera.startPreview();
mCamera.setPreviewCallback(this);
// Write the image in a file (in jpeg format)
try {
FileOutputStream fos = new FileOutputStream(mPictureFileName);
fos.write(data);
fos.close();
} catch (java.io.IOException e) {
Log.e("PictureDemo", "Exception in photoCallback", e);
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cell0907.TDpic"
android:versionCode="21"
android:versionName="2.1">
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:label="@string/app_name"
android:icon="@drawable/icon"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:allowBackup="false">
<activity android:name="_3DActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Notice the manifest android.permission.READ_EXTERNAL_STORAGE and android.permission.CAMERA
And tutorial2_surface_view.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.cell0907.TDpic.Tutorial3View
android:id="@+id/tutorial2_activity_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
opencv:camera_id="1"
opencv:show_fps="false" />
</LinearLayout>
Finally, as promissed, some background on this project.
A friend that I had shown this app back in January just sent me this link. It is about the Amazon phone which we believe that it is using the same trick as I do here... Of course, not saying that I was the first one to come up with this idea. Probably somebody had the same thought before. Other folks have used similar tricks (like using a Kinect or a hack of the Wiimote) to sense where the viewer's head is respect to the display and present the right image.
Using those approaches they also have a better/real/full-3D location of the eyes/face/head respect to the display which allows for even a better effect. With one camera you can find only the angle of the face respect to the display, but not the distance (although somebody could argue that you can use the size of the face to estimate that...). Amazon probably solves that with the use of few cameras/triangulation.
Another aspect for improvement is that if there are several viewers in the field of view (FOV) of the camera, then it can get confused respect who to show the image. You could still present respect to one as long as you track the same face, which is one level above what I do.
I also don't do vertical tracking, only horizontal, to the sides... No biggy... Just didn't have enough pics. To simplify the picture taking part, I was thinking to use OpenGL/virtual world, instead of real life pictures, but never finished that... That will certainly be faster to render to.
Finally, I am sure the final effect in Amazon's phone will be a production ready thing, a better effect than I got, I hope, lol! (disclaimer :) ).
Anyhow, just posting this to claim my bragging rights, no matter how small those may be :P
Cheers!
PS.: Please check the following links for a full index of OpenCV and Android posts with other super duper examples :P
Wednesday, April 9, 2014
HSA reporting
One more year filling in the taxes and this year, I happen to have an HSA. So, this is how I entered the info (disclaimer, not sure if right or wrong):
One thing to notice is that as you fill in stuff in TaxAct or TurboTax, it considers the HSA contribution as income. Then, when you enter finally the HSA form, it removes them, giving you a break on the amount of tax your owe.
HSA FAQ
Other link...
- In the W2 the employer puts all contributions (employer and employee), although they call it in the wording "employer contributions". Kind of distracting...
- You also should have got
- Then you got to fill in form 8889. In my case, very simple, single, etc... I had to put:
- Box 3, 5, 6 and 8: $3250. Basically max I could contribute.
- Box 9, 11: what was showing on the W2. Contributions from your employer (which include yours done directly from payroll). In my case $2500. Check the form 5498-SA that you should have received from your broker.
- That makes box 12 $750. I.e., that's what we could have contributed but we didn't.
- And then on distributions (what you took from the HSA) I had 14a, 14c and 15 as $727. All mine are qualified medical expenses... You should have got form 1099 from your HSA broker. Just look it up...
One thing to notice is that as you fill in stuff in TaxAct or TurboTax, it considers the HSA contribution as income. Then, when you enter finally the HSA form, it removes them, giving you a break on the amount of tax your owe.
HSA FAQ
Other link...
Sunday, March 16, 2014
Simple plan for Barcelona visit - Day B - Eixample / Gaudi
For this B day, we will be in the area of Barcelona called the Example and also a bit further towards the mountain. Please see here for other locations in Barcelona. Except for Parc Guell, the other locations are buildings, so, ok to visit during bad weather... Nevertheless, Sagrada Familia may close the visit to the tower (just to the tower) in that case... Also, they are nice at night (but open only during day time...):
Check the map here
Safe travels!!
- Sagrada Familia: this is one of the most emblematic icons of the city. You can buy the tickets on-line. Not sure if that will save you the line outside but I heard that although long, it is not too bad... Unless you are in a tight budget, I do think it is worth to go in. Go up in the tower is nice too. I can talk hours about this place, but to save you that, I would strongly recommend you to read the Wikipedia article to get a good background. Nice article about the towers and which one to visit.
- Pedrera and Casa Batllo: walking distance from Sagrada Familia (see the black line in the map below). Famous spots of the city too, feel free to go in if your budget/time allows.
- To get to Park Guell, another must-see place, I usually take subway green line (L3) to Vallcarca station. The line kind of goes along the mountain/sea axis for a while, down Gracia and Ramblas, so, you can take it from any station there (Passeig de Gracia, Catalunya, Liceu, Drassanes...). Once you get to Vallcarca walk a bit along Vallcarca Avenue, sea direction, till you hit Baixada de la Gloria, on your left (red line in the map). It is a street full of mechanical scalators (feel free to walk too :) ) that will take you to the South side of the Park. I feel that is more interesting than getting a taxi up there, but hey... Unfortunately, the city started charging to enter on the park around 2016 (can't remember, but used to be free) but you can get there earlier or later than the running hours and see it for free. In the morning you can see the sun raise (assuming you can wake up in time :) ), so, it is much better than in the evening, when it may get dark depending on the time of the year and you can't see anything in the park (no lights).
Check the map here
Safe travels!!
Saturday, March 15, 2014
Simple plans to visit Barcelona
Few friends asked me about what to do/go in Barcelona, so, here is a
summary of some stuff... I broke it by days, so, it makes it easier to
plan things...
Note: I hate to start by this, but watch with the pickpockets... Few friends of mine got stolen their wallet or purse, so... Other than that, I would consider Barcelona to be very safe.
For a 3 days trip I would think something like this (sorry not finished, I'll add later). Order of days does not matter. Probably plan according to weather forecast :)
PS.: Sorry that I can't include everything, as Barcelona is full of stuff to see and do. If you want more info, these are some quick sites I found:
Note: I hate to start by this, but watch with the pickpockets... Few friends of mine got stolen their wallet or purse, so... Other than that, I would consider Barcelona to be very safe.
For a 3 days trip I would think something like this (sorry not finished, I'll add later). Order of days does not matter. Probably plan according to weather forecast :)
- Day A - Montjuic area
- Day B - Eixample/Gaudi
- Day C - Casco Viejo/Ciutat Vella and sea side.
- Day 1: Sagrada Familia (day B above) / Park Guell (day B above)
- Day 2: Day C above.
- On whatever time after hours/night you have, you can see the outside of Pedrera and Casa Batllo (day B above) and the Magic Fountains (day A above).
PS.: Sorry that I can't include everything, as Barcelona is full of stuff to see and do. If you want more info, these are some quick sites I found:
Simple plan for Barcelona visit - Day A - Montjuic Area
Please see here for overall index for other areas of town.
Note 1: The order you do this is a bit up to you. If you got your hotel close to this area, you can just do this anytime. But if not, you may want to plan to finish at night and stop by the Magic Fountains.
Note 2: times indicate my guess on how much somebody would spend there...
Note 3: click on the map below and a Google Maps route should open up.
View Montjuic route in a larger map
Hope you enjoy!!
Note 1: The order you do this is a bit up to you. If you got your hotel close to this area, you can just do this anytime. But if not, you may want to plan to finish at night and stop by the Magic Fountains.
Note 2: times indicate my guess on how much somebody would spend there...
Note 3: click on the map below and a Google Maps route should open up.
- Spanish Square (Plaza de España / Plaça d'Espanya). Subway stop, red line (#1). Head towards the two towers you see there, which mark the Fira (trade fair) entrance and the path to the mountain (most of the stuff to see in the area...).
- Las Arenas: in the Spanish Square (actually, one exit of the subway is there), it is a bullfighting ring remodeled into a mall. You can go to the roof top (for free if you do it from inside the mall) and enjoy the views, food, etc... or the shopping, if you like :). Maybe something to do when you want to take a break.
- Olympic ring: 1-2hr Take a stroll around... There are mechanical stairs up to here, from Plaza España:
- Estadio Olimpico. Check the cauldron where this happened
- Estadio de Sant Jordi - Basketball
- Torre de Calatrava - I like this one
- Castillo de Montjuic (a castle to city and sea views): you can walk to here or take a lift - 1hr
- Poble Espanyol: a display of other regions in Spain.
- Diving Pools (Piscinas de salto) : Where during the Olympics you could see this beautiful background. I believe now most of the time they are close so you can only see from the fence...
- Greek Theater Gardens - 30 min
- Magic Fountains: A must see, at night. - 1hr... till you get tired. Show/music changes along the night... I copy schedule below in case the link gets broken but it may get out of date (so, better to Google it). Notice that during most of the year, they only run them from Th. through Saturday, so, plan a visit to this area in that time of the week...
- Operating hours from 30th April to 30th September:
- Thursday to Sunday, 9pm – 11:30pm
- Musical displays: 9pm, 9:30pm, 10pm, 10:30pm and 11pm
- Operating hours from 1st October to 30th April:
- Fridays and Saturdays, 7pm – 9pm
- Christmas and Easter:
- Thursday to Sunday, 7pm – 9pm
- Musical displays: 7pm, 7:30pm, 8pm and 8:30pm
- B-Hotel: I am not endorsing this hotel by no means and I make no money with this site... Do your research. But some friends of mine were there and liked it, specially the rooftop pool! Truth is that no one has so far complained about their hotel, wherever they stayed.
- There are many other things to do and see in the area: Miro Museum and many others (see the links on the right side of this page)
View Montjuic route in a larger map
Hope you enjoy!!
Thursday, March 6, 2014
Recovering an edited email file attachment
My life just went by my eyes... I had been working the whole day adding notes and corrections to a pdf file. A work that I actually hate and I was looking fwd to finish. I was clicking save while not realizing that I had not made a copy to disk. Was not getting any errors, though... Then I close it and hit me (with scenes of my infancy, chills, and thoughts of how stupid I can be). Well, if you are here, probably you have the same symptoms.
I have to say that I was lucky and found this
Bottom line, the file is in your Internet file folder but it will not show with search. Follow the link to find it.
Cheers! Now you can continue with your life :)
I have to say that I was lucky and found this
Bottom line, the file is in your Internet file folder but it will not show with search. Follow the link to find it.
Cheers! Now you can continue with your life :)
Subscribe to:
Posts (Atom)
