My name is Juri Strumpflohner and this is my technical blog. I'm a software architect, .Net, Android, Web and Java dev, TDD and best practices promoter and martial arts practitioner.

Recent Posts Subscribe

Dear reader of Juri's TechBlog,
I moved my blog to a new domain and a new hosting solution as well. I'm now blogging on juristr.com.

TIS Free Software Center: 60 minutes for developers

Today I attended the first of the series of 4 seminars titled "60 minutes for developers", organized by the Free Software Center in collaboration with the CASE center of the Free University of Bolzano (my "ex"-University actually :) ). This seminar's topic was "Eclipse RCP" which stands for Eclipse Rich Client platform. I went to it since I'm currently working on Devbook, a personal project which I'm developing on top of Eclipse RCP. The seminar, hold by Andrejs Jermakovics - a University student - was however more an introduction to the Eclipse platform where he gave an overview of its structure, the plugins and the RCP in general. So since I'm already working with RCP applications for more or less a year now it was nothing new for me.
I find the initiative however very interesting. Although Eclipse RCP exists already for more years now, it is - if at all - just rarely used in software companies here in South Tyrol. Window and layout management, automatic updating, modular and extensible design with plugins, fragments and features and product branding are just some of the features and advantages provided by the Eclipse RCP environment. It can for sure be said that it is an innovative and emerging technology in the Java development sector wherefore it become an interesting and attractive alternative for our local industry in the next years.

Links related to Eclipse
http://www.eclipse.org
http://wiki.eclipse.org/index.php/Rich_Client_Platform
http://www.eclipse.org/community/rcp.php
http://www.vogella.de/eclipse.html
http://www.eclipse.org/equinox-portal/ (New Eclipse Equinox Server-side initiative)

Next upcoming "60 min. for developers" seminars:
Thursday, 27.04.2008, 2-3 PM: Ajax
Friday, 23.05.2008, 2-3 PM: Subversion
Friday, 27.06.2008, 2-3 PM: Zimbra
Where? Here!

Noo! Google Browser Sync deleted my Firefox bookmarks

I'm using Google Browser Sync already for a longer time since it is quite comfortable for synchronizing the Firefox bookmarks between the different computers (at work, notebook, main homepc). Today morning however I couldn't believe my eyes. When I started Firefox, the bookmarks toolbar was completely empty. The same happened also on my other PC's Firefox. Something must have gone wrong with the synchronization and so Google Browser Sync has deleted all my bookmarks.
Since I've seen that more people have experienced the same problem, I decided to write a post on how you can restore your deleted bookmarks (for Windows).

  1. Open Firefox
  2. On the menu goto Bookmarks/Organize Bookmarks
  3. The Firefox Bookmark Manager will open. There on the menu click on File/Import
  4. Proceed as shown..

  5. Click "Next" and navigate to the folder C:\Documents and Settings\<your_username>\Application Data\Mozilla\Firefox\Profiles\
    If you shouldn't be able to locate the folders directly, just type it into the text-field as demonstrated below:

    You should see a strange folder, named similar like "wu59pacm.default". Enter into that folder and then into "bookmarkbackups".
  6. Select the most actual file and open it.
  7. You should now be able to see your bookmarks.
I hope I was able to help you. Otherwise leave a comment.

Logical separation with MVC

I'm currently working on a personal project (which I'll publish here, so keep an eye on my blog ;) ) which I wanted to construct optimally in terms of the architecture. So today I decided to take a piece from the architectural part of my Bsc. thesis and publish it on my blog here. In specific I'll write about the MVC paradigm.

MVC is the acronym for "Model View Controller" and is a design pattern whose aim is to logically separate the application into a model-,controller- and view-part.
The Model comprises the domain model objects of the application. It contains the data and encodes the rules for giving access to this data.
The View is the end-point of the application which interacts directly with the user by presenting the data contained in the model. If the model changes the view has to be updated. This can be done by using the so-called "push" approach where the view registers itself at the model for changes or the "pull" approach where the view itself has to call the appropriate methods on the model for retrieving the updated information.
The Controller translates the user interactions on the view into actions on the model.

This figure shows a common MVC implementation:

Here the view registers itself on the model for listening to property changes. User interactions on the view are forwarded to the controller which performs some actions on the model. These changes of properties on the model side are again reflected on the view (since the view listens for changes on it). The disadvantage of this kind of MVC structure is the coupling between the view and the model.
Therefore I prefer a slightly different and more recent implementation of the MVC paradigm. The figure below outlines its basic structure.
In this example the view and the model are completely separated and work independently. The controller works as mediator between them by forwarding the according user actions from the view down to the model and the respective property change events back up to the view. This kind of structure keeps the application much more flexible and more loosely coupled. The view could be exchanged with nearly no changes since it doesn't know anything about the domain model it is representing.
Sounds nice, doesn't it?? But to not just illustrate the theoretical aspects and for a better understanding I decided to code a small demo application according to which one is able to better understand the concepts I was talking about above. Before starting to talk about it you can download it from my Open Source projects download page:

The application just manages a list of people. The available operations are to add a new person and to modify its properties. Nonsense, but it helps understanding MVC. The application consists of 3 different windows.
I decided to structure it like this, since in this way one can better see how the changes are done by the MVC and how the view is updated "magically" when the model is changed. When the user presses for instance the "Add new Person" button, the application directly adds a new Person object to the application model. The list of people of the window in the center is never touched, but since it is linked with the MVC to the application model, it automatically gets the new added person object.

But now lets take a look at the interesting part: the source code. In principle there are 3 major important classes which make up our MVC helper utility and which are subclassed by the corresponding domain objects of our application:
  • AbstractModel (abstract class)
  • AbstractController (abstract class)
  • IView (interface)
AbstractModel.java
package com.jsdevelopment.mvcdemo.mvcutils;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public abstract class AbstractModel{
protected PropertyChangeSupport propertyChangeSupport;

public AbstractModel(){
propertyChangeSupport = new PropertyChangeSupport(this);
}

public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}

protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
}

protected void fireInitialProperties(){
}
}
The AbstractModel is subclassed by our domain model classes, adding the property change support to them. The changes we have to do on our model are just the following:

package com.jsdevelopment.mvcdemo.model;

import com.jsdevelopment.mvcdemo.controller.PersonController;
import com.jsdevelopment.mvcdemo.mvcutils.AbstractModel;

public class Person extends AbstractModel {
private String firstname;
private String surname;
private int age;

...

public void setAge(Integer age) {
...
}

...

public void setFirstname(String firstname) {
String oldValue = this.firstname;
this.firstname = firstname;
firePropertyChange(PersonController.FIRSTNAME_PROPERTY, oldValue, firstname);
}

..

public void setSurname(String surname) {
...
}

public void fireInitialProperties(){
firePropertyChange(PersonController.AGE_PROPERTY, null, age);
firePropertyChange(PersonController.FIRSTNAME_PROPERTY, null, firstname);
firePropertyChange(PersonController.SURNAME_PROPERTY, null, surname);
}
...
}
I've hidden the getters, since the interesting part here are the setters since the action happens there. Take for instance the setFirstname(String) method. What I do there is to keep the old value, then I set the new value, just as usual and then we fire the property-change event which we inherited from the AbstractModel class.
Lets move over to our AbstractController. Here's the abbreviated source code:

AbstractController.java
package com.jsdevelopment.mvcdemo.mvcutils;
...
public abstract class AbstractController implements PropertyChangeListener {

private ArrayList<IView> registeredViews;
private ArrayList<AbstractModel> registeredModels;

public AbstractController() {
registeredViews = new ArrayList<IView>();
registeredModels = new ArrayList<AbstractModel>();
}

...

public void propertyChange(PropertyChangeEvent evt) {

for (IView view: registeredViews) {
view.modelPropertyChange(evt);
}
}

protected void setModelProperty(String propertyName, Object newValue) {

for (AbstractModel model: registeredModels) {
try {

Method method = model.getClass().
getMethod("set"+propertyName, new Class[] {
newValue.getClass()
}


);
method.invoke(model, newValue);

} catch (Exception ex) {
// Handle exception.
}
}
}
}
The AbstractController class is mainly responsible for propagating the corresponding events either from the model to the view or vice-versa. The following two methods are especially interesting since they are somehow the core of the MVC:
  • propertyChange(PropertyChangeEvent)
    This method is responsible for propagating a change of a property from the model to the view. As you can see it iterates over the list of registered views and calls the method modelPropertyChange(...) which is implemented by our views.
  • setModelProperty(String, Object)
    This method - as you probably guess already - is responsible for propagating the user-actions on the view down to the model. This method is especially tricky since it uses the Java reflection mechanism for finding the right method to invoke. As you can see from the code above it calls the setter on the registered models which corresponds to the given property-event.
Our specific controller - in this demo application the PersonController - has not much to do actually:
package com.jsdevelopment.mvcdemo.controller;

import com.jsdevelopment.mvcdemo.mvcutils.AbstractController;

/**
* Controller for synchronizing the Person domain object
* with the respective View
*
*/
public class PersonController extends AbstractController {
public static final String FIRSTNAME_PROPERTY = "Firstname";
public static final String SURNAME_PROPERTY = "Surname";
public static final String AGE_PROPERTY = "Age";

public PersonController(){
}

public void changeFirstName(String newValue){
setModelProperty(FIRSTNAME_PROPERTY, newValue);
}

public void changeSurname(String newValue){
setModelProperty(SURNAME_PROPERTY, newValue);
}

public void changeAge(String newValue){
Integer value = Integer.parseInt(newValue);
setModelProperty(AGE_PROPERTY, value);
}
}
So, lets see what's interesting here. For the first you can see that it inherits from our AbstractController class we've seen before. The next thing which catch one's eye are the static constants defined at the beginning. If you take a look at the AbstractModel you'll see that these constants are used for identifying the type of property change. Moreover in the AbstractController.setModelProperty(...) method it is used for constructing the right signature of the setter-method of the domain model which has to be invoked. And then there are the different methods such as changeFirstName and so on. These methods are directly called by the view (we'll see that below) and they then call the setModelProperty(...) method for propagating the change down to the model.
Finally we can move on to the 3rd component: the view.

IView.java
package com.jsdevelopment.mvcdemo.mvcutils;

import java.beans.PropertyChangeEvent;

public interface IView {
public void modelPropertyChange(PropertyChangeEvent evt);
}
This class is really simple. It is implemented as an interface for grouping all of our views together and for constraining them to implement the modelPropertyChange(...) method which is called by the AbstractController. The essential parts on our view are then the following:
package com.jsdevelopment.mvcdemo.view;
...

import com.jsdevelopment.mvcdemo.controller.PersonController;
import com.jsdevelopment.mvcdemo.mvcutils.AbstractController;
import com.jsdevelopment.mvcdemo.mvcutils.IView;

public class PersonView extends JFrame implements IView {
...
private PersonController controller = null;
...

/**
* This method initializes
*
*/
public PersonView(AbstractController controller) {
super();
initialize();
this.controller = (PersonController)controller;
}

...

private JButton getJButtonSave() {
if (jButtonSave == null) {
jButtonSave = new JButton();
jButtonSave.setBounds(new Rectangle(112, 102, 70, 24));
jButtonSave.setText("Save");
jButtonSave.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
//fire all property changes
controller.changeFirstName(jTextFieldFirstname.getText());
controller.changeSurname(jTextFieldSurname.getText());
controller.changeAge(jTextFieldAge.getText());

closeFrame();
}
});
}
return jButtonSave;
}

public void modelPropertyChange(PropertyChangeEvent evt) {
if(evt.getNewValue() == null) return;

String value = evt.getNewValue().toString();

if(evt.getPropertyName().equals(PersonController.FIRSTNAME_PROPERTY)){
jTextFieldFirstname.setText(value);
}else if(evt.getPropertyName().equals(PersonController.SURNAME_PROPERTY)){
jTextFieldSurname.setText(value);
}else if(evt.getPropertyName().equals(PersonController.AGE_PROPERTY)){
jTextFieldAge.setText(value);
}
}
}
The first thing here is to get a reference to our actual controller class. In my example here this is done directly in the constructor. Once could however also do this with a separate setter. If you go further, you'll come to the listener attached to the save button. I've decided to propagate all actions down to the model when the save-button is clicked. So what I do there is just to call the methods of my controller which we have seen before. That's all. Finally we have our modelPropertyChange(...) method which we inherited from our IView interface (remember?) and which is implemented here. This method gets invoked when our AbstractController gets an property-change event notification from one of our domain objects. Here we just ask which property has been fired and then we set the value on the appropriate view control.

So since we've covered now the critical part lets move over to the actual binding of these components. In my demo application this is done in the ApplicationController:
package com.jsdevelopment.mvcdemo.controller;

import com.jsdevelopment.mvcdemo.model.Person;
import com.jsdevelopment.mvcdemo.mvcutils.AbstractController;
import com.jsdevelopment.mvcdemo.view.PersonView;


public class ApplicationController extends AbstractController {
...

public void showPersonView(Object selectedValue) {
//construct the MVC binding
Person p = (Person)selectedValue;
pController = new PersonController();
PersonView pView = new PersonView(pController);
pController.addModel(p);
pController.addView(pView);


//show the view
pView.setVisible(true);

//display initial properties on view by firing the property actions
p.fireInitialProperties();
}
}
Here inside the showPersonView(...) method I simply create a new PersonController object and I associate the given domain object of type Person and add it to the controller as well as the reference of my view which will present the content of the object to the end-user. This piece of code is just to demonstrate the binding and may not be that optimal. So it is not really advisable to create a new controller object each time but you'd have to maybe create it the first time and then to register and unregister the different models and views. What may still make you wonder is the last line where I invoke the fireInitialProperties() method. This is done to fill the view with the initial values of the domain object (if it contains some).

Well, that was it. Easy isn't it ;). The best thing is again to download the demo application and study its source code which is included in the archive. Otherwise you can also access it on the public SVN repository. Feel free to put your comment if you have further question or suggestions for better solutions.

Here's a post on the Google Testing blog that highlights the advantages of such an MVC structure:
http://googletesting.blogspot.com/2009/02/with-all-sport-drug-scandals-of-late.html

Beside hacking each day...

...at the computer, I recently started a non-computer-science-related project :) , one where I was able to refresh a little my mechanical skills :) Already for a longer time now I had the need for a Katana stand. Instead of buying one on the web, I decided to construct one by myself, or better together with the help of my brother Thomas ;) which is very talented in these things.
So I searched a suitable picture of a Katana stand on the web. This one was the definitive model I decided to replicate. I bought the necessary material and started to design a template for the final construction.
Well, this is the outcome after hours of planning, sawing, filing and finally assembling. I think it can compete with the original one :D

Posting Source code on Blogger

When you have a blog (like this here) whose content is dedicated to Computer Science related stuff you will often have to post pieces of source code. In such a case the best thing is to create a CSS class which takes care of the areas containing your source code where you can set the font, colours, background, etc...You may also like to add syntax highlighting for a better viewing of your code.
Besides this "nice-to-have" stuff, there are however some difficulties you may encounter with Blogger. What I discovered is that it tries to do corrections on your HTML code which you can type when creating a new post. So for instance it does the following:
When you switch to the "Edit Html" tab and you type <pre class="code"> and then you switch to the "Compose" tab and immediately back to html viewing, you'll see that Blogger corrected your HTML code by automatically adding the closing tag </pre>. This seems to be nice and useful from a first perspective, but it gets really annoying if you try to paste some C, C++ or Java code where it happens that you have pieces between arrow brackets. In such a case Blogger will try to automatically close all your tags such as an C++ library import <iostream> Obviously this has the effect that your code gets displayed in a wrong manner.

It would be nice to have the Blogger team implement these things in a nicer way. To overcome these problems in the meantime I did (and I suggest you) to do the following things:

  1. First of all, paste your source code once you've finished writing the post. While writing you may put a blank row or something as a placeholder.
  2. Download WebCodeFormatter from my OS projects download page which is a small Java app which replaces all the critical characters in your code with the appropriate unicode notations which is safer.
    I'll release a slightly modified version in the next days or weeks which will allow you to do some customizations on the way the program translates the source code
  3. On your "Blogger" post, switch to the html view. Don't switch back to "Compose" mode from now on!!
  4. Start WebCodeFormatter and paste your source code into it. Convert the source code and then copy it to your blog post.
  5. As soon as you have "copy & pasted" all of your code click directly on the "Publish post" button on Blogger. As before don't switch to "Compose" mode since in this way Blogger will again mess up your code.
If you have questions, feel free to put comments. Actually there are not so many comments on my blog here so far. Either I'm explaining myself extremely well and clearly such that there are no open questions left at all :) or things are soo boring that nobody wants to comment on them (which I hope isn't the case ;) ).

Eclipse Con is open!!

Those of you (as myself) who were not able to attend the Eclipse Conference at Santa Clara have the possibility to download most of the material from the conference website:


The same holds for the last years (2007, 2006,...). There should be some interesting tutorials and talks available for download in the next days.
I'll see whether I'm able to manage to attend the conference once :(

Java Generics: C++ class templates vs. Java class generics

Generics are a great thing. C++ already had already a similar mechanism called templates. This for instance allowed you to write completely abstract classes which could - theoretically - be of any type. Take for instance the following:

#include <iostream>
#include <string.h>
#include <conio.h>

using namespace std;

template <class A> class Container{

A value;
public:
Container(A val){
value=val;
}

A getValue(){
return value;
}

void setValue(A val){
value = val;

}
};

int main(){
template class Container<string> *c = new Container<string>("hallo");
cout << "Printout: " << c->getValue() << "\n";
Container<int> d(3);
cout << "Printout: " << d.getValue();
getch();
}


In Java "templates" are called generics. They are enclosed with two <> signs. Translating the above code into Java would look as follows:

public class Container<T> {
private T t;

public Container(T t) {
this.t = t;
}

public T getT() {
return t;
}

public void setT(T t) {
this.t = t;
}

public void showType() {
System.out.println("\nI'm of type " + t.getClass().getSimpleName());
System.out.println("My value: " + t);
}

public static void main(String[] args) {
Container<String> gt = new Container<String>("Hello");
Container<Integer> gt2 = new Container<Integer>(10);

gt.showType();
gt2.showType();
}
}


The process of setting the type of the class template (in C++) or generic is called template specialization or generics specialization. Although the two different pieces of code may look quite similar, they are a different thing in both languages. Java generics simply offer compile-time safety and eliminate the need for casts. They are implemented directly by the Java compiler as a front-end conversion, also known as type erasure. The compiler basically just erases all generic specifications (between the angle brackets) and inserts casts where necessary. Moreover it keeps track of the generics internally such that all instantiations will use the same underlying generic class at compile/run time. It is therefore somehow a process of code translation or rewriting.
A C++ template gets reproduced and re-compiled entirely whenever a template is instantiated with a new class.
The main difference is that Java generics are encapsulated. The errors are flagged when they occur and not later when the corresponding classes are used/instantiated.

Improved code browsing on Google Code

Google Code Hosting changed its way of giving users the possibility to browse code online. Before the plain source file was just displayed on the browser by opening it as a normal text-file. Now they added a more intuitive way. The SVN repo is shown as a tree structure and source files are syntax highlighted. Here is the official blog post about it and here you can see the live demo of my general project svn repository (as also shown by the screenshots below).

Stage with Kaiso Hiroo Mochizuki

As mentioned I've been practicing Yoseikan already for 9 years now. Usually once per month we meet at Brunico for the Yudansha Kai, where we train together with Roman Patuzzi, a direct student of Yoseikan founder Hiroo Mochizuki.

Yesterday we had the opportunity that Hiroo Mochizuki itself, founder of Yoseikan Budo and son of Minoru Mochizuki, came to the Honbu Dojo at Brunico for a stage. I had the luck to gain a place for participating since there was a limit of about 50 athletes due to a lack of space. I already saw him 5 years ago at an international stage in Rimini. At that time however I was in the initial years of my Yoseikan practicing wherefore you don't really understand all the things. Now, having the 1st DAN (black belt) in Yoseikan, I have a bigger knowledge and so I also understand things much better. The stage yesterday was great. Apart from his ability, 9 DAN Karate Do, 8 DAN Aikido Yoseikan, 8 DAN Nihon Ju Jutsu and 7 DAN Iaido, just to mention some, he is very great from an interpersonal perspective. He knows how to inspire and delight people which impressed me a lot.
He basically didn't show us really new things but he explained us some basics really in deep and he mainly demonstrated us the concepts behind some techniques. Some things are really that simple, I'd say nearly banal, but you have to really understand them in deep. It's like a key you have to get and that's what he gave us. And then how he moves himself...it's impressing with which speed, having in mind that he's already 72 years old.
But now I stop to bore you, you have to experience it by yourself. I'll post some pictures of the stage, as soon as I've prepared them.


Links:

My new domain: js-development.com

Right! That's my new domain. Finally I've bought one. I planned to do that already for a longer time, but till now there was never really the need for one. So since I'm currently planning to set up a new page where I can collect and publish all of my projects (of course I'll put a link here when I've finished it) I thought it may be the right time to buy me a domain. My aim was always to minimize the effort for publishing on the web as much as possible since free time, beside work and training and girlfriend (no I'm joking of course ;) ) is scarce. Furthermore you won't publish much if you have to hack your HTML code each time :)
So I decided to open a Google Apps account, first because I'm already familiar with the most Google technologies and second because it offers you a lot of possibilities with mostly no cost where on the other site you would have to pay extra at other DNS providers. The domain registration can be done at http://www.google.com/a either directly over Google which has the advantage that all your services get directly configured by Google itself or you can buy your domain and then connect it to a Google Apps account. It is really cool since you can have a bunch of subdomains for no cost. The only thing you have to do is to add the necessary CNAME to your DNS configuration and let it point to ghs.google.com. I'll put the definitive "www" page of my domain online in the next days.
Well back to my domain, as you may have seen, this blog here is now available under http://blog.js-development.com. Users will be redirected automatically from my old domain http://juri-strumpflohner.blogspot.com. It will be interesting to see whether my positions in the Google search results will remain as good as they have been till now. Currently I'm experimenting with the new Google Sites project, which opened (for now) only for Google Apps users. It is basically the outcome of former JotSpot which has been acquired by Google. I thought to maybe use GSites for my project page, although I nearly had a solution in place. I combined Google Docs and Google Mashups for having a responsive and easily modifyable page. Maybe I'll publish it here, just as an example since someone could be interested in it.

Divshare, Dropbox and the still misterious GDrive

Recently several new online services cut its way to me over Google Reader. Those services offer the user a certain amount of "managed" webspace. "Managed" because users cannot access directly to this webspace over an FTP connection but through a provided end-user interfaces (web or desktop client).
The first service I heared of - and already signed up - is Divshare. Alex told me about it. It is a nice service which gives you 5 GB of webspace for free. Moreover you can upload files of a size up to 200 MB. Files can be organized in folders and shared with friends through a unique download URL.
The second service is Dropbox. It just went into private beta today. So you'll have to get an invitation for participating in this initial phase. In the mean time you can however take a look at the screencast. It seems to be a very interesting and new innovative way of sharing your files with others. It's impressing to see how files are automatically synched. Somehow it remembers me to an advanced version control system like SVN or CVS. Dropbox seems to be a lot more advanced than Divshare. Mainly its usage seems to be a lot easier due to the integrated Python-based desktop client. I cannot wait to get an invitation :) Here's a digg about it.
Talking about this, the "misterious" GDrive comes into my mind. Every now and then you hear some rumors around the web about its existence and that's already in use internally at Google. It will be interesting to see how these services will continue to compete...

Not bad...

In the last few month Google expanded their street view images to a lot of other cities in the US. Yesterday I just took a quick look, randomly on a street at the bay area of San Francisco. I thought to have heared that Google was obbligated to blur all of the people's faces on their street view material?

By looking at the following pictures it doesn't seem so...impressing :)


Check it out here..

Get in contact with your readers

Google just released an new interesting feature in relation with its instant messaging client(s) (Google Talk, Google Talk Gadget, Gmail Chat). You have now the possibility to place a so-called "chatback" on your website or blog. I just added it on the upper right gadget of my blog to test it ;) . It is basically an iframe which you can get from this site. People can then click on the link inside the speech bubble and start chatting directly with you. I find it an interesting and uncomplicated way for getting in contact with your blog readers. Lets see how it works :)
It may be interesting to know that if you set your current status to busy, your blog readers will not be able to get in contact with you since the link in the iframe will be deactivated.