text:
Lachryma Christi apologizes for the delay, but here is the review to this nice gig.
So for those who don't know, all the bands play Black Metal, some with some death metalish influences, but basically all of them play Black Metal.
First band, Vatigal Surrd. It was the second time Lachryma Christi saw them live. This one was better, apart from the fire (or smoke, not sure) alarm ringing during all their performance. And why? Because they had loads of incense and even a torch (or something similar to one) on. So the venue was full of smoke since they started playing and the alarm wouldn't stop ringing. Eventually, just before the last song finished, the alarm stopped, and after their performance the room was evacuated for a few minutes so staff could get rid of the smoke. It smelled good though. Now about their performance. It was better than when they played with Shining. They sounded more inspired and comfortable. The set was short, but was good. This time the members had corpse paint and blood on them, which made it look darker and more aggressive and also matched more all the atmosphere they had created. Was a good show, too bad it was so short. Just a bit too loud. Not noisy, only loud. Hopefully there will be more chances of seeing them soon.
Premature Birth was also a good surprise. They also had played with Shining, and on that day the impression they caused on LC wasn't the best. This time it was actually OK. They seemed more united, more prepared, not confusing at all. Voice was also more coordinated with the rest, but again, was a bit too loud. If you were outside the room you could understand all the details and guitar riffs and keyboard melodies, but once inside the room, it was so loud, hard to get some details that sometimes make all the difference.
Vehement, first time Lachryma Christi saw them. The expectations were high, and the band corresponded to them. Nice gig, very professional, very together, also interactive, songs choice was good as well, not loud, not noisy, just actually very good. Very cohesive, knowing what they were doing. Public in general was also pleased. Definitely a band to see again in the future.
Headliners Otargos. It was also the first the time LC was seeing them. They sound as if they have been around forever. Very professional, very good, very sober, serious, full of atmosphere. This is a band you can tell that have a lot of experience, that know how to do their stuff. They are not boring, not annoying, but really pleasant. Sound was good, Black Heart doesn't have the best acoustics, but surprisingly it worked for Otargos.
So in general it was a good night. Good bands, good fun, good music.
Lachryma Christi has no pics for this. If you have some, and if you wish to share them, you can always leave a comment with a link, or if you want to see them posted together with this article (they will be credited of course), you can e-mail email@example.com
Wednesday, March 19, 2014
Review: Gig OTARGOS + VEHEMENT + PREMATURE BIRTH + VATIGAL SURRD 21st February @ The Black Heart, London
4 comments:
Subscribe to: Post Comments (Atom)


text:
Here is why Atanu Dey thinks that the name of Indian Airlines was changed to Indian:
First, it was not as if the name "Indian Airlines" was biting someone in the butt. It was not as if a person was not very sure what that name meant. It was not that someone else claimed that domain name and the airline was forced to change its moniker. No sir, there was no problem with that name. But then, you may say that perhaps the name was getting old and somewhat generic. It could happen, you know. You say "Indian Airlines" and someone thinks you are talking of Indian air carriers in general and not about the specific carrier. I have found that about "American Airlines." You have to be careful to distinguish between the specific and the general. So alright, "Indian Airlines" could have been changed to something else.This man is funny. If the government servants stop stealing, how will their kids survive.
But removing the "airlines" and just retaining "Indian" is as astoundingly stupid as one can ever get. So now when you say "Indian" you don't know whether you are talking about food, clothing, land, thought, behavior, or . . . an airline! Making a bad thing worse is not an improvement.
After all, you are well read Atanu, look at your biography (besides, you are also working on putting together a new and improved bio), what have they got?
And I agree with every word he says here. I see those young kids begging on the red lights, because there is no school they can go to and I just imagine that a lot more would be joining them soon, becuase the government of our great nation, wants them to.

subset: commoncrawl


text:
Pilot Mound — Members of the Bakken Pipeline Resistance Coalition, private landowners, American Indians and supporters gathered Saturday near Pilot Mound for their second-annual river flotilla in opposition of the Dakota Access/Bakken Pipeline.
An estimated one million gallons of crude oil go through the pipeline daily, right under the Des Moines River. Flotilla participants floated over the pipeline on their route, and the construction area of the pipelines location was clear.
"The smallest of leaks would leave Pilot Mound, Boone, Madrid and other surrounding towns without clean drinking water," said Mark Edwards, one of the organizers of Saturday's event.
The participants shared deep concerns about the pipeline, given recent findings that Energy Transfer Partners, the company running the pipeline, is not complying with environmental standards and there are several reported leaks.
"And that is just (several leaks) so far," Edwards said of the pipeline, which spans 18 Iowa counties, including across parts of Boone and Story counties.
Opponents have been protesting the potential environmental impact of the pipeline, and the use of eminent domain to acquire land for the project.
What initially was planned as another protest Saturday turned into a celebration of a court decision Thursday by federal Judge James E. Boasberg in Washington, D.C., that rules Dakota Access failed to consider the overall risks to the Standing Rock Sioux Tribe, which has been holding large demonstrations in North Dakota since last year.
In a 91-page memorandum opinion, Boasberg suggests stripping the pipeline of its permits until it comply with environmental regulations, "(The U.S. Army Corps of Engineers,) failed to adequately consider the impacts of an oil spill on Standing Rock's fishing and hunting rights and on environmental justice, and in February 2017, it did not sufficiently weigh the degree to which the project's effects are likely to be highly controversial in light of critiques of its scientific methods and data."
The state of Iowa granted permits to the pipeline only under the agreement the pipeline had a federal permit. Now that the federal permits are halted, Iowa faces some legal questions regarding the pipeline's future.
Participants at Saturday's flotilla chanted, "No permit, no pipeline."
Carolyn Raffensperger, an environmental lawyer and event organizer, gave the analogy of, "If a 16-year-old got their license taken away for reckless driving, you wouldn't just let them keep driving because they had already been doing it for two months."
Members of the Bakken Pipeline Resistance Coalition said they plan to pressure the state of Iowa heavily now to keep its word and revoke permits given Energy Transfer Partners will no longer have federal permits.
The three-hour flotilla started along the Des Moines River near Pilot Mound and ended at a ramp near Fraser.
Around 75 people came for this float, with more waiting at the community center for a gathering afterward or standing on the bridges above the river cheering the floaters on.


text:
"HASTA LUEGO" – Fr. Benabarre to stay in Spain for some months
SBLAA - News & Events
Fr. Benabarre to stay in Spain for some months
Rev. Fr. Benigno Benabarre, OSB, Assistant Moderator of the San Beda College Alumni Association, will leave for Madrid, Spain on June 8, 2011, and stay in said country for several months.
The trip to his native land, being born in Aler, Huesca, Spain, will have two purposes: a) to visit his 100-year old sister and 87-year old brother, who like him, are still relatively healthy in mind and body; and b) to conduct a research in the lives of the first four abbots superiors of the Abbey of Our Lady of Montserrat, Manila, and of the first four Rector of the College.
Rt. Rev. Fr. Tarcisio Ma. H. Narciso, OSB Abbot-Chancellor, has given permission to Fr. Benigno to take a "sabbatical leave" (with work), a much needed break for someone who has recently turned 96 years old.
It will be recalled that Fr. Benigno first arrived in the Philippines in 1950 as a Benedictine, and was part of the local Benedictine Community for 17 years. Very sickly, he left Manila for Spain in 1967. He returned to the Philippines in 2004, and reincorporated himself for good to the Benedictine Abbey here in Manila.
Fr. Benigno will surely be missed by the Bedan Community, especially by the countless number of alumni whose lives he has continuously touched even in his advanced age. And so to Fr. Benigno, we say – "Hasta Luego!"


text:
"Patriotic Arab Americans Making
a Difference"
Learn more about APAAM's Eric Rahman,
Army Reserves
- Cousin of Abdul Rahman the creator of MRE's - Full Story below
Lisa Burgess / S&S
Cousins Butch, left, and Eric Rahman sample the newest MRE
menus foods at the Pentagon. The pair, who grew up together in
Natick, Mass., were informal taste testers for MRE prototypes
developed by Butch's father, Abdul Rahman.
glorious food.
troops are digging into rations their historic brothers in arms could
only fantasize about.
The credit
for delicacies such as fajitas and pasta making their way into U.S.
military rations is largely owed to one man, combat feeding experts say:
Abdul Rahman.
For more
than 18 years, Rahman worked at the Army's Soldier Research Development
and Engineering Center to develop techniques in food preservation and
efforts, which resulted in 17 patents for the U.S. government, helped
the military transition from the Vietnam- era "C" rations in tin cans to
today's "Meals, Ready to Eat," or MREs.
Rahman's nephew, Army Capt. Eric Rahman, 34, a signal officer and
veteran of both Iraq and Afghanistan, said that not all his uncle's
prototypes were home runs.
grew up next door to his uncle in Natick, Mass., where the professor
worked for the Defense Department's Combat Feeding Program.
"I was
about 5 at the time, and 5-year-olds will eat anything," Rahman said
during a recent Army demonstration at the Pentagon on the history of
combat feeding. "I loved playing guinea pig."
Even so,
"those first couple of freeze-dried ice cream bars were really rough,"
Rahman said. "It was like eating crunchy sponges."
The notion
of ice cream in a military ration - forget the concept of freeze-drying
- would make a Civil War soldier's head spin.
The Union
Army soldier's field ration consisted of a whopping total of three
elements: salt pork, which is similar to bacon; rock-hard bread made of
wheat flour, water, and a little salt, also known as "hardtack"; and
gritty coffee - with a little sugar, if he was lucky.
limited menu was served up three times a day, day after day, according
to Greg Hampton, a professor at the Army Management Staff College at
Fort Belvoir, Md.
Just as
troops do today with their MREs, Civil War troops tried to get as
creative as possible with the limited materials at hand, said Hampton,
who has been a Civil War re-enactor for 15 years.
example, he said, they would mash some hardtack with fat from the pork
into a paste called "shulse," wrap it around their rifle ramrods or
bayonets, and roast the mess over a campfire "to make sort of a
baguette," he said.
options were limited, particularly if the designated cook in the group
was too lazy to fry the salt pork, and decided to throw everyone's
rations into a communal pot, Hampton said.
Most of
salt pork is pure fat, which turns into a grey, smelly, gelatinous mess
when it's boiled - in short, almost inedible - and a major morale killer
when plopped on a tin plate three times a day.
would get so tired of eating boiled meat, they'd literally eat it raw,"
Hampton said.
Every war
has its version of salt pork and hardtack: foods that show up so often,
troops vow they will never eat them again.
to retired Army Staff Sgt. William Kelley, for World War II veterans,
that foodstuff is Spam.
86, first saw combat during World War II with the 103rd Infantry
Division in the Vosges Mountains of France, and later fought in Korea.
During the
harsh winter of 1944, Kelley and his buddies had more than their share
of Spam, he said.
"We were fed it
so often, everyone just got tired of it," he said. "It was all right for
a meal or two, but sometimes it was all we could get for weeks."
Burgess / S&S
Greg Hampton, a professor at the Army Management Staff
College at Fort Belvoir, Va., and a Civil War re-enactor, offers
a typical day's field diet for a Union Army soldier - coffee,
salt pork and hardtack - during a recent Army-sponsored
demonstration on combat feeding at the Pentagon.
Lisa Burgess / S&S
Retired Army Staff Sgt. William Kelley, 86, a veteran of
World War II and the Korean War, said MREs "are a big
improvement" over the combat rations he ate during his 20-year
military service.
Lisa Burgess / S&S
Cousins Butch, left, and Eric Rahman sample the newest MRE
menus foods at the Pentagon. The pair, who grew up together in
Natick, Mass., were informal taste testers for MRE prototypes
developed by Butch's father, Abdul Rahman.
Abdul Rahman Credited with creating MRE's
We will never forget September 11th, 2001
(click to read message)
- Over 3,500 Arab-Americans serve in the Armed Forces
- Over 5,300 Arab/Muslim Americans served in the Civil War
- Over 15,000 Arab Americans served in WWI
- Over 15,000 Arab Americans served in WWII
- Over 6,000 Muslims currently serve in the Armed Forces
- Over 7% of the Armed Forces are foreign-born
We served in every War & Conflict since the Revolutionary War to
Revolutionary War
- Civil
- WWI, WWII, Korea, Vietnam
- Beirut Lebanon
- Operation Desert Storm/Shield 1991
- Operations in Kosovo
- Operation Enduring Freedom
- Operation Iraqi Freedom
- The Global War on Terrorism - GWOT
- APAAM members have participated in numerous operations
directly related to the defense of our
national security
Copyright © 2004. APAAM. All
rights reserved.


text:
Detecting Faces with Dlib from F#. IFSharp Notebook
The Choices
I have experimented with OpenCV and Dlib face detection in my computer vision pipeline. Both work well, but the Dlib one worked better: it is more sensitive with (in my case) almost no false positives right out of the box!
Dlib uses several HOG filters that account for profile as well as frontal views. HOG detectors train quickly and are very effective. OpenCV uses Haar Cascades and doesn't have the same versatility out of the box: you need separate data files for profiles and frontal views. In the case of OpenCV, you also need to experiment with the parameters quite a bit to get it where you want it to be.
Both libraries allow for custom trained detectors, but in my case it did not come to that: Dlib detector was sufficient.
Using Dlib in F# Code
Dlib is a C++ library, also available for Python. No love for .NET.
The step-by-step of calling dlib face detector from F# code is in the IFSharp Notebook, hosted on my GitHub. Here .NET, EmguCV (OpenCV), and Dlib all work happily together.
(Took Azure Notebooks for a spin, works pretty well).
Zooming Through Euler Path: Supercharging with GPU
So, continuing where we left off:
- Walking the Euler Path: Intro
- Visualizing Graphs
- Walking the Euler Path: GPU for the Road
- Walking the Euler Path: PIN Cracking and DNA Sequencing
For the Win
And finally I ran the GPU-enabled algorithm for finding the Euler path.
let sw = Stopwatch() let N = 1024 * 1024 let k = 7 let avgedges k = [1..k] |> List.map float |> List.average let gr = StrGraph.GenerateEulerGraph(N * 10, k) printfn "Generated euler graph in %A, edges: %s" sw.Elapsed (String.Format("{0:N0}", gr.NumEdges)) let eulerCycle = findEulerTimed gr // GPU-based algorithm sw.Restart() let eulerVert = gr.FindEulerCycle() // Hierholzer algorithm sw.Stop() let cpu = float sw.ElapsedMilliseconds printfn "CPU: Euler cycle generated in %A" sw.Elapsed
And the results:
Generating euler graph: vertices = 10,485,760; avg out/vertex: 4 Generated euler graph in 00:00:19.7520656, edges: 41,944,529 Euler graph: vertices - 10,485,760.00, edges - 41,944,529.00 1. Predecessors computed in 00:00:03.2146705 2. Partitioned linear graph in 00:00:06.4475982 Partitions of LG: 6 3. Circuit graph generated in 00:00:31.4655218 4. Swips implemented in 00:00:00.2189634 GPU: Euler cycle generated in 00:00:41.3474044 CPU: Euler cycle generated in 00:01:02.9022833
And I was like: WOW! Finally! Victory is mine! This is awesome! I'm awesome, etc. Victory dance, expensive cognac.
Then, after the euphoria subsided a little, I decided to make the mandatory chart:
Well, this was sobering!
While the CPU series line displays expected behavior, something is definitely not right with the GPU series: there is obviously some variable at work that I am not taking into account. So, from the beginning.
The Algorithm
I owe the algorithm to this master thesis, which actually implements the algorithm proposed by B. Awerbuch, A. Israeli and Y. Shiloach, "Finding euler circuits in logarithmic parallel time," in Proceedings of the Sixteenth Annual ACM Symposium on Theory of Computing, 1984, pp. 249-257.
The algorithm as I see it may be split into 4 stages (even 3, but 4 is slightly more convenient implementation-wise). Let's illustrate.
Start with an Euler graph like the one below. It has 15 vertices with an average of 3 edges/vertex in one direction (maxOutOrInEdges = k, we have 44 edges in this case):
let N = 15 let k = 5 let gr = StrGraph.GenerateEulerGraph(N, k) gr.Visualize(edges=true)
1. We walk it as we like, computing edge predecessors. For two edges is a predecessor of iff , i.e. One edge begins where its predecessor ends. In our representation it's easy to construct the array of predecessors:
let predecessors (gr : DirectedGraph<'a>) = let rowIndex = arrayCopy gr.RowIndex let ends = gr.ColIndex let predecessors = Array.create gr.NumEdges -1 [|0..ends.Length - 1|] |> Array.iter (fun i -> predecessors.[rowIndex.[ends.[i]]] <- i rowIndex.[ends.[i]] <- rowIndex.[ends.[i]] + 1 ) predecessors
2. At this point, if we are lucky, we have the representation of an Euler cycle as edges of the graph. We just need to walk the array we have "backwards", seeding the final list of edges with edge 0, constructing the list recursively like so:
predecessors.[List.head result] :: result. Alternatively, we may generate a graph out of the result and reverse it. (directions of the arrows need to be reversed since this is a predecessor graph. Euler cycles of the graph, where all directions are reversed are the same as those of the original one, reversed.)
In case we aren't lucky, we consider our predecessor array to be a graph, where each edge of the original graph becomes a vertex and identify partitions of the graph:
This is the weak point of the algorithm. Partitioning a graph is, in general, a hard problem (NP-complete, to be precise), however, in this case, due to a very simple structure of the predecessor graph, the complexity is linear in the number of edges of the original graph: O(|E|).
let partitionLinear (end' : int [])= let allVertices = HashSet<int>(end') let colors = Array.create end'.Length -1 let mutable color = 0 while allVertices.Count > 0 do let mutable v = allVertices.First() while colors.[v] < 0 do allVertices.Remove v |> ignore colors.[v] <- color v <- end'.[v] color <- color + 1 colors, color
So, now the goal is to join all the circles above into one circle, this is done in the crucial step 3
3. We further collapse the graph based on partitioning. Now, each partition becomes a vertex of the new graph. Edges of this new "circuit graph" are vertices of the original graph, such that each edge represents a vertex two partitions have in common.
This is the only part of the algorithm where the GPU is used and is very effective. Incidentally, I took the code almost verbatim from the original thesis, however, the author for some reason preferred not to implement this step on the GPU.
The idea is simple: we loop over the original graph vertex-by-vertex and try to figure out whether edges entering this vertex belong to different partitions (have different colors in the terminology of the code above). Each vertex is processed in a CUDA kernel:
let gcGraph, links, validity = generateCircuitGraph gr.RowIndex partition maxPartition gcGraph.Visualize()
4. This graph is greatly over-determined: we don't need ALL vertices that partitions have in common (represented by edges here). Also, it's important to note that this graph is not directed: if partition 0 has a vertex in common with partition 1, then this is the same vertex partition 1 has in common with partition 0. In our implementation this un-directionality is reflected by over-directionality: every edge is repeated as All we actually need is a spanning tree of this graph:
Alright, this is much better – ignore directions. The output of step 3 gives us vertices of the original graph where our partitions intersect. We now need to swap edges of our original predecessor array around these vertices, so that each partition is not closed off on itself, but merges with its neighbor (it's but a small correction to our original predecessor walk). We do this one-by-one, so partition 0 merges first with 1, then with 2. And 2 – with 3. And 1 with 4.
let fixedPredecessors = fixPredecessors gcGraph links edgePredecessors validity let finalGraph = StrGraph.FromVectorOfInts fixedPredecessors finalGraph.Reverse.Visualize()
And it's a beautiful circle, we are done!
Why not Break out That Cognac?
let N = 1024 * 1024 let i = 1 let gr = StrGraph.GenerateEulerGraphAlt(N * i, 3 * i * N) let eulerCycle = findEulerTimed gr
Euler graph: vertices - 1,048,575.00, edges - 3,145,727.00 1. Predecessors computed in 00:00:00.3479258 2. Partitioned linear graph in 00:02:48.3658898 Partitions of LG: 45514 # of partitions: 45514 (CPU generation of CG) 3. Circuit graph generated in 00:00:34.1632645 4. Swips implemented in 00:00:00.1707746 GPU: Euler cycle generated in 00:03:23.0505569
This is not very impressive. What's happening? Unfortunately graph structure holds the key together with the
HashSet implementation.
The deeper the graph the better it will fare in the new algorithm. The bottleneck is the partitioning stage. Even though its complexity is theoretically O(|E|), I am using a
HashSet to restart partitioning when needed and that presents a problem, as accessing it is not always O(1)!
The methods for Euler graph generation are implemented as
GenerateEulerGraph and
GenerateEulerGraphAlt. The first one "pleases the code", and generates graphs that are very deep even when the number of edges is large. Usually I get less than 10 partitions, which means that every time I generate predecessors, I'm pretty much guaranteed to be "almost there" as far as finding a cycle. The second method tends to generate very shallow graphs, as the example above shows: I got a fairly large number of partitions while the number of edges is only around 3 million. So while the rest of the algorithm performance is pretty descent, computing partitions just kills the whole thing.
Store the cognac for another time.
Visualizing Graphs
Generating and Visualizing Graphs
I can hardly overemphasize the importance of visusalizations. Many a bug had been immediately spotted just by looking at a visual of a complex data structure. I therefore decided to add visuals to the project as soon as the
DirectedGraph class was born.
Code & Prerequisits
Code is on GitHub.
- GraphViz: install and add the bin directory to the PATH
- EmguCV v3.1: install and add the bin directory to the PATH
This is a small auxiliary component I wrote to make all future visualizations possible. And here is a sidebar. I didn't want to write this component. I am not a fan of re-writing something that was written a hundred times before me, so the first thing I did was look for something similar I could use. Sure enough, I found a few things. How can I put it? Software engineering is great, but boy, do we tend to overengineer things! I know, I'm guilty of the same thing myself. All I wanted from the library was an ability to receive a text file written in GraphViz DSL, and get on the output a .png containing the picture of the graph. Just a very simple GraphViz driver, nothing more.
One library had me instantiate 3 (three!) classes, another developed a whole API of its own to build the GraphViz file… I ended up writing my own component, it has precisely 47 lines of code. the last 4 lines are aliasing a single function that does exactly what I wanted. It creates the png file and then immediately invokes the EmguCV image viewer to show it. After we're done, it cleans up after itself, deleting the temporary png file. Here it is.
Taking it for a Ride
Just to see this work…
Another digression. Love the new feature that generates all the "#r" instructions for F# scripts and sticks them into one file! Yes, this one! Right-click on "References" in an F# project:
And the generated scripts auto-update as you recompile with new references! A+ for the feature, thank you so much.
Comes with a small gotcha, though: sometimes it doesn't get the order of references quite right and then errors complaining of references not being loaded appear in the interactive. I spent quite a few painful hours wondering how is it that this reference was not loaded, when here it is! Then I realized: it was being loaded AFTER it was required by references coming after it).
#load "load-project-release.fsx" open DrawGraph createGraph "digraph{a->b; b->c; 2->1; d->b; b->b; a->d}" "dot.exe" None
Cool. Now I can take this and use my own function to generate a graph from a string adjacency list, visualize it, and even view some of its properties. Sort of make the graph "palpable":
let sparse = ["a -> b, c, d"; "b -> a, c"; "d -> e, f"; "e -> f"; "1 -> 2, 3"; "3 -> 4, 5"; "x -> y, z"; "2 -> 5"] let grs = StrGraph.FromStrings sparse grs.Visualize(clusters = true)
StrGraph.FromStrings does exactly what it says: it generates a graph from a sequence of strings, formatted like the
sparse list above.
Visualize function is a kitchen sink for all kinds of visuals, driven by its parameters. In the above example, it invokes graph partitioning to clearly mark connected components.
It is important to note, that this functionality was added to the visualizer not because I wanted to see connected components more clearly, but as a quick way to ensure that my partitioning implementation was indeed working correctly.
Generating Data and Looking at It
Now we have a class that builds graphs and even lets us look at them, so where do we get these graphs? The easiest thing (seemed at the time) was to create them.
Enter FsCheck. It's not the easiest library to use, there is a learning curve and getting used to things takes time, but it's very helpful. Their documentation is quite good too. The idea is to write a generator for your type and then use that generator to create as many samples as you like:
#load "load-project-release.fsx" open Graphs open FsCheck open System open DataGen let grGen = graphGen 3 50 let gr = grGen.Sample(15, 5).[2] gr.Visualize(into=3, out= 3)
This produces something like:
My function
graphGen len num generates a graph of text vertices where
len is the length of a vertex name and
num is the number of vertices. It returns an FsCheck generator that can then be sampled to get actual graphs. This was a one-off kind of experiment, so it's in a completely separate module:
//DataGen.fs module DataGen open FsCheck open System open Graphs let nucl = Gen.choose(int 'A', int 'Z') |> Gen.map char let genVertex len = Gen.arrayOfLength len nucl |> Gen.map (fun c -> String(c)) let vertices len number = Gen.arrayOfLength number (genVertex len) |> Gen.map Array.distinct let graphGen len number = let verts = vertices len number let rnd = Random(int DateTime.UtcNow.Ticks) let pickFrom = verts |> Gen.map (fun lst -> lst.[rnd.Next(lst.Length)]) let pickTo = Gen.sized (fun n -> Gen.listOfLength (if n = 0 then 1 else n) pickFrom) Gen.sized <| (fun n -> Gen.map2 (fun from to' -> from, (to' |> Seq.reduce (fun acc v -> acc + ", " + v))) pickFrom pickTo |> Gen.arrayOfLength (if n = 0 then 1 else n) |> Gen.map (Array.distinctBy fst) |> Gen.map (fun arr -> arr |> Array.map (fun (a, b) -> a + " -> " + b)) ) |> Gen.map StrGraph.FromStrings
This whole module cascades different FsCheck generators to create a random graph.
The simplest of them
nucl, generates a random character. (Its name comes from the fact that originally I wanted to limit the alphabet to just four nucleotide characters A, C, G, T). Then this generator is used by
genVertex to generate a random string vertex, and finally
vertices creates an array of distinct random vertices.
graphGen creates a sequence of strings that
FromStrings (above) understands. It first creates a string of "inbound" vertices and then adds an outbound vertex to each such string.
Sampling is a little tricky, for instance, the first parameter to the
Sample function, which, per documentation, controls sample size, in this case is responsible for complexity and connectivity of the resulting graphs.
On to Euler…
The script above also specifies a couple of optional parameters to the visualizer:
into will mark any vertex that has
into or more inbound connections in green. And
out will do the same for outbound connections and yellow. If the same vertex possesses both properties, it turns blue.
Inspired by all this success, I now want to write a function that would generate Eulerian graphs. The famous theorem states that being Eulerian (having an Euler cycle) for a directed graph is equivalent to being strongly connected and having in-degree of each vertex equal to its out-degree. Thus, the above properties of the visualizer are quite helpful in confirming that the brand new generator I have written for Eulerain graphs (
GenerateEulerGraph) is at the very least on track:
let gre = StrGraph.GenerateEulerGraph(10, 5) gre.Visualize(into=3, out=3)
Very encouraging! Whatever has at least 3 edges out, has at least 3 edges in. Not a definitive test, but the necessary condition of having only blue and transparent vertices in the case of an Eulerian graph is satisfied.
In the next post – more about Eulerian graphs, de Brujin sequences, building (and visualizing!) de Bruijn graphs, used for DNA sequence assembly.
Walking the Euler Path: Intro
Source Code
I'm thinking about a few posts in these series going very fast through the project. The source is on my GitHub, check out the tags since the master branch is still work in progress.
Experimenting with Graph Algorithms with F# and GPU
Graphs play their role in bioinformatics which is my favorite area of computer science and software engineering lately. This relationship was the biggest motivator behind this project.
I have been experimenting with a few graph algorithms trying to parallelize them. This is interesting because these algorithms usually resist parallelization since they are fast in their serial version running in O(|E|) or O(|E| + |V|) time (E – the set of edges, V – the set of vertices of the graph). And of course I use any excuse to further explore the F# language.
The object of this mini-study is a directed unweighted graph. The choice to represent it is simple: adjacency list or incidence matrix. Since I had CUDA in mind from the start, the latter was chosen, and since I had large graphs in mind, hundreds of millions, possibly billions of edges (limited only by the .NET object size: is it still a problem? I haven't checked, and by the size of my GPU memory), sparse matrix data structure was picked.
Sparse Matrix Implementation
I first wrote a very bare-bones sparse matrix class, just to get my feet wet. Of all possible representations for a sparse matrix, I chose CSR (or CSC which is the transposition of CSR), the idea is intuitive and works great for a directed graph incidence matrix.
Briefly (taking CSR – Compressed Sparse Row as an example), we represent our matrix in 3 arrays: V, C, R. V – the array of non-zero values, written left-to-right, top-to-bottom. C – the array of column indices of the values in V. And C – the "boundary", or "row index" array, built as follows: We start by recording the number of non-zero values per row in each element of R, starting with R[1]. R[0] = 0. Then we apply the scan operation (like the F# Seq.scan) to the row array, to produce the final result. The resulting array contains m + 1 (m – number of rows in the matrix) elements, its last entry equals the total number of non-zero values in the matrix). This array is used as a "slicer" or "indexer" into the column/value arrays: non-zero columns of row will be located in arrays V and C at the indices starting from R[i] and ending at R[i + 1] – 1. This is all pretty intuitive.
Overcoming F# Strong Typing
F# is a combination of strong typing and dynamic generic resolution, which makes it a challenge when you need to write a template for which it is natural to be resolved at compile time. Then sweet memories of C++ or Python invade… There exists a way to overcome all that and it is not pretty. To implement it I needed the old F# PowerPack with
INumeric included. Then I just coded the pattern explained in the blog post:
// SparseMatrix.fs /// <summary> /// Sparse matrix implementation with CSR and CSC storage /// </summary> [<StructuredFormatDisplay("{PrintMatrix}")>] type SparseMatrix<'a> (ops : INumeric<'a>, row : 'a seq, rowIndex : int seq, colIndex : int seq, rowSize, isCSR : bool) = .... static member CreateMatrix (row : 'a []) (isCSR : bool) = let ops = GlobalAssociations.GetNumericAssociation<'a>() let colIdx, vals = Array.zip [|0..row.Length - 1|] row |> Array.filter (fun (i, v) -> ops.Compare(v, ops.Zero) <> 0) |> Array.unzip SparseMatrix(ops, vals, [0; vals.Length], colIdx, row.Length, isCSR)
The idea is to use the
GlobalAssociations to smooth-talk the compiler into letting you do what you want. The pattern is to not directly use the constructor to create your object, but a static method instead, by means of which this "compiler-whispering" is hidden from the user.
My sparse matrix is built dynamically: it is first created with a single row through a call to
CreateMatrix and then rows can be appended to it by calling
AddValues row. The idea is to allow creation and storage of huge matrices dynamically. These matrices may be stored in large files for which representation in dense format in memory may not be feasible.
Representing the graph
So, at which point does it make sense to use a sparse matrix instead of a dense one in CSR/CSC? It's easy to figure out:
If we have a matrix , then the answer is given by the equation: , here is the number of non-zero elements in the matrix.
For a graph the set V takes a place of rows, and E – that of columns. The above inequality becomes: , so our sparse structure becomes very economical for large, not to mention "really huge" graphs. (We don't have the values array anymore, since all our values are just 0s and 1s).
And so the graph is born:
[<StructuredFormatDisplay("{AsEnumerable}")>] type DirectedGraph<'a when 'a:comparison> (rowIndex : int seq, colIndex : int seq, verticesNameToOrdinal : IDictionary<'a, int>) as this = let rowIndex = rowIndex.ToArray() let colIndex = colIndex.ToArray() let nEdges = colIndex.Length let verticesNameToOrdinal = verticesNameToOrdinal let nVertices = verticesNameToOrdinal.Count // vertices connected to the ordinal vertex let getVertexConnections ordinal = let start = rowIndex.[ordinal] let end' = rowIndex.[ordinal + 1] - 1 colIndex.[start..end']
This is not very useful, however, since it assumes that we already have
rowIndex for the CSR type "R" and
colIndex for the "C" arrays. It's like saying: "You want a graph? So, create a graph!". I would like to have a whole bunch of graph generators, and I do. I placed them all into the file
This is a good case for using type augmentations. When we need to implement something that "looks good" on the object, but doesn't really belong to it.
In the next post I'll talk about visualizing things, and vsiualization methods really have nothing to do with the graph itself. Nevertheless, it is natural to write:
instead of:
Visualize(myGraph, euler=true)
So we use type augmentations, for instance, going back to the generators:
//Generators.fs type Graphs.DirectedGraph<'a when 'a:comparison> with /// <summary> /// Create the graph from a file /// </summary> /// <param name="fileName"></param> static member FromFile (fileName : string) = if String.IsNullOrWhiteSpace fileName || not (File.Exists fileName) then failwith "Invalid file" let lines = File.ReadLines(fileName) DirectedGraph<string>.FromStrings(lines)
which creates a graph by reading a text file and calling another generator method at the end. This method actually calls the constructor to create an instance of the object. Keeps everything clean and separate.
This post was intended to briefly construct the skeleton. In the next we'll put some meat on the bones and talk about visualizing stuff.
Look-and-say: [Alea.]CUDA
Continuing the Advent of Code theme from the previous post. Figured since this year is going to be my year of CUDA, this would be a good opportunity to take it for a ride. A good April 1st post, but why wait?
So, how can we make this even faster than the already fast imperative solution?
Naive Approach
The complete script for this is on GitHub.
The kernel computes one iteration of the look-and-say sequence. Every instance looks at a single group of repeating digits and outputs the result into an array. The new array is twice the size of the original one (representing a previous member of the sequence), every digit or the first digit of a group will produce two number (n, c) and every repeating digit will produce two "0"s on the output:
1 1 1 3 1 2 2 1 1 3 -> 3 1 0 0 0 0 1 3 1 1 2 2 0 0 2 1 0 0 1 3
[<Kernel; ReflectedDefinition>] let lookAndSayKernel (arr : deviceptr<int8>) (len : int) (out : deviceptr<int8>) = let ind = blockIdx.x * blockDim.x + threadIdx.x if ind < len then let c = arr.[ind] let idxOut = 2 * ind if ind = 0 || arr.[ind - 1] <> c then let mutable i = 1 while ind + i < len && c = arr.[ind + i] do i <- i + 1 out.[idxOut] <- int8 i out.[idxOut + 1] <- c else out.[idxOut] <- 0y out.[idxOut + 1] <- 0y
In the naive approach we bring the resulting sequence into the memory and repeat:
let lookAndSayGpu (s : string) n = let arr = s |> Seq.map (fun c -> (string>>int8) c) |> Seq.toArray let rec loop (arr : int8 []) n = if n = 0 then arr.Length else let blockSize = 512 let gridSize = divup arr.Length blockSize let lp = LaunchParam(gridSize, blockSize) use dArr = worker.Malloc(arr) use dOut = worker.Malloc(arr.Length * 2) worker.Launch <@lookAndSayKernel@> lp dArr.Ptr arr.Length dOut.Ptr let out = dOut.Gather() let arr = out |> Array.filter (fun b -> b > 0y) loop arr (n - 1) loop arr n
This is almost not worth checking against the high performing imperative algorithm of the last post, but why not?
Not unexpectedly we are still falling short of the imperative solution. Not a problem. There are a few very low hanging fruit here that are just waiting to be picked.
A Better Solution
The complete script for this is on GitHub.
There are two problems with our solution so far:
- Two much memory being moved between the GPU and RAM
- A significant part of the algorithm is executed on the CPU with memory allocated and destroyed in the process (that would be the array compacting part)
The following algorithm addresses both problems:
GenerateSequences(str, n) {
//Allocate the maximum amount of memory for all data structures used on the GPU
len = str.Length
initializeGpuMemory(str, len)
for i = 1 to n {
compactResultStream(2 * len)
len = getNewLength()
Of the 3 steps in this iterative loop, there is only one where in the implementation we move data from the GPU. It would be easy enough to not do it if necessary, though.
At the core of this algorithm there is a stream compaction routine that is executed hopefully entirely on the GPU. Compaction is performed by copying only the values needed to the addresses in the output stream. These addresses are determined by running an inclusive scan on the array of integers that contains "1" in a meaningful position, and "0" in all the rest. The details of how scan is used for stream compaction and how scans are implemented on the GPU, are discussed in GPU Gems 3 (free from NVIDIA). I'm using a device scan that comes with Alea.CUDA, which, hopefully, minimizes memory copies between main memory and GPU.
Now that the stream has been compacted, we get the length of the new sequence as the last entry in the address map, obtained during compaction (and explained in the linked chapter of GPU Gems 3).
[<Kernel; ReflectedDefinition>] let lookAndSayKernelSimple (arr : deviceptr<int>) (len : int) (out : deviceptr<int>) (flags : deviceptr<int>)= let ind = blockIdx.x * blockDim.x + threadIdx.x if ind < len then let c = arr.[ind] let idxOut = 2 * ind let prevUnrepeated = if ind = 0 || arr.[ind - 1] <> c then 1 else 0 flags.[idxOut] <- prevUnrepeated flags.[idxOut + 1] <- prevUnrepeated if prevUnrepeated = 1 then let mutable i = 1 while ind + i < len && c = arr.[ind + i] do i <- i + 1 out.[idxOut] <- i out.[idxOut + 1] <- c else out.[idxOut] <- 0 out.[idxOut + 1] <- 0 [<Kernel; ReflectedDefinition>] let copyScanned (arr : deviceptr<int>) (out : deviceptr<int>) (len : int) (flags : deviceptr<int>) (addrmap : deviceptr<int>) = let ind = blockIdx.x * blockDim.x + threadIdx.x if ind < len && flags.[ind] > 0 then out.[addrmap.[ind] - 1] <- arr.[ind]
In the modified kernel, we also fill out the "flags" array which are scanned to obtain the address map for compacting the stream. The second kernel uses the result of the scan performed on these "flags" to produce the new compacted sequence. So for the above example:
original: 1 1 1 3 1 2 2 1 1 3
new: 3 1 0 0 0 0 1 3 1 1 2 2 0 0 2 1 0 0 1 3
flags: 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1
map: 1 2 2 2 2 2 3 4 5 6 7 8 8 8 9 10 10 10 11 12 (inclusive scan of the flags)
The last entry in the map is also the new length.
let lookAndSayGpuScan (s : string) n = let maxLen = 20 * 1024 * 1024 let arr = s |> Seq.map (fun c -> (string>>int) c) |> Seq.toArray use dOut = worker.Malloc(maxLen) use dFlags = worker.Malloc(maxLen) use dAddressMap = worker.Malloc(maxLen) use dArr = worker.Malloc(maxLen) dArr.Scatter(arr) use scanModule = new DeviceScanModule<int>(GPUModuleTarget.Worker(worker), <@ (+) @>) scanModule.Create(100) |> ignore let sw = Stopwatch() let rec loop n len = if n = 0 then len else let blockSize = 512 let gridSize = divup len blockSize let lp = LaunchParam(gridSize, blockSize) use scan = scanModule.Create(2 * len) worker.Launch <@lookAndSayKernelSimple@> lp dArr.Ptr len dOut.Ptr dFlags.Ptr scan.InclusiveScan(dFlags.Ptr, dAddressMap.Ptr, 2 * len) let gridSize = divup (2 * len) blockSize let lp = LaunchParam(gridSize, blockSize) worker.Launch <@copyScanned@> lp dOut.Ptr dArr.Ptr (2 * len) dFlags.Ptr dAddressMap.Ptr let len = dAddressMap.GatherScalar(2 * len - 1) loop (n - 1) len sw.Start() let res = loop n s.Length sw.Stop() res, sw.ElapsedMilliseconds
The complete code is above. Notice, that we are not cheating when we are measuring the speed of the internal loop and not including allocations. These can be factored out completely, so the only experiment that matters is what actually runs.
Now, we are finally fast! But it's a mighty weird chart, probably because most of the time is spent in context switching and all other latency necessary to make this run…
So, takeaways: GPU programming makes us think differently, cool GPU algorithms exist, writing for the GPU is tough but rewarding, and we can really blow a small problem out of any proportion considered descent.
Non-linear Thinking with CUDA.
I love GPU programming for precisely this: it forces and enables you to think about a solution in a non-linear fashion in more than one sense of the word.
The Problem
Given a set , output a set
In other words, pretend our array is cyclical, and we want all partial sums of the array elements, in order, starting from element i, ending with i + j. (We will be looping through the end, since the array is cyclical.)
In the bioinformatics course, this happens to be a toy problem of generating a cyclo-spectrum from the weights of a cyclic peptide.
So for a peptide with individual amino-acid masses [57; 71; 113; 113; 128], the first 3 iterations will look like:
|57 + 71
|71 + 113
|113 + 113
|113 + 128
|128 + 57
|57 + 71 + 113
|71 + 113 + 113
|113 + 113 + 128
|113 + 128 + 57
|128 + 57 + 71
On my GitHub.
Sequential Solutions
The above table immediately hints at a brute-force as well as an optimized solution. The brute-force solution is :
// brute force O(n^3) solution let cyclospec (peptide : int seq) = let len = peptide.Count() let pepArr = peptide |> Seq.toArray let mutable parsum = 0 (seq { yield 0 yield pepArr |> Array.sum for i = 0 to len - 2 do yield! [0..len-1] |> Seq.map (fun j -> //F# 4.0 Feature! parsum <- 0 for ind = j to j + i do parsum <- parsum + pepArr.[if ind >= len then ind - len else ind] parsum ) }) |> Seq.sort |> Seq.toArray
Note the F# 4.0 feature: a variable mutated within a closure.
This will work, but slowly. To significantly speed it up we only need to notice that there is no need to recompute values that have been precomputed already over, and over, and over again. So, memoization yields an solution:
let cyclospecOpt (peptide : int seq) = let len = peptide.Count() let pepArr = peptide |> Seq.toArray let output = Array.zeroCreate ((len - 1) * len) for i = 0 to len - 2 do [0..len-1] |> Seq.iter (fun j -> let ind = i + j output.[i * len + j] <- if i = 0 then pepArr.[j] else output.[(i - 1) * len + j] + pepArr.[if ind >= len then ind - len else ind] ) seq {yield 0; yield pepArr |> Array.sum; yield! output} |> Seq.sort |> Seq.toArray
Ok, so far so good.
Multi-dimensional thinking with CUDA
So how do we look at this differently with CUDA? I believe solving this problem shows how data, for lack of a better term, fuses with time (represented by threads). If we take a closer look at the table above, we'll see that the solution can be represented in a two-dimensional grid. For instance, at grid location (5, 3), we have a solution element that is constructed of , thus it's a grid X of dimensions n x (n-1)( where is the sum, starting from i-th element of the input set, and ranging over j elements.
This data structure maps easily into CUDA with its 3D thread model (this is the element of time/data fusion I was talking about).
Since we now have ALEA.Cuda, we can do this without leaving F#, and, even better, we can script it:
[<Kernel; ReflectedDefinition>] let cyclospecKernel (arr : deviceptr<int>) (len : int) (out : deviceptr<int>) = let ind = blockIdx.x * blockDim.x + threadIdx.x let lenElem = blockIdx.y * blockDim.y + threadIdx.y if ind < len && lenElem < len - 1 then let mutable parsum = 0 for i = 0 to lenElem do let idx = ind + i parsum <- parsum + arr.[if idx >= len then idx - len else idx] out.[lenElem * len + ind] <- parsum
And we invoke it:
let cyclospecGpu (peptide : int []) = let blockSize = dim3(16, 16) let gridSize = dim3(divup peptide.Length blockSize.x, divup peptide.Length blockSize.y) let lp = LaunchParam(gridSize, blockSize) use dPeptide = worker.Malloc(peptide) use dOutput : DeviceMemory<int> = worker.Malloc(peptide.Length * (peptide.Length - 1)) worker.Launch <@cyclospecKernel @> lp dPeptide.Ptr peptide.Length dOutput.Ptr let output = dOutput.Gather() seq{yield 0; yield! output; yield peptide |> Seq.sum} |> Seq.toArray |> Array.sort
Each kernel thread is computing its own element in the grid, which is flattened into a solution. Time has indeed merged with data.
But what about our optimization? The easy way to implement it is to streamline invocations of a kernel, where each consecutive run will compute the new sum using the results of previous kernel invocations. There are variations on this theme, but it lacks the aesthetic value of the "brute force" CUDA solution:
let cyclospecOptKernel (arr : deviceptr) (len : int) (out : deviceptr) (lenElem : int)=
let ind = blockIdx.x * blockDim.x + threadIdx.x
if ind < len then
let idx = ind + lenElem
out.[lenElem * len + ind] = len then idx – len else idx]
let cyclospecOptGpu (peptide : int []) = let blockSize = 256 let gridSize = divup peptide.Length blockSize let lp = LaunchParam(gridSize, blockSize) use dPeptide = worker.Malloc(peptide) use dOutput : DeviceMemory<int> = worker.Malloc(peptide.Length * (peptide.Length - 1)) for i = 0 to peptide.Length - 2 do worker.Launch <@cyclospecOptKernel @> lp dPeptide.Ptr peptide.Length dOutput.Ptr i let output = dOutput.Gather() seq{yield 0; yield! output; yield peptide |> Seq.sum} |> Seq.toArray |> Array.sort
So, how did we do? (Here comes the mandatory chart):
And so:
- A little algorithm is a beautiful thing
- A little CUDA is an even more beautiful thing
- CUDA optimization performs no worse and at larger sizes of the input starts performing better, at some point massive amounts of computation slow us down even in parallel. See #1.
- And what is the GPU algorithm performance in O notation? It's definitely non-linear, is it possible to estimate analytically?
Here is another chart that only compares optimized algorithms. It's not a semi-log chart for easier visualization:
Modelling Stochastically Independent Processes with F# Computation Expressions: Part 1
The idea for doing this is not new. There is an excellent series of posts closely tracing an article on applications of functional programming to probability.
A colleague of mine has recently called my attention to his own post of two years ago, where he describes a monad that models stochastically independent events in Clojure. I thought the latter implementation actually went to the heart of the whole idea of monads and that is why, once I started writing my own in F# from scratch, event though I naturally/brute-force-like, chose something described below and which corresponds exactly to the series of posts above, I eventually was compelled to do it my colleague's way.
Here is the natural choice: a distribution (p.m.f) is just a sequence of events. Each event is simply a record/tuple/map of two values: the signifier of the event and its probability.
//underlying type type 'a Outcome = { Value: 'a Probability : BigRational } //Monadic type type 'a Distribution = 'a Outcome seq
This is great, and it works very well, as the posts show. My slight dissatisfaction with this approach is due to the fact that the competing one appears much more transparent, extremely easy to read, easy to use. In fact, anyone who knows Clojure syntax can use it right away to model independent processes simply by writing them out in Clojure, AND there is no need for any helper functions to extract the results. It just works (from the post, with some minor corrections):
(domonad probability-m [die1 (uniform [1 2 3 4 5 6]) die2 (uniform [1 2 3 4 5 6])] (+ die1 die2))
This code models an experiment of rolling two dice and returns a probability mass function that describes the experiment. All we had to do as users was describe the experiment in the most natural way possible: what is the probability of getting an exact value as the sum of both values of 2 rolled dice. Hence the expression: extract the value from the first pmf, add it to the value extracted from the second. Don't even need to think about probabilities, as the magic happens behind the monadic scene.
The code above gives us the result: {2 1/36, 3 1/18, 4 1/12, 5 1/9, 6 5/36, 7 1/6, 8 5/36, 9 1/9, 10 1/12, 11 1/18, 12 1/36} – which is a map of the sum of dice values to the probability of getting them. In F#, I believe, the Algol-like syntax actually works to our advantage (I call the computation expression "independent" for obvious reasons):
independent { let! x = uniform [1..6] let! y = uniform [1..6] return x + y }
When executed in F# interactive, and using the FSharp.PowerPack:
val mp : Map<int,BigRational> = map [(2, 1/36N); (3, 1/18N); (4, 1/12N); (5, 1/9N); (6, 5/36N); (7, 1/6N); (8, 5/36N); (9, 1/9N); (10, 1/12N); ...]
We, amazingly enough, get the same answers. Next time: better examples and nuts & bolts of the code.


text:
Currículum de Maria Ferrer Ribot
KINE Centro de Terapia Familiar y de Pareja (Barcelona)
Academic and Professional data
Degree in Psychology from the University of Barcelona.
Doctor of Education Sciences at the University of the Balearic Islands
Basic training in Systemic Family Therapy. KINE center. Center accredited by the FEATF.
Private practice as a psychologist (1991-2002).
Psychologist association XIAIF (Xarxa d'Iniciatives d'Atenció to Infància i Famílies) (2001-2012).
Professor, Department of Applied Education and Educational Psychology of the University of the Balearic Islands. Currently I teach teaching in graduate studies in Early Childhood Education of the subject Family and School and coordinate the practicum.
Professor and head of studies at the Master's Degree in Early Childhood: Perspectives and Intervention Lines University of the Balearic Islands.
Professor of various postgraduate courses at the University of Barcelona and the University of the Balearic Islands.
Co-director of the university course expert support programs for families in early childhood socio-educational and health fields. 2009 and 2010. University of the Balearic Islands.
Member of the Research Group on Early Childhood of the University of the Balearic Islands.
Member of the research group on Children, Technology, Education and Diversity (GITED).
President of the Balearic Association of Systemic Intervention (ABIS), years 2001-03.
Member of the Balearic Association of Systemic Intervention (ABIS) 2003- 2014
Secretary XIAIF (Xarxa d'Iniciatives d'Atenció to Infància i Famílies), 2001 and continued partnership.
Co-author of the book The cycle of life: a systemic view of the family. Desclée Brouwer. Col. Serendipity, together with Ascension Belart.
Publication of several chapters related to professional and family care and education in early childhood books.
Publication of 20 articles in journals of educational field (Children, Undivided, Reladei ...), psychology (College of Psychologists of the Balearic Islands, Official College of Psychologists, Mosaic ...) and social (Social Workbooks ) related to various topics such as the role and interventions of professionals in programs and socio-educational services for children and families, support parenting, relationships between families and school in early childhood, educational innovation and best practice in the stage of Early Childhood Education.
Participation in various projects of regional and national research as a researcher in relation to the quality of services and support programs for families and good practice in early childhood education.
Participation in national and international conferences related to topics about families, relationships between schools and families, educational innovation i educational intervention.
Lectures, conferences, seminars and courses for families around the systemic vision of the family and life cycle.
Professor of several courses in Teacher Centres of the Ministry of Education of the Balearic Islands.


text:
kenosis, 12 Sep 2009hi all, any new news about X3? SOny Ericsson said they will announce the phone soon! We will see if this will happen or not. :)
Anonymous, 01 Jan 1970dude ! for god sake refer to the specs n compare 'em both. x2 is no wonder a class of all. its ridiculous to compare it to n97, only the crude n rookies do. x2 is unmatched for now. design tech?? dont even talk bout it. x2 seriously n truly is a Chronic set.
I think this phone have some of the better functions such as camera but when it goes to look only the keyboard looks good , i personally think the x1 looks better so i'm not excited about the x2.
Anonymous, 01 Jan 1970X2 anytime, no doubt about that, do not again ask this question, use ur own sense
X1 , 10 Sep 2009X2 made by hTc??my X1 so many problem! Problems like what?
Anonymous, 11 Sep 2009the n97 has 32GB of internal memory which requires a faster processor.
The x2 has just 110 MB "the n97 has 32GB of internal memory which requires a faster processor.
The x2 has just 110 MB"
not really. it is not the HDD that requires a fast CPU. the HDD loads as fast as it's own mechanics allow. but without knowing the exact hard drive name, i can not tell you a whole deal about it.
The core processor speed only really affects the speed at which applications run, and because phone HDDs use Flash memory(very similar to SSDs), power consumption is minimal, and memory accessing speed is very fast without needing the CPU
Why dont they enhance the light flash? I mean a LED flash is not much consistent with an 8.1 MP camera.
Heyyyyyy...this one is awesome,i'll get it asap,Im Arash from Iran too,regarding to the pre comment would like to tell u not many ppl buy Nokia these days,is under ppl's sanction....we all support Sony Ericsson man,be sure;)
i doubt its gd , x1 sucks haha, SE phones always need to go service centre although the design is top class
X1 , 10 Sep 2009X2 made by hTc??my X1 so many problem! X2 is made by Sony Ericsson, not HTC. Only the X1 was made by HTC.
i'm sorry but you just cannot run windows mobile 6.5 on a 528mhz proccessor, that's just weak.
take a leaf from samsung's book
Because the trademark X3 has been used by others then if SE announced xperia android it must be better if they keep calling it as xperia rachael. And do not forget to add a caption like this: next time we will never forget to register the name we created.
Demon_harp, 11 Sep 2009a resistive touchscreen fone. but only have 65k colors! wat a dork! i remember my old nokia 76... moreYou seem to know quite accurately that its screen has only 65k color! How long had you count the colors? Have you already rechecked it if the number was correct? Of course you don't have to know a little bit about WinMo coz it would be hard for you to understand.


text:
The University of Oregon's School of Journalism and Communication is working to find a leader "who can usher the school into a new era of opportunity and transformation in teaching, research and professional creative work," according to the SOJC website.
Serving as chief academic and administrative officer for the SOJC, the new dean will also report to the provost, direct outreach and fundraising efforts and build a strong connection with alumni, industry supporters and the academy.
The UO job board has the full description for the position, and the search committee is accepting confidential applications and nominations until a new dean is found. Submission emails are located on the SOJC website.


text:
James Cameron Says 'Wonder Woman' is a Step Backwards for Feminism
James Cameron has a controversial view on the movie Wonder Woman and it being celebrated as a major feminist achievement.
The 63-year-old director, best known for helming Titanic and Avatar, was asked for his opinion on the success of the DC Comics movie.
"All of the self-congratulatory back-patting Hollywood's been doing over Wonder Woman has been so misguided. She's an objectified icon, and it's just male Hollywood doing the same old thing!" Cameron told The Guardian.
He did make sure to let it be known that he is still a fan of the movie.
"I'm not saying I didn't like the movie but, to me, it's a step backwards. [Terminator character] Sarah Connor was not a beauty icon. She was strong, she was troubled, she was a terrible mother, and she earned the respect of the audience through pure grit. And to me, [the benefit of characters like Sarah] is so obvious. I mean, half the audience is female!" he added.


text:
The events of this story take place immediately following the events in Down the Murder Hole. While I don't think it's necessary to have read that first to enjoy this, it might help answer some questions you have. It will help to avoid any spoilers for that story as some of the events are discussed here. If you wish to see the team from the very beginning you can do so here.
Paranormal S.W.A.T.
The Wonderland Hangover
Captain Albert Card, team leader and sorcerer, stood in the elevator scowling at the reflective inner walls of the small mechanical room. He hated peoples need to see themselves so badly that they put mirrors on any flat surface. He once again considered how to remove the glistening metal walls from the apartment complex without anyone noticing. At least he was alone and didn't have to contend with any of the buildings residents; though solitude was rarely unheard of at 2 am.
The elevator jerked to a halt at detective Sarah Parker's floor and gave off a happy ding as the doors opened causing Albert to growl. Albert hoped that Sarah was waiting for him and would see how annoyed he was at the summons. Sadly, the way was empty. He stalked down the corridor to her door mumbling to himself, "Come over right away. Only you can help me. Don't tell Griffin." As if he had nothing better to do with his time than prattle on about the latest ill-chosen relationships, like some overwrought teenage girl. He had hoped Griffin would have the good sense to not get involved with a Sarah beyond a professional relationship but he could see that would not be the case.
He reached her door and knocked twice as sharply as he could and waited until he heard Sarah's muffled voice ask who was there. When she replied he tested the door, found it unlocked as she had said, and let himself in. "Sarah, it's Albert." He stepped into the foyer and looked around, she was absent from the living room of her functional apartment. Comfortable for a police officer's salary, well maintained, and orderly. A few personal touches hung around the room; old photos of her and a childhood friend, two movie posters for what he assumed were her favorite action movies, and a nicely framed picture of her father in his patrolman's uniform.
Her voice rang from the bedroom, "Albert. Thank god you're here. I'm in the bedroom." There was a pause as Albert moved to shut the door when Sarah shouted again. "I'm so sorry, I forgot. I invite you into my home."
Albert swore under his breath as he closed the door, in his agitation he had forgotten that despite having been to Sarah's apartment on two other occasions she wouldn't remember them. When they first started working together he wanted to see how well she would be able to deal with some of the things they came across and interviewed her about her experience. He had used his mesmerism to make sure she told the truth then ordered her to forget the meeting. The second time he needed to was when she had overreacted to how he had decided to solve a particular problem. Her idea of justice was noble but got in the way of doing what was necessary.
Albert finished closing the door. "Thank you, my, what a lovely apartment you have." No response. "What do you need me to do? You were a little vague on the phone." She was quiet. He preferred this, if he could avoid the niceties and get straight to the problem he might be done before dawn and possibly even deal with something important.
"Maybe you should come into the bedroom. It got worse since I had called you and now I don't think I can get out there."
Her statement gave him pause, what could possibly have happened that would prevent her from leaving her bedroom. A few demon possessions, some physical transformations, and an active threat in the room would certainly be something that would prevent her leaving. She had called him, which meant she could use a phone, if her insistence on Griffin not accompanying him were any indication she hadn't wanted the team to be with him, or someone else didn't want the team with him. He moved his fingers up the sides of his widows peak, a nervous gesture he hated, he stopped and forced his hand to his side.
He looked down the hall at her bedroom and sniffed the air, he couldn't smell anything out of the ordinary. He picked up the scent of her blood, and when he closed his eyes and focused he could hear her heart beating strong and fast. She was afraid. He couldn't sense anything else in the room but that didn't mean she was alone. His senses were keen but there were things that didn't have blood or a heartbeat.
He drew his revolver, a silly mundane weapon but effective, from under his long trench coat and wondered if he should back out of the apartment and call for backup. No, if this were a trap they would have thought of that. He decided to push forward counting on any attackers not knowing exactly what they were dealing with. He moved to the back of the apartment and down a small hallway to her bedroom, the door was slightly ajar and he knocked twice before cracking the door open. He took one look at Sarah and put the gun away.
She sat on the floor of her bedroom, her back in a corner, and her knees pulled up to her chest. She was wearing a long t-shirt and a pair of short. She looked worried and her face was tear-stained. As Albert entered she wiped her face with the back of her hand. She looked down to meet his eyes, her head nearly hitting the ceiling. Though he couldn't be certain, he'd guessed that Sarah was roughly fifteen feet tall.
She smiled weakly at him. "Can you fix it?"
Her face broke and her head fell into her hands as she sobbed against the pain of his answer. He watched her for a second and then said, "Let me call someone who might be able to help." He stepped out of the room and left her crying in the corner.
Once he'd returned to the living room he sat on her couch and lifted her phone off its cradle. This should be an easy problem, all he had to do was call Jim and have him bring the enclosed truck and some tarps. It would be difficult to dispose of that much person but there were ways and places. Wouldn't be the first time disposal was the best solution.
However, Albert hadn't been as successful in his long existence by making rash decisions. She was a police officer and people would look for her. The last call on her phone was to him at the office which could be traced easily enough. He could have Christine erase the records from the phone company but that would be another person involved. Griffin would be angry at the perceived betrayal, these things never stayed secret long. If it had been anyone else he could simply mesmerize the problem away but Griffin was a special case since he wouldn't be able to get the necessary eye contact. Worst of all was Adam; he would get on his moral high horse and never let Albert hear the end of it. Still, Lake Michigan seemed so much simpler.
He contemplated for a long moment and then dialed the only number he could think of.
* * *
Nearly two hours later Albert rose from the couch, where he'd been waiting, and opened the door to Doctor Edward Jackson. Doctor Jackson was a calm, confident man whose outward appearance often led to people underestimating him. Albert knew his wardrobe had been carefully chosen, the disheveled appearance of the suit was misleading to anyone who didn't know it was precisely tailored Armani two sizes too large for the young man.
"Hello Captain. Sorry it took so long I came as quickly as I could. I needed somethings from my office. It sounds like a fascinating case."
"I understand Edward. I'd prefer you have everything you need anyway. She's in the bedroom."
Albert led the way down the hall and into the bedroom where Sarah still sat hunched in the corner. "Your patient Doctor." With his work done Albert pulled a small chair away from a nearby desk covered in various paperback novels and sat to watch what happened next.
Doctor Jackson approached Sarah and smiled warmly. "My name is Doctor Jackson. What's your name?"
Sarah looked weakly at the Doctor. "Sarah."
"Hi Sarah. Let's see if we can't figure out what happened and how to fix it."
Albert watched as Jackson went through his routine. There was no reason to ask her name, Albert had told him it when he called him, and yet, here he was unnecessarily coddling her. What a waste of effort. Jackson opened his black medical bag and began pulling out the standard tools of his profession: stethoscope, tongue depressors, and a digital thermometer. All useless in this instance. He soon switched to the more exotic tools needed for magical maladies and curses: rune stones, fragments of magic mirror, and a few oddly shaped probes.
After poking and prodding Sarah for nearly an hour, asking questions, and gauging her responses he finally asked something that caught Albert's interest. "Have you come in contact with any fairies lately?"
Sarah nodded. "Last night, I was in a fairy nightclub, and I think I went to fairyland."
Albert stood and walked across the room inserting himself in the conversation. "The Fey Lands. She was with Griffin in the Fey Lands."
Jackson thought for a moment. "I just saw Griffin a few hours ago and he's not experiencing this."
"Is Griffin okay?" Sarah's voice filled with concern.
Before Jackson could say anything damning Albert answered her. "Yes, he's fine. It's standard procedure for anyone on the team who encounters the Fey Lands to get checked put afterwards. I wish we'd thought to bring you in for an exam as well."
Jackson was meticulously placing his tools back in his bag. "Did you drink anything in the Fey Lands?"
"No. We ate dinner at the club but once we got to the tea party we didn't eat or drink anything. Griffin said dinner was safe."
Albert ran his fingers up the sides of his widow's peak. "It would have been safe to eat at the club. Even fairies aren't that stupid."
Jackson began muttering to himself, he seemed to be having half a conversation. He suddenly looked at Sarah. "Think about the tea party. Did you come in contact with any food? There was a fight there, right? Did anything shoot through a cake, hit with a bottle, did food go flying into the air? Take your time and concentrate."
Sarah took a deep breath and concentrated for a few moments. "A woman threw her drink in my face."
Jackson smiled wide. "Excellent. There is good news and bad news and a little more good news. I know what we're dealing with. This is a case of the Eat me/Drink me. It's like Alice in Wonderland, if you drink something you grow bigger and if you eat something you get smaller. Depending on the order you do it in. It's apparently a big hit at fairy parties."
Sarah thought for a moment. "I always thought it was the other way around. Doesn't the drink shrink you?"
"Lewis Carol was recounting the story told by a ten year old girl." Interjected Albert. "Some of the details got reversed."
"As that may be." Jackson grabbing the conversation and bringing it back on point. "When the woman threw her drink in your face it probably absorbed into your skin or soaked into your lipstick or makeup. After that it gradually worked its way into your system. That's why unlike the books you didn't instantly grow to your current height."
Sarah smiled down at Jackson. "We can fix it though, right?"
"Not exactly. It's been in your system too long and you left the Fey Lands. I don't think we can cure you."
Sarah's eyes began to water.
"However, that doesn't mean we can't manage it."
"How so?"
Jackson smiled. "It'll take me a day or two, but I should be able to come up with a chemical that will repress the growth and return you to your normal height temporally. It should keep you at your regular height for several hours and with constant use and doses you could remain your normal height indefinitely."
"I'm going to have a prescription for my height?"
"In essence." Jackson smiled again. "I'll clear it with your captain and get you the necessary time off for medical leave. I've worked with the police department before so it shouldn't be a problem. You'll be back to work by Monday."
"Thank you."
"Until then, I believe I can whip up an injection for emergency use that will give you an hour or two of normal height."
With the problem dealt with Albert stood to leave. As he moved to the door Sarah called out to him. "Albert."
"Yes Sarah."
"Thank you for helping me."
Albert turned to look at her. "It was no problem. I was glad to help." A small lie for her good graces couldn't hurt.
"You won't tell Griffin about this, will you?"
"No. I won't."
"Promise me?"
"I promise." Albert felt the warm ripple of a promise made and sealed. A binding force between two creatures of magic.
He stood outside her apartment building with only a small amount of night left to him. The promise between them had sealed. An interesting development. Now he couldn't break it without consequences. He had promised her things before and never had it sealed in this manner. He wondered what had changed about Sarah to make her capable of such a pact and exactly what he was a part of now.
Well, I hope you enjoyed the story. Please feel free to leave a comment below and tell me what you thought. You can also find me over on Facebook, Twitter, and Youtube.


text: Will this update kill all the ringtones I have created with iRinger? Will they stay in iTunes, or will I have to re-create them? I got my iPhone in April, so I've not gone through a software update yet. Bummer if I lose these and have to wait for iRinger to update. I've gotten rather used to my custom tones.


text:
Vapamore MR-75 AMICO Handheld Steam Cleaner
$ 99.00
Genuine Vapamore MR-75 AMICO Handheld Steam Cleaner. With MR-75 AMICO Handheld Steam Cleaner bed bugs, dust mites, germs, and eggs are killed on contact because of the 200-210 degree steam. Want to clean every surface and crevice in your home? The attachments will guarantee your ability to do so. This portable, handheld steam cleaner will be your right hand machine!
- 210 Degree steam
- Great for home & auto
- Sanitizes and cleans without chemicals
- Removes grease, grime, dirt & stains
- Kills mold, mildew, germs, and dust mites
- Removes pet stains
- Vacuum mode and two steam modes
- Water heater is 1300 watts
- Steam hose & connector
- Accessory tool adapter
- Jet nozzle
- Detail scraper
- nylon brush straight
- Nylon grout brush
- nylon medium duty brush
- Large nylon brush
- Small brass brush
- Large brass brush
- Large stainless steel brush
- Fabric steamer & squeegee
- 3 Cotton covers
- Measuring cup
- carrying case
- Accessory storage bag
- Model: Mr-75 AMICO
- Power: 115 V 60 HZ
- Heating element: 1000 W
- Steam pressure: 43.5 PSI
- Boiler temperature: 210° F
- Tank capacity: 6.7 FL OZ
- 4 Minute heat-up time
- 10′ Power cord length
- 3′ Steam hose length
- Weight: 3.5 Lbs
- ETL Certified
Benefits to Cleaning with Steam
Household, construction sites, flood and fire restoration, allergy control, automotive, boat, RV, pest control/bed bugs, grout cleaning, hospitality, restaurant, commercial kitchens, gum removal, pet care at home, animal care facilities, hospital and care facilities, sporting goods, jewelry, food processing, and air-conditioning and heating.


text:
Frequently Asked Questions
Before you ask us a question, check to see if it's been asked here!
• What is the Tri-Service Ball?
The Tri-Service Ball is an annual social event hosted by the Chiefs and Petty Officers' Mess of 47 RCSCC CAPTAIN VANCOUVER. It is held exclusively for cadets and their guests. This event is the perfect opportunity for cadets to meet old friends and to make new ones as we celebrate an end to the cadet and school year. This year we are excited to present BOULEVARD, the 72ND Tri-Service Ball at HMCS DISCOVERY in Vancouver, BC.
• Who can come?
Any cadet who is currently participating in the cadet program regardless of element is eligible to come to this event. Cadets may bring guests who are not cadets as long as their guests are between the ages of 12 and 18. Guests who are over the age of 18 will be refused entry to the event.
• Why does this event require formal attire?
The Tri-Service Ball is an annual event that has been hosted for 71 years that originally began as a resemblance of a traditional military-style ball. While the music has evolved over time, we'd like to keep an important traditional aspect of the event.
• What is the Dress Code?
A formal dress code is in effect.
[Ladies] Dress (of appropriate length, see below), ballgown, flats, high heels, etc.
[Gentlemen] Dress pants, dress shirt, ties, blazers, etc.
• Can I wear black Khakis/cargo pants to the event?
No, these are not considered formal attire.
• What is NOT formal footwear?
Boots (including Uggs), sneakers, runners, sandals, and flipflops
• (Females) How long does my dress have to be?
Make sure it is appropriate. We recommend mid-thigh as the highest you go.
• Does my outfit have to match the theme?
No, not at all. You may wear any colour(s) as long as it is formal attire.
• Can I wear my cadet uniform?
You may, but seek the permission of your Commanding Officer ahead of time.
• Will tickets be sold at the door?
No, all tickets must be purchased in advance.
• Is parking available at the venue?
We have plenty of parking! All that is required is for you to present a valid driver's license, complete our liability waiver form at the entrance, and pay a $5.00 parking fee.
• Will there be food and drinks at the event?
Yes. However we will not be serving full meals, but there will be a concession available with a wide variety of refreshments.
• Is there a place for my belongings?
Yes. We will have a coat check available for you to leave your coats and belongings with us for the duration of the event. However, we will not be liable for any missing or stolen items.
• I live outside the Vancouver area but I am a cadet or a guest of a cadet that is within the age limit. Can I still come to Tri-Service Ball?
Of course! However, you must provide your own transportation and accommodations for your stay in Vancouver.
• I can't go to the Tri-Service Ball but I've purchased a ticket! What should I do with it?
You are more than welcome to re-sell the ticket to another guest who is either a cadet or guest of another cadet attending the event. Please inform us of the name of the new ticket holder prior to the date of the event. Tickets not matching the name on our guest list will be refused entry.
• What is considered valid ID?
A current year Go Card/School ID, BC ID, Driver's License, or any government-issued photo ID will be acceptable. We DO NOT recommend you bring important documents (such as passports or birth certificates) as we are not liable if they are lost/stolen.
• My question isn't on here!
Feel free to contact us at email@example.com.


text:
Use the form on the right to contact us.
You can edit the text in this area, and change where the contact form on the right submits to, by entering edit mode using the modes on the bottom right.
Miami, FL 33165
United States
Crafted from Asian hardwood and ash veneer. Table has a removable 18" extension leaf with wood glides and wood/metal gear plus a tension lever table lock !
Table Dimension: 60-78"L x 40"W x 31"H
Chair Dimension: 20"L x 23"W x 39"H


text:
Need Professional Passport Photos done right the first time?
We are Albuquerque's Passport Photography Specialists. Need a Passport or Visa Photo aside from the 2 x 2 inch size? Some of the different sizes we other include: 35mm x 45mm, 3.5cm x 4.5cm, 1.37 inch x 1.77 inch, 35mm x 53mm, 1 inch x 1 1/4 inch, 26mm x 32mm, 50mm x70mm, and 5cm x 7cm.
Lozoya Studio's guarantees passport photographs taken here to be accepted at the official agency that the photos are requested for. Using specialized passport photography equipment allows us to measure and cut to the exact size for each passport agency requirements.
Photographs are taken using professional lighting - not harsh on camera flash - that allows for soft, even lighting with no shadows on the person or the background.
Canadian and Mexican Passport Photos are a different size than US Passport Photos. (50 mm x 70 mm, 35 mm x 45 mm & 2 inch x 2 inch) Lozoya Studios' has the specialized equipment to create the exact size required for both Canada and Mexico.
Chinese Visa Photos are also a different size than US Passport and require specific sizing and placement within the photo. (33 mm x 48 mm overall)
To better serve our clients, we are open by appointment only. To schedule an appointment please call the studio at - (505) 243-1007.
Passport Photo Pricing:
2 Passport Photos* are $15.00
4 Passport Photos* are $20.00
6 Passport Photos* are $30.00
8 Passport Photos* are $40.00
10 Passport Photos* are $50.00
Digital Passport Files are $50.00 each.
*All Prices are per person, include tax and are subject to change without notice.
We also offer specialty photos for certificates and diplomas cut to an oval shape. The most commonly requested in black & white on matte paper. Matte paper does require a different camera and printer system - add $25.00 set-up fee for Matte paper finish. (Additional development time also required.) Since size requirements vary - please bring in the specific size that is needed.
We're experienced in the exact specifications needed for all major passport photos needs including:
American (US) Citizenship Photos (Fotos de Ciudadania)
American (US) Immigration Photos (Fotos de Inmigracion)
American (US) Passport Photos
American (US) Resident Card Photos (Fotos de Residencia)
Australian Passport Photos
Argentina (Argentinean) Passport Photos
Bahamas (Bahamian) Passport Photos
Brazil (Brazilian) Passport Photos
Britain (British/United Kingdom) Passport Photos
British Visa Photos
Canadian Citizenship Photos
Canadian Passport Photos - Including all required stamps on the reverse side of the photo
Canadian Visa Photos
China (Chinese) Passport Photos
China (Chinese) Visa Photos
Czechoslovakia (Czech) Passport Photos
Denmark (Danish) Passport Photos
France (French) Passport Photos
Germany (German) Passport Photos
Holland (Dutch) Passport Photos
India Passport Photos
Indonesia Passport Photos
Ireland (Irish) Passport Photos
Israel (Israeli) Passport Photos
Italy (Italian) Passport Photos
Japan ( Japanese) Passport Photos
Lebanon (Lebanese) Passport Photos
Maldives Passport Photos
Mexican ID Photos (Fotos de Infantil - en color o blanco y negro)
Mexican Passport Photos (Fotos de Pasaporte Mexicano)
Morocco (Moroccan) Passport Photos
Nepal Visa Photos
New Zealand Passport Photos
Nigeria Passport Photos
Poland (Polish) Passport Photos
Palestine Passport Photos
Peru (Peruvian) Passport Photos
Russian Passport Photos
Sweden (Swedish) Passport Photos
Switzerland (Swiss) Passport Photos
Thailand Passport Photos
Tonga Passport Photos
Trinidad and Tobago Passport Photos
Uganda Passport Photos
Zimbabwe Passport Photos
If the country you need Passport Pictures for isn't listed above - just bring in the paper work with the specifications and we can meet your photographic needs.
About Us
Family Portraits
Studio Wedding Photography
Quinceanera Portraits
Children's Portraits
Senior Portraits
Passport Photos
Publicity Photography
Maternity Portraits
Boudoir Photography
Oscar Lozoya
Jessica Lozoya


text:
Smart step! Homeowners can build their wealth faster than renters. Before you begin looking for your dream home, there are a few important steps to take. A home is usually the largest purchase you will ever make and an excellent reason to do your homework. Here I have provided a few steps to help you get started on the path of owning a home. With the constant fluctuation of the real estate market, it is important to be prepared when you are ready to make the purchase.
Save, Save, Save! You should count on making a 20% down payment to qualify for a loan. This would be $20,000 for every one hundred thousand of purchase price. There are grants available to first time home buyers, and doing research online for different companies offering to help you qualify for said grants could reveal many opportunities to help you purchasing your first home. The amounts can vary from ten to thirty thousand, and are well worth checking out. Free money is always nice! With or without a grant, you will need to watch what you spend three months before applying for a loan. Lenders look at spending habits so everything you buy shows a pattern and can make or break a loan. Also, avoid moving into your new home without having money saved up in case of an emergency.
Along with saving for your down payment, you will want to start keeping track of your credit score. Remember, the higher your credit scores the better rate and options for a loan. There are credit reports available online, and many of them for free. If there is an error on your credit report, it needs to be addressed as soon as possible. Many of these sites also have useful information that can teach you about the effects of every financial decision you make.
Your next step is to find a lender. The increase in new laws for home loan lenders can make them appear unreasonable and impossible to make an agreement with. Hang in there. Due to the past difficulties in the lending industry your lender will ask for proof of everything. Some information they will want you can have ready before you even have your first meeting, such as the last two years of tax returns, pay stubs for the last three months, proof of employment for the last two years, and three months of your bank and credit card statements (even the blank pages). They will likely ask for more but having these things ready will get you started on the right track. At the end of this process you will receive a pre qualification form to give to your REALTOR®. You will not be able to present an offer without this form.
Now for something more exciting! You can start a list of everything you are looking for in a home. What aspects are most important to you about a home? Sometimes, these lists will have to be adjusted to fit into your price range, but your REALTOR® will help you with that. Are you ready to build sweat equity and do a fixer-upper? Or maybe you would rather approach only cosmetic things such as replacing carpet and painting walls? There are also plenty of move in ready homes if you would prefer! You should consider how you feel about all of these before you meet with your agent so you know what you are willing to put forth into your new home. Together you will go over your price range and your wish list, and your REALTOR® can start to find you homes that meet your ideals.
Eureka, you have found a home that is perfect! Once you find the perfect home it is time to sit down and write an offer. Your REALTOR® will research the area the home is located in to see the current market value to help you narrow down the price to offer. One thing to keep in mind is that the asking price is just that-the asking price. At this point your agent will write your offer and you will need a deposit check, which will be credited towards your down payment if your offer is accepted, along with the offer to show you are a serious buyer. Your agent will contact the sellers' agent. Your REALTOR® will keep you up to date on all of the agreements and forms needed.
Once the offer is accepted it is time for inspections. Usually these are done the first ten to fifteen days after the offer is accepted. Time is of the essence, and your REALTOR® will be able to keep this time line on track for you. If any problems appear from the inspections, your REALTOR® can discuss with you the various options in addressing them. You may ask your REALTOR® for advice but ultimately the decision is up to you. Once all inspections are done and approved, you will want to call the utility companies and arrange to have them switched to your name on the date of closing. Your REALTOR® will provide you a list of all the names and numbers that you will need to call. This is not something you will want to wait on doing as it will be hard to get by if the power is not turned on when you are moving in, and having internet service is almost impossible for most of us to live without.
ESCROW! The escrow company will have done all of the research on the history of the home and they will make sure all of the documents necessary are ready to transfer into your name. You will need to get your down payment into the escrow account prior to the closing day; usually about a week ahead of time is what you should aim for. This will help prevent delays in the closing the escrow. At this point your loan will be ready to transfer to seller. After you sign all of the documents it will usually take a few hours for your loan to be funded. Your REALTOR® will bring you your new home keys as soon as the process is complete.


text:
If you're interested in having metal roofing installed on your home in Florida, then you've come to the right place. At SolarShield Metal Roofing, we have a patented roof system that is known not only for its unrivaled durability, but also its outstanding energy efficiency. Our roofs combine both insulation and radiant barrier for the ultimate in energy savings. In fact, we guarantee a 25 percent reduction in heating and cooling costs the first year after your new roof is installed.*
With metal roofing from SolarShield, you'll also have a wide variety of style options to choose from. We work with a number of top manufacturers, which provides us with an array of product combinations so that we can offer our customers more than 30 color options and 12 styles. Some of our roofing profiles include:
Monticello Style – features tall-standing ribbed panels designed after Thomas Jefferson's renowned home in Monticello, VA
Key West Style – a Florida-inspired design with ribbed panels that have a crimped look
Wood Shake – this metal roofing resembles classic cedar (or other wood) shakes
Mediterranean Style – a popular profile that looks just like barrel tile roofing
While your metal roofing installed on your home can look just like a roof made of any other material, it will still protect your home with the unparalleled strength of steel. Our metal roofing is impervious to fire and can withstand hurricanes and other storms. Actually, a steel roof will last for more than 100 years, which means you'll never have to roof again, guaranteed.
Contact SolarShield today to learn more about our metal roofing or to schedule a consultation at your home in St. Petersburg, FL.
*Conditions apply
All guarantees and warranties are able to be viewed in writing prior to purchase.


text:
|Yuki! Check her blog out HERE
|Bianca, our subject for the day. She's too cute!
|Photography lessons
|Top- ZARA. Skirt-Anne Taylor. Cardigan-Mango. Bag-Parfois
|We met this dog!
While I'm a million percent sure that this isn't even the worst of it, the past few days have been pretty packed with things to do. Red Bull duty (oh geeez I need to be doing my job better), marketing team duty, thesis duty, bakery duty, weight loss duty, team B duty. ugh. I have the worst senioritis right now and just wanna sleep. Anyway.
Today team awesome-thesis and I got up early for an interview with a prospective company. (Please oh please pick us!) I'm not very good with being formal, so my nervous judgement made me pick this outfit for the interview...and it's only now that I realize that I think I kinda look like a salsa nanny. Like oh shit. Did I seriously just wear that today? (did I mention we interviewed for a pretty huge shoe retail company?) Oh my. Call me Lupe. After the interview I taught Yuki how to shoot manually and we played around with outfit shots. She's gorgeous really, and me, well I look like a nanny potato! It was all good fun though. Haha maybe the reason I'm so tired is cause I keep goofing around like this while working...
No jablo Espanol...Salsa!


text:
New Olympic Mascot A Trainwreck As Always
In a classic case of overthinking something into oblivion, cities obsess over the stupid mascots for years, until they create some sort of awful mutant-by-committee. The WSJ reports that the Beijing mascot is disliked even by the artist who created them.
Throughout the 70s and 80s, mascots were fairly normal: a tiger, an eagle, a bear, a beaver, a gay dachsund.... In 1992 abstraction took over... Pictures of the Olympic mascots from '92 onwards.


text:
An advanced Javascript course for everyone! Scope, closures, prototypes, 'this', build your own framework, and more.
Lectures 85
Video 12 Hours
Skill level all level
Languages English
Includes Lifetime access
30 day money back guarantee!
Available on iOS and Android
Certificate of Completion
NOTE: This course includes information on ECMAScript 6 (ES6) the next version of Javascript!
In this course you will gain a deep understanding of Javascript, learn how Javascript works under the hood, and how that knowledge helps you avoid common pitfalls and drastically improve your ability to debug problems. You will find clarity in the parts that others, even experienced coders, may find weird, odd, and at times incomprehensible. You'll learn the beauty and deceptive power of this language that is at the forefront of modern software development today.
This course will cover such advanced concepts as objects and object literals, function expressions, prototypical inheritance, functional programming, scope chains, function constructors (plus new ES6 features), immediately invoked function expressions (IIFEs), call, apply, bind, and more.
We'll take a deep dive into the source code of popular frameworks such as jQuery and Underscore to see how you can use your understanding of Javascript to learn (and borrow) from other's good code.
Finally, you'll learn the foundations of how to build your own Javascript framework or library.
What you'll learn in this course will make you a better Javascript developer, and improve your abilities in AngularJS, NodeJS, jQuery, React, Ember, MongoDB, and all other Javascript-based technologies!
Learn to love Javascript, and code in it well.
Note: In this course you'll also get downloadable source code. You will often be provided with 'starter' code, giving you the base for you to start writing your code, and 'finished' code to compare your code to.
Anthony Alicea
Javascript: Understanding the Weird Parts
Development course coupon
Web Development course coupon
Javascript: Understanding the Weird Parts coupon
Udemy coupon
Udemy coupons
Udemy coupon code
Udemy courses
free coupons
Udemy free courses
Udemy free coupon


text:
This website sells Ecig/Vaping products containing nicotine and is only suitable for those 18 years or older. Click Enter only if you are at least 18 years of age.or Exit
Quantities available for this product:
Tips for new nicotine users: Sub-ohm or low resistance atomizers produce a higher throat hit than standard/high resistance atomizers. We strongly suggest 3 to 6mg eLiquid or lower with sub-ohm or low resistance atomizer heads. Preference may vary depending on the user and frequency of use.
For standard/high resistance atomizers or restrictive devices (ex. pod based/pen), we recommend 6mg or higher due to the mouth to lung (MTL) design of this atomizer/tank. Preference may vary depending on the user and frequency of use.
Warning: Sub ohm or low resistance tanks should only be used by experienced users. Extra safety precautions should be practiced when using a sub ohm tank. This tank will only work on a mechanical mod or a regulated mod capable of firing sub ohm atomizers and coils. For example, if you have a 0.2ohm coil, your mod must be able to fire atomizers of 0.2ohm or lower. You must also ensure that your batteries can handle sub ohm atomizers and coils. If you're using a regulated mod, make sure it can handle the amps. Improper use can lead to injury or damage. For mechanical mod users, please use 20 Amp batteries or higher. Use the OHMS LAW CALCULATOR, CHECK YOUR AMPS, and be safe! Any questions please contact us by email.
Battery Safety Warning:
Use special caution when using Li-Ion cells, they are very sensitive to charging characteristics and may explode or burn if mishandled. Make sure you have enough knowledge of Li-Ion rechargeable batteries in charging, discharging and assembly before use.
Do not let your batteries come into contact with metal objects such as keys, loose change or any other metal objects. Doing so will put you at risk for short circuiting your battery and explosion. Do not put loose batteries in your pocket, purse, bag or anywhere else. When the battery is not in use, you must store it in a plastic battery case to reduce the risk of a battery explosion.
Always charge in or on a fire-proof surface. Never leave charging batteries unattended.
Do not modify batteries or chargers in any shape or form.
Only use Lithium Ion rechargeable batteries in devices that have a built in protection circuit board(PCB) that detect shorts, over-discharge, over-charging etc. Use of lithium ion batteries without a PCB may increase your risk or explosion and/or fire.
Store your batteries away from the sun and heat to prevent overheating your batteries.
Please be sure to inspect your battery before use to ensure it is not damaged including tears / rips in the battery wrap. Discontinue use immediately if battery is damaged.
Do not discharge batteries below 2.5V. Do not charge the batteries over 4.2V.
kanvapewholesale.com will not be held responsible or liable for any injury, damage, or defect, permanent or temporary that may be caused by the improper use of a Li-Ion battery. Please have a basic understanding of the batteries you are using and how to care for them properly.
The ALUR Slik Ultra-Portable Pod System presents a dynamic card-style open POD SYSTEMS, featuring a 400mAh integrated battery with 2mL maximum pod cartridges. Streamlined in a beautiful rectangular chassis, the ALUR...
The ASPIRE Breeze 2 AIO Ultra Portable Pod Kit is the upgraded rendition to the original Breeze AIO, presenting a phenomenal pocket-friendly device with dual activation mechanism and a larger 1000mAh rechargeable...
Aspire Breeze All-in-One Starter Kit CLICK HERE TO FIND REPLACEMENT COILS FOR THE BREEZEIntroducing the all new Aspire Breeze. The Breeze is our latest all-in-one device that employs...