avinashsing.sunkur.com
Open in
urlscan Pro
5.77.32.215
Public Scan
Submitted URL: http://sunkur.com/
Effective URL: https://avinashsing.sunkur.com/
Submission: On March 08 via api from US — Scanned from GB
Effective URL: https://avinashsing.sunkur.com/
Submission: On March 08 via api from US — Scanned from GB
Form analysis
1 forms found in the DOMGET https://avinashsing.sunkur.com/
<form role="search" method="get" class="search-form" action="https://avinashsing.sunkur.com/">
<div class="form-group">
<input type="search" class="form-control" placeholder="Search …" value="" name="s" title="Search for:">
</div>
<div class="form-submit">
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</div>
</form>
Text Content
* Home * About * Cookies Policy AV Talent can be developed through hard work USING .NET CORE IDENTITY 2 WITH MYSQL AND A CUSTOM USER TABLE SET TO AUTO INCREMENT USER ID INSTEAD OF GUID avinashsingDecember 16, 2018 I wanted to upgrade a website from Web Forms to .Net Core 2. In my previous project, I’ve used a custom authentication implementation which hashes user passwords with a salt and sends them a confirmation email which an activation code in it. I didn’t want to recode that part into .net core as Identity 2 provides a more secure and easy way of doing this. The main challenge for me was to make it work with a MySql backend through Dapper ORM using a custom user table. If you use Entity Framework, it’s a breeze but it’s not that as easy otherwise. So first things first, you need to implement the interfaces explicitly. I found a GitHub repo which had all the implementations I required. I just needed to adjust it to use my Dapper class and modify the SQL queries so it fetches/updates data using my custom user table. I needed to provide backward compatibility for user who’ve registered on the site before, so I was checking username/password using my V1 authentication (custom hashing done in Web Forms) and if they were valid, trigger an authentication through V2 (.Net Core Identity 2). All was working well except for one thing – I could not get the confirm email part to work. So here’s what happens: 1. User registers on the site 2. An email is sent to the user with a link that contains his a confirmation code and the user id 3. When the user clicks on the link, Identity 2 will validate the parameters and confirm the email However this was not happening for me. I wasted almost 2 days trying out things. Some people were saying you needed to UrlEncode the confirmation code and then decode on the other side. This however was not the issue I was having. I tried lots of things and nothing was working for me. It turns out my custom user table was using an auto-increment field for UserId while Identity 2 prefers a Guid. With the guid, you already have a unique id for the user without having to save the entry to the database. With an auto-increment field, you need to trigger a save to the database first before getting the confirmation code, otherwise the system would register the UserId as 0 but when the user clicks on the confirmation email, his UserId would be something else other than 0 and the validation will always fail. Hopefully that helps someone else. Advice FIXING NUGET ISSUE – UNABLE TO LOAD THE SERVICE INDEX FOR SOURCE avinashsingAugust 1, 2017 It turns out when working on a .NET Core project, Nuget has problems restoring/downloading packages. On other projects using an older version of the .net framework, this doesn’t seem to happen. This happens in the office at work because we use a proxy. So to get around the problem, we need to configure Nuget to go through the proxy. Edit the NuGet.config file located at C:\Users\\AppData\Roaming\NuGet. If you’re browsing to that folder, remember to turn on “Show hidden files, folders, and drives”. 1 2 3 4 5 6 7 <configuration> <config> <add key="http_proxy" value="http://www.proxy.domain:port" /> <add key="http_proxy.user" value="thedomain\userName" /> <add key="http_proxy.password" value="base64encodedpassword" /> </config> </configuration> If your work policy enforces password reset at a regular interval, it’s better to omit the password key from the config and Nuget will still be able to use your default credentials. So you end up with this instead: 1 2 3 4 5 6 <configuration> <config> <add key="http_proxy" value="http://www.proxy.domain:port" /> <add key="http_proxy.user" value="thedomain\userName" /> </config> </configuration> Now that this is sorted, let me get back to adding more nuget packages to my project. Programming SETTING UP REVERSE PROXY USING ARR IN IIS avinashsingJuly 24, 2017 When I initially set up Team City at work, I’ve used localhost on Port 85 as the default Port 80 was already assigned to a default Website in IIS. However not many people have access to the server where the site was running and they couldn’t change build configuration and check detailed error logs. So I wanted to use Application Request Routing (ARR) to forward incoming requests from teamcity.app.branch.local to localhost:85 where Team City was set up to listen to. I found an MSDN article with very detailed instructions and I followed the steps carefully. It was well explained across 3 webpages (so kudos to the author) and dealt with things like the initial forwarding using inbound/outbound rules, fixing the problem with http compression and dealing with rewriting anchor tags and form action links. It all worked fine and I was really happy until I saw a message in Team City telling me there was a problem with Web Sockets. After some Googling, it turns out there’s no easy way around it, so I decided to revert the changes I made for ARR in IIS and just updated the Server URL in Team City (Administration -> Server Administration -> Global Settings) and was able to access the UI through teamcity.app.branch.local:85. The way ARR works as I understand it is that it forwards requests from a domain to another web app. Since teamcity.app.branch.local DNS was pointing to a particular server and running on Port 80, which in my case was the default website in IIS 8.5, I believe you could only add the following rewrite rules in Web.config without having to go through all the steps in the link above: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:85/{R:1}" /> <serverVariables> <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> <set name="HTTP_ACCEPT_ENCODING" value="" /> </serverVariables> </rule> </rules> <outboundRules> <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1"> <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:85/(.*)" /> <action type="Rewrite" value="http{R:1}://teamcity.app.branch.local/{R:2}" /> </rule> <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" /> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" /> </rule> <rule name="AnchorTagRule" preCondition="ResponseIsHtml1"> <match pattern="href=(.*?)http://localhost:85/(.*?)\s" /> <action type="Rewrite" value="href={R:1}http://teamcity.app.branch.local/{R:2}" /> </rule> <rule name="FormActionRule"> <match pattern="action=(.*?)http://localhost:85/(.*?)\\" /> <action type="Rewrite" value="action={R:1}http://teamcity.app.branch.local/{R:2}\" /> </rule> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" /> </preCondition> <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" /> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer> The above will forward request from teamcity.app.branch.local to localhost:85 so change the URLs according to your requirements. It’s as simple as this. The steps in the MSDN article will create those inbound/outbound rules in Web.config but I don’t think you need to go through all those steps, just make sure you’ve got ARR and URL Rewrite installed on your server, that’s it. Programming I AM A PEBBLE! avinashsingApril 11, 2015 My life is that of a pebble – The pebble dances to the tune of the waves. It cannot do otherwise. With every movement, it rubs against hard surfaces and loses part of itself. As the river continues to flow, the pebble becomes smooth. Throw it at someone and it will hurt but hold it delicately in your hands and you can feel its gentleness. Nature wants the pebble to stay immersed in the river so it doesn’t harm and looks beautiful from the outside. And that’s where I belong, out of reach. ~AS Personal C# INTERVIEW QUESTIONS BASED ON ACTUAL EXPERIENCES WHEN I WAS LOOKING FOR A JOB avinashsingFebruary 16, 2015 This is the process I went through whilst looking for a new Senior Developer position in London. I hope this helps other job seekers better prepare themselves. COMPANY A 1st Stage – Telephone Interview (30 mins) General chat with the director about what the company does and where it’s headed. Looking to see I thought I would be a good fit. 2nd Stage – Practical Test (3-4hrs) Create a basic web application using web forms, linq to sql and jquery ui. This assignment was sent by email and could be completed at home, so no time limit really. The project requirements was to create a page with a text field (Name of company) and 3 dropdowns (Speciality, Category and Location). When users type a name in the textbox, jquery autocomplete should be leveraged to suggest names of companies already in the database. Results should be displayed filtered by all 4 fields if specified. A sample data in spreadsheet format was sent but it was not normalised and a either a backup of the database or script to recreate it was asked. Here the employer is looking for good coding skills and a layered project solution (Web, Data and Business layers). Third Stage – Face to Face Interview (1hr30) This was done at their office in Chiswick. I met the IT Director who asked a couple of questions about the things I’ve put on my CV and what I thought about the project I had to do, then was questioned by a Senior Dev about these: 1. Whether I’ve created a jQuery plugin before (and how) 2. My experience with Unit Testing 3. A couple of other technical questions which didn’t require much thought Then I met the CTO again for a brief talk and the most important question there was what I would bring to the company. Result I didn’t get the job. They said I had strong technical skills but didn’t show much interest in the company. COMPANY B 1st Stage – Technical Test (1hr23) I was asked to do an IKM (International Knowledge Measurement) .NET WEB DEV test. To be considered for the role, you need to get 90% and above. IKM tests are multiple choice questions with 1 or more correct answers. You cannot skip a question and come back to it and for each wrong answer, you are penalised more than if you don’t answer it (this is to prevent guesses I think). There were 33 questions to be answered in 83 minutes and before the test, it mentioned that on average people take 39 minutes to complete this. Some of the questions which were asked are: 1. Which attribute flag to use for bitwise operator (i didn’t know, never used it in my life!) 2. try catch block code segments, which were correct 3. MVC routing 4. Code segments containing interfaces and classes, find out the output 5. Custom exceptions in .net Although I scored 86%, the company still wanted to see me. 2nd Stage – Technical Interview with Technical Architect and Product Manager (1hr30) I was asked 2 main technical questions – my understanding of SOLID principles and how I would go about designing a system. The requirements were that a short blog post (140 characters) will be submitted by multiple registered users of the company and this had to be displayed back to on the front end bearing in mind this is a high traffic website. What was important here is to mention that the first time the page is requested, it will be cached until another post is submitted by someone else. Then on the front end, to use something like SignalR or another polling method to update the post widget with the latest items. Result I didn’t get this one either because they didn’t think I would be a good fit for their company and I didn’t know much about their products and services. They said I had strong technical skills though. COMPANY C 1st Stage – Telephone Interview (30 mins) Basic introduction to the company and lots of technical questions as follows: 1. Choose two programming languages and talk about the differences – they wanted a client side scripting language like JavaScript and server side language like C# 2. What does .net code get compile to and what is used at runtime (code gets compiled to MSIL and at runtime it’s machine language) 3. What is a transaction in database terms? (going from one consistent state to another) 4. Properties of database transactions (ACID properties) 2nd Stage – Face to Face Technical Interview (1hr) This was meant to be 1hr but lasted for 3hrs!!! There was a 15 mins presentation of the company, what it does etc. Then oral questions: 1. Explain the Garbage Collector (you should talk about Generation 0/1/2 and that it is non-deterministic) 2. What is IDisposable and what pattern uses this (when using the “using” keyword) 3. What is multi-threading 4. How to avoid a deadlock 5. Difference between the out and ref parameters when passing a value/reference type Then technical exercises: 1. A program was written on paper that does string manipulation (tokenisation) and you had to tell the output. It was using indexOf and SubString but since there was a do-while loop, you had to calculate values of all local variables on paper. It turned out the interviewer had an initial string of “This is Value1” and you were looking for the word “is” and you would miss out that the first occurrence of “is” would be in “This”. 2. Following on the previous exercise, I was asked how I was going to rewrite the program by using recursive calls to the method and I was only allowed to modify certain sections of the code, not everything. 3. On paper, a set of tables was shown and I was asked how to make it better (had to normalise them) 4. A database schema was shown and i was asked to write SQL queries for inner joins, left joins, group by on paper. 5. There was also a Psychometric test (aptitude) where I was given increasing levels of difficulty to solving a certain mechanism they use for their product. This was followed by a chat with one of the managers, whereby he wanted me to talk more about the technical stuff I’ve done in my previous jobs (technology used, why and how) and then questions about why I wanted to join their company. Result This was one of the hardest interviews I’ve had and I thought it was going to be just 1hr, not 3hrs!!! It was absolute torture and I wanted to just leave in the middle of the interview but I gave it my best shot anyway. I know I didn’t do well but if the interview was that hard, I don’t think I want to work there and have my stress levels jump through the roof everyday. I also have a life outside work and I’d rather take a pay cut than become a zombie. I was later informed I didn’t get the job. Good luck if you’re seeking a new opportunity! UPDATE I had two other interviews after those and got job offers for both. I took up one of them and I’m very happy with the salary and the job I’m doing 🙂 Personal THAT’S IT – I’VE GONE VEGETARIAN NOW! avinashsingDecember 27, 2014 I woke up yesterday (26 December 2014) and I felt it was high time I stopped eating meat. I’ve wanted to do this since a long time but there were 2 reasons which prevented me from doing it. First, it was more convenient – if I’m hungry, I can just make a chicken burger and have that with bread and I’m all sorted. If I’m out and about, I can always get a Zinger burger at KFC. If I wanted to cook a nice meal, you can’t go wrong with chicken which is what I’m used to anyway. Secondly, I want to put on some more muscle mass and meat is an easy source of protein which is crucial in bodybuilding. I was scared I wouldn’t be able to bulk up if I stop eating meat but the truth is I wasn’t gaining lean muscle mass anyway because I don’t train as hard as I need to (I hardly exercise btw :D). I guess when I woke up, I thought enough was enough and I could go on procrastinating about this and never get it done. It is boxing day and the Christmas and 2015 New Year celebrations are still intense and in my mind, I’m thinking maybe I should wait till January and have this as a New Year Resolution instead. However I know deep down it’s an excuse and if I put it off for another day, then I’ll never be able to do it. I just bought 36 chicken burgers, chicken sausages and still have some chicken breasts in the fridge and tuna cans in the cupboard and I’m thinking I should probably get through these first otherwise it’s going to waste. But then I know myself too well now and decided to just go with the flow, so let’s see what happens next. Personal USING JABBR CHAT WITH MYSQL DATABASE avinashsingSeptember 13, 2014 I wanted to integrate a .net chat application for my Mauritius Chat project and came across Jabbr which has most if not all of the features I wanted. However it works with SQL Server Express by default but I wanted to use MySql instead. The reason for that is that I’ve got a dedicated where I’m running MySql because it’s free compared to SQL Server 2008/2012 and I didn’t want another service for SQL Server Express to run just for one application – I have to use the limited RAM carefully. So this post is all about how I finally managed to do that. First thing first – you have to download the source code from Jabbr repository on Github, There’s a Download Zip button on the left hand side. Next you’ll need to download the MySql .Net Connector 6.9.3 and install it. If you have previous versions of the MySql .Net connector, like I did, you’ll have to uninstall that first. These are the changes you’ll need in your web.config file: Connection String 1 2 3 <connectionStrings> <add name="Jabbr" providerName="MySql.Data.MySqlClient" connectionString="Database=Jabbr;Port=3203;Data Source=localhost;User Id=YourUserName;Password=YourPassword;"/> </connectionStrings> Entity Framework 1 2 3 4 5 6 7 <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> You will also need to reference the MySql.Data.Entity.EF6.dll in your project. You will find that where the MySql .Net Connector has been installed and you will have to choose the assembly according to the .net version you’re using, in my case .net 4.5. PROBLEMS I ENCOUNTERED When you recompile the project, you’d think it will work but for me it didn’t because it kept complaining about this error: Schema specified is not valid. Errors: (15,12) : error 2019: Member Mapping specified is not valid. The type ‘Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]’ of member ‘When’ in type ‘JabbR.Models.Attachment’ is not compatible with ‘MySql.timestamp[Nullable=False,DefaultValue=,Precision=0]’ of member ‘When’ in type ‘CodeFirstDatabaseSchema.Attachment’. (40,12) : error 2019: Member Mapping specified is not valid. The type ‘Edm.DateTimeOffset[Nullable=True,DefaultValue=,Precision=]’ of member ‘RequestPasswordResetValidThrough’ in type ‘JabbR.Models.ChatUser’ is not compatible with ‘MySql.timestamp[Nullable=True,DefaultValue=,Precision=0]’ of member ‘RequestPasswordResetValidThrough’ in type ‘CodeFirstDatabaseSchema.ChatUser’. (66,12) : error 2019: Member Mapping specified is not valid. The type ‘Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]’ of member ‘When’ in type ‘JabbR.Models.ChatMessage’ is not compatible with ‘MySql.timestamp[Nullable=False,DefaultValue=,Precision=0]’ of member ‘When’ in type ‘CodeFirstDatabaseSchema.ChatMessage’. (95,12) : error 2019: Member Mapping specified is not valid. The type ‘Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]’ of member ‘LastActivity’ in type ‘JabbR.Models.ChatClient’ is not compatible with ‘MySql.timestamp[Nullable=False,DefaultValue=,Precision=0]’ of member ‘LastActivity’ in type ‘CodeFirstDatabaseSchema.ChatClient’. (96,12) : error 2019: Member Mapping specified is not valid. The type ‘Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]’ of member ‘LastClientActivity’ in type ‘JabbR.Models.ChatClient’ is not compatible with ‘MySql.timestamp[Nullable=False,DefaultValue=,Precision=0]’ of member ‘LastClientActivity’ in type ‘CodeFirstDatabaseSchema.ChatClient’. Basically in the Jabbr code, some of the properties (especially for DateTime) are marked as DateTimeOffset which is stores the date/time as an offset of UTC, rather than the server date/time. However the DateTimeOffset type was being mapped to datetime in MySql and Entity Framework realised it was not a proper mapping. I tried to check for solutions online but couldn’t find any and since this was not a big deal for me (storing the date/time as UTC), I ended up replacing the properties marked as DateTimeOffset as DateTime. When you do this, you also have to modify some parts of the code where it uses DateTimeOffset.UtcNow with just DateTime.Now. I’ve used replace/find and there are less than 5 occurrences if I remember correctly. Okay at this point, the application compiles but when browsing the site, the application tells me that there’s not database/matching tables yet so I would need to use the Package Manager Console and run the command Update-Database. When I did that, it failed at one specific migration. So I tried to see what was happening by issuing a Update-Database -verbose command and I noticed MySql was complaining about a variable was not declared. That specific migration to was to rename a column from Proivder to Provider, something like that. So I thought I could just exclude that particular migration and do the rename manually but the migration still failed at another point. I therefore decided to delete the whole Migrations folder so that the schema is created from what’s in the code without having to run it any migrations (this is only good if you’re just setting up the website and you don’t have any data yet). I had to comment out the Migration calls in Startup.cs and run the following command in Package Manager Console: Update-Database I also issued Enable-Migrations so that if I make any changes, then these are tracked. In the end, I was able to run Jabbr chat with a MySql database. Now I need to create a custom membership provider so that logins details are checked against the Users table which resides in another project, so I might need to create an API for that. Programming SETTING GIT ON EXTERNAL HARD DRIVE OR USB FLASH IN WINDOWS avinashsingSeptember 6, 2014 At home, I usually work on personal projects and I wanted an easy way to back up my data and put my code under source control. I decided to go with Git for this and use my 250Gb external hard drive for the remote repository (you can use a USB flash drive as well if you want). So the first thing to do is download Git Extensions and install the software. I installed mine on the C drive in Windows 7 using the default settings. The next thing was to let Git know where my local repo for my project is. So I browsed to the folder where my project was located (the directory which contains all the C# source files from Visual Studio) and right click. This gives you the option for “Git Init here” which when chosen creates .git directory marking this folder as your local working directory. Open your Git Extensions program and do a commit to get your codes under source control (locally). Once that is done, you’ll need to create a remote repository on your external hard drive or USB stick. Just create a folder there eg H:\Git\MyProject and when you right click in the folder, you will be able to click on the “Git Bash” option which will open a command line tool. Type the following command in there: git init –bare This will create a bare repository in the current directory. Go back to Git Extensions and do a push now. It will ask you where to push to and you just need to enter the location of the remote repo you’ve just created and voila, all done. NOTES Although I was able to set up the local repo using Git Extensions, I was not able to do the same for the remote repo, hence I’ve used the command line in Git Bash. The local repo contains all your source code (it’s a working copy after all) but the remote one has only git files. My local repo was 8Mb while the remote one was only 0.5Mb so I was worried it was not a proper backup of my data. However that was not the case – I tried to get another working copy from the remote repo just to make sure that if my computer crashed, I would still be able to get all my source codes from the external drive and that worked perfectly. Actually it’s better because the size of the remote repo backup was way less than the working copy. Programming TERE DARD SE DIL AABAAD RAHA ENGLISH TRANSLATION avinashsingJune 26, 2014 This is a lovely song from the movie Deewana starring Divya Bharti, Shah Rukh Khan and Rishi Kapoor. LYRICS Tere dard se dil aabaad raha From your pain, my heart was prosperous/affluent Kuch bhool gaye, Kuch yaad raha I forgot some, remembered some Naseeba bhi kya rang laya Faith/luck too, has brought its different colours Kaha laake hum ko milaya Where has it brought us to meet Apni wafaa ke gul khil na paaye The flowers of our trust did not flourish Milke bhi tujhse hum mil na paye Even after meeting you, we didn’t really meet Darde dil hum kaise sahen How can I stand this heartache Door bhi hum kaise rahen How can I stay far away too Tera gham tere jaane ke baad raha Your sorrow was there after you left Kuch bhool gaye, kuch yaad raha I forgot some, remembered some Jaane wafa tujhko kya de My life, my faith, what can I give you Dil Keh raha hai dua de Heart tells me to give blessings Armaan bujhe hain sapne duaan sa Desires are extinguished, dreams are broken Mar mar ke hum to zinda yaha hai I am still here alive after dying over and over Bekhudi main hum ko gaye I had lost all conscious/senses Phir juda tujhse ho gaye Then I was separated from you Chahat ka jahaan barbaad raha The universe of love was destroyed Kuch bhool gaye, kuch yaad raha I forgot some, remembered some Personal CONVERSATION OF MY MIND TO MY HEART avinashsingMay 28, 2014 Mind : I know you’re hurting badly but that’s affecting me a lot now and I cannot function properly Heart : I’m sorry but I can’t help myself Mind : For our sake, forget her and move on Heart : I’ve tried to but it’s out of my control Mind : Just do what it takes to stop this madness Heart : Alright, I’ll have to stop beating then Mind : No, you know I cannot exist without you Heart : …and I cannot live without her Mind : We’re both screwed then! . . . Soul : Don’t worry guys, when the two of you are long gone, I’ll use the memories of the Mind to cherish the love of the Heart and immortalise your existence Personal Previous Articles RECENT POSTS * Using .NET Core Identity 2 with MySql and a Custom User Table set to Auto Increment User Id instead of Guid * Fixing Nuget Issue – Unable to load the service index for source * Setting up reverse proxy using ARR in IIS * I am a pebble! * C# Interview Questions Based on Actual Experiences When I Was Looking for a Job PROJECTS * Clever Dodo * Oral Driving Test Mauritius * Spiritual Blog CATEGORIES * Advice * Gadgets * Health * Miscellaneous * Personal * Programming * Recipe * SEO * Spirituality ARCHIVES * December 2018 * August 2017 * July 2017 * April 2015 * February 2015 * December 2014 * September 2014 * June 2014 * May 2014 * April 2014 * March 2014 * December 2013 * May 2013 * April 2013 * March 2013 * February 2013 * January 2013 * November 2012 * October 2012 * September 2012 * August 2012 * May 2012 * April 2012 * March 2012 * February 2012 * September 2011 * August 2011 * July 2011 * June 2011 * May 2011 * April 2011 * March 2011 * February 2011 * January 2011 * December 2010 * November 2010 * October 2010 * September 2010 * August 2010 * July 2010 * June 2010 * May 2010 * April 2010 * March 2010 * February 2010 * January 2010 * December 2009 * November 2009 * October 2009 * September 2009 * August 2009 * July 2009 * June 2009 * March 2009 * February 2009 * January 2009 * December 2008 * September 2008 * August 2008 * July 2008 * June 2008 * May 2008 * April 2008 * March 2008 * February 2008 * January 2008 * December 2007 * August 2007 * June 2007 * May 2007 * April 2007 * March 2007 * February 2007 * January 2007 * December 2006 * November 2006 * October 2006 * September 2006 * August 2006 * July 2006 * June 2006 © 2023 Av. All rights reserved. This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish.Accept Read More Privacy & Cookies Policy