j

Kvíz: Děti mohou být v online světě ohroženy. Víte, jak je chránit?

Děti se v online světě pohybují naprosto přirozeně a svými technickými znalostmi často předčí své rodiče. Na druhou stranu jsou právě ony nejohroženější skupinou čelící útokům internetových predátorů a kyberšikaně. Rodiče často o hrozbách ani netuší. Vyzkoušejte si náš kvíz a zjistěte, jak jste na tom s digitálními znalostmi právě vy.



  • Finance - Finanční rádce

j

Kouzlo pravidelných investic. Jak funguje složené úročení

Současná koronavirová krize otřásla finančními trhy, zlevněné akcie jsou příležitostí, jak zhodnotit investici. Jenomže kdy je správná chvíle investovat? Už se trhy odrazily ode dna, nebo přijde další propad? A jak snížit riziko špatného načasování? Nad tím se zamýšlí Michal Valentík, investiční analytik společnosti Broker Trust.



  • Finance - Investování

j

Odklad splátek nebo refinancování. Jak dnes ušetřit na hypotéce

Splácíte hypotéku, u níž se blíží zlomové datum fixace? Jak na to, když chcete brzy půjčku doplatit nebo ji refinancovat? A lze před doplacením využít odkladu splátek?



  • Finance - Hypotéky a půjčky

j

Máte trable s koupeným zájezdem? Poradíme vám, jak nepřijít o peníze

Nová zákon „Lex voucher“ stanovil pravidla pro vypořádání cestovních kanceláří s klienty. Na problematické situace, které mohou být s koupeným zájezdem spojeny, jsme se zeptali advokáta Ondřeje Vokála.



  • Finance - Finanční rádce

j

Pojistit se kvůli covidu? Životní pojistky ani krytí marodění netáhnou

Mohlo by se zdát, že pojišťovny budou v koronavirové době zaznamenávat zvýšený zájem o sjednání životních pojistek. Zejména kvůli krytí rizika pracovní neschopnosti, což se vztahuje i na onemocnění infekcí covid-19. Praxe je ale zatím opačná.



  • Finance - Pojištění

j

Pedagogové na home office. Jaká jsou pravidla a na co mají nárok

Práci z domova u zaměstnanců soukromých firem nelze jednostranně nařídit, vzniká jen na základě dohody obou stran. U pedagogických pracovníků a zaměstnanců škol však platí trochu jiná pravidla. Ve spolupráci s právníky Bořivojem Líbalem a Markem Polonim přinášíme odpovědi na nejčastější dotazy pedagogů.



  • Finance - Finanční rádce

j

Majiで自撮りする5秒前。

まだあるんですよ。セルフタイマーで、真面目に撮りますよ。5、4、続きをみる

『著作権保護のため、記事の一部のみ表示されております。』




j

Raw Food Recipe Menu: June 26th, 2016

 

 
Breakfast
Strawberry Flax Smoothie
serves 2 ~ $1.28 per serving
 
 
 
Just two tablespoons of flax seeds, weighing in at 95 calories, contains over 140% of the daily value of omega 3 fatty acids. These fatty acids can protect against diabetes, cardiovascular disease, and cancer, and also decrease inflammation. Because the nutrients in flax seeds are better absorbed when ground ~ and a lot more palatable! ~ I've used the ground seeds in this recipe.
ingredients
  • 2 bananas, frozen and sliced ($.50)
  • 1 cup frozen strawberries ($1.00)
  • 4 tablespoons flax seeds, ground ($.40)
  • 1 cup almond milk ($.45) 
  • a few almonds, chopped
directions
  • In a blender, combine all ingredients and puree until very smooth.
  • Garnish with a few chopped almonds, if desired.
nutritional information:      calories: 308      fat: 11 gr      carb: 55      protein: 7 gr    
 
 
 
 
 
Lunch
Squash and Cauliflower Soup
serves 2 ~ $1.75 per serving
This is a light but also filling lunch or snack and cauliflower is in season right now. It's pretty low in calories and not very expensive. I've been known to eat the whole batch, is what I'm saying! I like to add some cayenne and crushed red pepper flakes, but, as is true of most things in life, heat is optional ... add as much or little as you like. 
ingredients
  • 1 1/2 cup peeled and chopped zucchini and/or summer squash ($1.20)
  • 1 1/2 cup chopped cauliflower ($1.00)
  • 1 cup peeled and chopped apple ($1.00)
  • 1/4 cup olive oil, or any one of your favorite oils ($.20)
  • 1 tablespoon chopped onion ($.10)
  • 1 teaspoon garlic powder
  • 1/2 teaspoon cumin
  • 1/4 teaspoon cayenne powder
  • 1 teaspoon salt, or to taste
  • 1/2 teaspoon pepper, or to taste

directions
  • Place all ingredients in high powered blender and process for a minute or two until very smooth and creamy. 
  • Add a drizzle of your favorite oil and some crushed red pepper flakes.




 
nutritional information:      calories: 390          fat: 32 gr         carbs: 54        protein: 5  
 
 
 
 
 
 
 
 
Dinner
Spring Noodles
serves 2 ~ $1.98 per serving


  • 2 medium zucchini, noodled ($2.30)
  • 1 medium onion, chopped ($.05)
  • 1/2 lb baby snap peas ($.80)
  • 1 carrot, grated ($.10)
  • 2 tablespoons olive oil ($.20)
  • 2 tablespoons agave ($.20)
  • 2 tablespoons apple cider vinegar ($.20)
  • 2 cloves garlic, pressed ($.10)
  • 1/4 teaspoon salt
  • 1/4 teaspoon pepper
  • 1 teaspoon red pepper flakes
noodled verb: to improvise, experiment, or think creatively; to make or devise freely as an exercise or experiment
 
I used to think breaded and fried was the only way to eat zucchini. Now, I'm totally into raw zucchini noodles. They're so easy to make and have a wonderful but mild flavor of their own, so they work well with just about everything. 
Make noodles out the zucchini with a spiralizer, grater, or with a vegetable peeler. Toss the noodles together with the whole snap peas, chopped onion, and grated carrot. In a small cup, whisk together the oil, agave, vinegar, garlic, salt, pepper, and red pepper flakes. Toss with the noodles until coated. 
These can be served as is, or marinated for an hour or so, or gently dehydrated for a bit.

 
nutritional information:      calories: 343      fat: 14 gr      carbs: 46 gr      protein: 10 gr
 
 
 
 
 
 Dessert
Lemon Poppy Seed Ice Cream with Strawberry Sauce
serves 2 ~ $1.10 per serving




ingredients
  • 4 bananas, sliced and frozen ($.60)
  • juice and zest of one lemon ($.69)
  • 1 tablespoon poppy seeds ($.30)
  • 1 cup strawberries ($.45)
  • 1 tablespoon agave ($.10)
  • 2 tablespoons chopped walnuts ($.15)
  • pinch salt

Banana ice cream is wonderful.  And it's amazingly simple to make with just a food processor.

The strawberry sauce should be made first and set aside. In a bullet type blender, puree the strawberries and agave until very smooth.

In a food processor fitted with an "S" blade, process the frozen bananas and lemon juice and zest until creamy like soft serve ice cream. It can take a bit of prodding and scraping to get the bananas going in the food processor, but it's worth it. Once creamy, add the poppy seeds and give a whir or two to incorporate.

Serve with the strawberry sauce and walnuts. 
 
nutritional information:       calories: 345      fat: 6 gr      carbs: 77 gr      protein: 5 gr
 
 
 
Total cost for the day: $6.11
total calories: 1,386
total fat: 63 gr
total carb: 232 gr
total protein: 27 gr
 




j

Raw Food Recipe Menu: July 4, 2016





 
Happy, happy 4th!! I hope you're enjoying your holiday with lots of good food, friends, family, and good times. The 4th, to most people, represents "freedom" and "independence." What would you like to be free or independent of this summer or this year? Now? 

  
Breakfast 
Strawberry Blue Concrete
serves 2 ~ $1.45 per serving



  • 3 bananas, sliced and frozen ($.60)
  • 1 1/2 cups strawberries, frozen ($1.69)
  • 1/2 cup blueberries, frozen ($.60)
  • stevia and/or agave, to taste

A "concrete" is a very thick shake ... thick enough to have to eat it with a spoon. And this is a fun and tasty breakfast or treat for anyone.

In a food processor fitted with an "S" blade, process the frozen bananas until creamy. Add water as needed until the mixture is a thick, soft serve ice cream consistency. Add about half the frozen strawberries and process again until smooth. Add a couple droppers of stevia and/or agave, until you like the level of sweetness. You may not need any sweetener at all if you use very ripe bananas.

Spoon out and set aside about half the mixture. Then, add more frozen strawberries to what remains, and process again until smooth. Spoon out and set aside about half of this mixture, as well. Finally, add the frozen blueberries to what is left and process again until smooth.

Layer the different mixtures in a glass. And don't forget a spoon!


nutritional information:      calories: 262      fat: 1 gr      carbs: 65 gr      protein: 3 gr


Lunch
Strawberry Cauliflower Salad
serves 2 ~ $2.75 per serving



This salad is a bit on the sweet side and I've even had it for breakfast. The nutrition in here is just off the charts, especially with the cauliflower rounding it out. Lots of vitamin C, vitamin K, etc. A few chopped almonds on top would be nice, too. That's usually how I eat this, but must have forgotten them for the photos!

ingredients, salad
  • 6 cups romaine lettuce, chopped ($1.20)
  • 2 cups sliced strawberries ($2.00)
  • 1 1/2 cups chopped cauliflower ($1.00)
  • 1 small white onion ($.10)

ingredients, dressing
  • 1 cup strawberries ($1.00)
  • 1 tablespoon chopped onion
  • 1 teaspoon chopped garlic
  • 1/4 cup balsamic vinegar ($.20)
  • 1 teaspoon dried basil or 1 tablespoon fresh
  • 1 teaspoon dried oregano or 1 tablespoon fresh
  • 3 tablespoons agave
  • 3 tablespoons olive oil
  • 2 droppers stevia
  • 1 teaspoon salt, or to taste
  • 1/2 teaspoon pepper, or to taste

directions
  • Arrange the salad ingredients on a plate.
  • In a blender, puree the dressing ingredients until very smooth.
  • Add cracked black pepper and salt to taste.




nutritional information:       calories: 257       carbs: 35       fat: 21       protein: 10



Dinner
Blueberry Salad
serves 2 ~ $2.00 per serving



ingredients
  • 1 cup blueberries, dried ($1.00)
  • 1 head romaine ($1.29)
  • handful kale ($.50)
  • 1 medium onion, divided
  • 1/2 cup blueberries, fresh ($.50) 
  • 2 tablespoons olive oil ($.20)
  • 2 tablespoons coconut nectar or other liquid sweetener ($.40)
  • 1 tablespoon apple cider vinegar ($.10)
  • salt and pepper to taste

Blueberries dry to a wonderful raisin like texture, becoming sweeter and even more flavorful. Care must be taken to not over dry them as they get too hard. Just put a cup of blueberries in the dehydrator for several hours until dry but still chewy.

The salad is just a simple one of romaine, a bit of kale, chopped onions, and dried blueberries. Reserve a tablespoon of chopped onion to go into the dressing.

The dressing is made with the onion, a half cup of fresh blueberries, the olive oil, coconut nectar, and vinegar. Puree all ingredients in a blender until smooth. This works best with a bullet type blender. Most blenders have a blade assembly that's compatible with canning jars. Just unscrew the blade assembly from the carafe and attach to a small mouth canning jar. The pint jars are perfect for small jobs like this.

 Also, a larger batch of dressing can be made, just double or triple the recipe. Store in the refrigerator for up to a week.

 


nutritional information:       calories: 289       fat: 14 gr       carbs: 42 gr       protein: 4 gr




Dessert
Blueberry Fool
serves 4 ~ $.62 per serving

ingredients
  • 1 cup nuts (cashews) ($1.00)
  • 2 ripe bananas ($.30)
  • juice of 1 lemon ($.69)
  • pinch of salt
  • 1/2 cup water for blending, as needed
  • 4 ounces blueberries, frozen and thawed ($.50)

  • whole blueberries
  • walnuts
  • agave

I was looking for ways to cut some of the fat in regular nut yogurt and decided to use ripe bananas and nuts in about equal amounts. This worked out wonderfully and as a bonus, eliminated the need for more sweetener.

A "fool" is basically a yogurt dish layered parfait style. Greek yogurt, which is very thick, is traditionally used. This yogurt isn't that thick as I've made it here, but could easily be thickened by draining some of the liquid through cheesecloth. 

In a blender, puree the bananas until very smooth. Add the nuts (I used cashews) and lemon juice and about a half cup water for blending. Puree on high for several minutes, until smooth and creamy. Refrigerate for at least a few hours. It will thicken quite a bit as it chills.

To make the "fool," take half the yogurt and puree with a handful of blueberries. In each serving bowl, put a spoon of regular yogurt and another of blueberry yogurt, add a few whole blueberries to the top. Garnish with a couple chopped walnuts and a drizzle of agave, if desired.


nutritional information:       calories: 268      fat: 38 gr      carbs: 24 gr      protein: 5 gr






Total cost for the day: $6.82
total calories: 1,076
total fat: 72 gr
total carb: 166 gr
total protein: 21 gr
That's a little light on calories, but it's also kind of light on the cost so if you're still hungry have a big slice of lemon cherry cheesecake!


Lemon Cherry Cheesecake
serves 8 - $1.50 per serving

 This cheesecake recipe is from my Spring Raw book, available over there on the side. It's a refreshing dessert that tastes great anytime, but also goes over well at get togethers and holidays

crust
  • 1 cup almonds ($2.00) 
  • 1 cup dates ($2.00)
  • pinch salt

filling
  • 2 cups almonds, soaked and (optionally) blanched ($4.00)
  • 1/4 cup lemon juice ($.40)
  • 1/2 cup agave ($1.60)
  • 1 teaspoon vanilla
  • pinch salt
  • 1/2 cup water for blending

topping
  • 1/2cup cherries ($.40)
  • 1/2 cup dates ($1.00)
  • 2 tablespoons lemon juice ($.40)
  • 1/4 cup whole cherries ($.20)


In a food processor fitted with an “S: blade, process the almonds until coarsely ground. Add the dates and process until the mixture sticks together. Press into the bottom and up the sides of an eight inch springform pan.


For the filling, in a food processor fitted with an “S: blade, process the soaked almonds until finely ground. Add the lemon juice, agave, vanilla, and salt and process, using additional water as necessary. Pour into the prepared crust and smooth. Cover and freeze until firm

In a bullet type blender, process the cherries, dates, and lemon juice until very smooth. Stir in the whole cherries and spread over the top of the frozen pie. Cover and freeze again until firm.

To serve, remove from freezer about twenty minutes beforehand and allow the pie to thaw slightly before cutting and serving.


nutritional information:       calories: 343       fat: 21 gr       carb: 30 gr       protein: 6 gr 





j

World film project: Pakistan

Thanks to ambyr's rec, we watched Dukhtar ['Daughter'], (2014, directed Afia Nathaniel).

ambyr described this very well: it does include misogyny and violence, but ultimately it's a hopeful film. The film feels almost like a stage play; it is almost entirely about the characters, a mother trying to save her young daughter, and the roadster who reluctantly helps them. The camera doesn't dwell either on the beautiful scenery (there are mountains in the background, but no gorgeous cinematic shots) or on the violence; there are quite a few shootings in the film, but it's never gory because it's not about gun porn, it's about trying to escape from that violent world of gang / tribal violence. Quite a bit of it is filmed in shaky-cam style as if it were just incidental video of people's lives.

The characters are all really vivid, and I cared about them a lot, partly because the film is so careful to avoid piling on the drama. The tribal enforcers who go around shooting almost-random people in order to make people fear them are squalid, not glamorous. The elder who is desperate enough to sell his 10-year-old daughter for protection is basically pathetic rather than evil. The main character, Samiya Mumtaz' Allah Rakhi is beautiful and brave, but not really a heroine, she's desperate and runs away with her daughter with almost no plan for how they're going to survive. In other words she's really plausible for a barely literate woman married at 15 and sent to a remote, very patriarchal village in the mountains.

The romance between Allah Rakhi and Sohail is likewise really understated. He's not a white knight saving the princess, and in fact they even joke about how much he doesn't fit that romantic stereotype. He's a troubled person who has survived and escaped from the Taliban training camps, and he doesn't really want to get involved but can't just abandon a desperate mother and daughter to their fate. They have a certain amount of tenderness, but don't instantly fall in love and it's not clear whether their relationship will last, or whether it will end up being romantic or more friend-based. I also really liked that the dashing, handsome man who is avuncular with the kid and flirts with the mother in a rather aggressive way turns out to be a bad guy, not the love interest.

The ending is really odd. The credits just happen in the middle of a desperate car-ride taking the heroine to hospital bleeding from a gunshot wound. I think we're meant to infer that she survives but it's really not clear.

Next up: Nigeria, our first African country. Any recommendations of Nigerian films? Ideally from the 21st century, and not primarily about violence or depressing real-world history.

comments



  • world film project

j

World film project: Nigeria

Nobody had any recs for Nigeria, so we poked around a bunch of internet best of lists and came up with Lionheart, (2018, dir Genevieve Nnaji), which turned out to be a great choice.

Lionheart is about a young business woman, Adaeze, who has to overcome sexism and save her father's struggling transport business. The director, Nnaji, also plays the title role and does a brilliant job. What I particularly loved about this film was that it undermined my genre expectations of feel-good feminist films. Adaeze doesn't have to outsmart and triumph over the sexist men, she has to learn to collaborate with people different from herself. And the company doesn't win by beating its rivals but by conducting a merger that at the start seemed unthinkable, requiring cooperation between her Igbo, Christian family and some Hausa (I think?) Muslims.

In particular, the eccentric uncle who is inexplicably appointed as acting MD when everybody knows it should have been Adaeze turns out to have some key strengths. He is in fact only annoying, and not a jerk. His people skills and intuition perfectly complement Adaeze's business acumen. (And how nice to have a female lead be the excessively competent and rational one!)

Adaeze does experience some sexism, particularly creepy men who expect sexual favours in return for investment in the business. But most of the antagonists are just nasty in a gender neutral way, like they want to sell the business to a conniving rival for quick money.

Anyway that was a really sweet date-night movie and I do feel our film project is back on track

Any recs for Bangladeshi films? We are most excited about 21st century films not primarily about violence or depressing real-world history.

comments



  • world film project

j

Boots. Mended. We’ll see how the patches hold up. Now I just need to acquire a sufficiently long raincoat.

View on Instagram https://ift.tt/2mPe4Ss




j

I still always confuse June and July

Ugh, well, I still didn't finish the video I mentioned last post (it is just a video version of some of my chess papers from this last SIGBOVIK; don't get too excited), but I made a lot of progress on it this weekend. This one has a lot of custom software, some of which is hours of work for like 10 seconds on-screen. This approach is "fun" but not efficient. At least I have a good approach to the video so it's just a matter of turning the crank now.

I finished The Messenger. My verdict is that it is good. Some aspects of it are fantastic (8-bit graphics and writing) and most are very good, but the game was not very hard and the "metroidvania" aspects of it were mostly about retreading ground between distant teleports. I managed to get all the achievements, which I don't usually do, but there was just like one hard one left.

Speaking of hard ones, next up is/was Dead Cells, whose verdict is great. This is a grindy (lots of unlockables/upgrades) roguelike platformer with really excellent controls and "flow", almost feeling like a twitchy fighting game at times. It's no "Spelunky" or even "Crypt of the Necrodancer"; what set those apart for me is how the design of the random level generation really tended to create these interesting situations and puzzles. But this game has an impressive amount of content (the graphics and the sheer variety of weapons/powerups both stand out to me) and is just really fun to play, except when you die (which is always). Just now I finally beat the game on "Hard" (second boss cell) so it may be time to retire. I bought like 9 more games on the Steam summer sale, after all!




j

In which I am still a grade school child just trying to make this adult thing work

I’ve been working a regular, 40-hour week since December now. Before that, I had Fridays “off”–I worked on client work, yes, but I also ran all the errands and did all the chores, leaving me both weekend days pretty much to myself.   What I’ve discovered, in the past three months, is that I resent […]



  • Life and relationships

j

Мексиканская авиакомпания полностью перешла на Sukhoi SuperJet 100

Мексиканская авиакомпания InterJet полностью перешла на использование только российских самолетов Sukhoi SuperJet 100 (SSJ-100). По мнению руководства InterJet, SSJ-100 идеально подходят для перевозок в условиях пандемии коронавируса. В настоящее время российские самолеты обслуживают шесть оставшихся маршрутов.




j

Wimpie Nortje: Database migration libraries for PostgreSQL.

It may be tempting at the start of a new project to create the first database tables manually, or write SQL scripts that you run manually, especially when you first have to spend a significant amount of time on sifting through all the migration libraries and then some more to get it working properly.

Going through this process did slow me down at the start of the project but I was determined to use a migration tool because hunting inexplicable bugs that only happen in production just to find out there is a definition mismatch between the production and development databases is not fun. Using such a tool also motivates you to write both the setup and teardown steps for each table while the current design is still fresh in your mind.

At first I considered a standalone migration tool because I expect them to be very good at that single task. However, learning the idiosyncrasies of a new tool and trying to make it fit seamlessly into my development workflow seemed like more trouble than it is worth.

I decided to stick with a Common Lisp library and found the following seven that work with PostgreSQL and/or Postmodern:

I quickly discounted Crane and Mito because they are ORM (Object Relational Mapper) libraries which are way more complex than a dedicated migration library. Development on Crane have stalled some time ago and I don't feel it is mature enough for frictionless use yet. Mito declares itself as being in Alpha state; also not mature enough yet.

I only stumbled onto cl-mgr and Orizuru-orm long after making my decision so I did not investigate them seriously. Orizuru-orm is in any case an ORM which I would have discounted because it is too complex for my needs. CL-mgr looks simple, which is a good thing. It is based on cl-dbi which makes it a good candidate if you foresee switching databases but even if I discovered it sooner I would have discounted it for the same reason as CL-migrations.

CL-migrations looks very promising. It is a simple library focusing only on migrations. It uses clsql to interface with the database which bothered me because I already committed to using Postmodern and I try to avoid adding a lot of unused code to my projects. The positive side is that it interfaces to many different databases so it is a good candidate if you are not committed to using Postmodern. It is also a stable code base with no outstanding bug reports.

The two projects I focused on was Postmodern-passenger-pigeon and Database-migrations because they both use Postmodern for a database interface.

Postmodern-passenger-pigeon was in active development at the time and it seemed safer to use than Database-migrations because it can do dry runs, which is a very nice feature when you are upgrading your production database and face the possibility of losing data when things go awry. Unfortunately I could not get it working within a reasonable amount of time.

I finally settled on Database-migrations. It is a small code base, focused on one task, it is mature and it uses Postmodern so it does not pull in a whole new database interface into my project. There are however some less positive issues.

The first issue is a hindrance during development. Every time the migrations ASDF system (or the file containing it, as ASDF prefers that all systems be defined in a single file) is recompiled it adds all the defined migrations to the migrations list. Though each one will only be applied once to the DB it is still bothersome. One can then clear the list with (setf database-migrations::*migrations* nil) but then only newly modified migration files will be added. The solution then is to touch the .asd file after clearing the migrations list.

The second negative point is quite dangerous. The downgrade function takes a target version as parameter, with a default target of 0. This means that if you execute downgrade without specifying a target version you delete your whole database.

I am currently using Database-migrations and it works well for me. If for some reason I need to switch I will use cl-migrations.

Using Database-migrations

To address the danger of unintentionally deleting my database I created a wrapper function that does both upgrade and downgrade, and it requires a target version number.

Another practical issue I discovered is that upgrades and downgrades happen in the same order as they are defined in the migration file. If you create two tables in a single file where table 2 depends on table 1 then you can not revert / downgrade because Database-migrations will attempt to delete table 1 before table 2. The solution here is to use the def-queries-migration macro (instead of def-query-migration) which defines multiple queries simultaneously . If you get overwhelmed by a single definition that defines multiple tables the other option is to stick with one migration definition per file.




j

Leo Zovic: Zippers And Clj

So recently, I had to use zippers at work. Specifically, the Clojure implementation. There were some close-to-arbitrary transformations I needed to do with some close-to-arbitrary trees and it turned out that zippers were more efficient than the alternatives1.

Using them this way, combined with the general state of the world and my free time, finally tipped me into doing some more Common Lisp development. Before, I go any further, let me be clear about something.

I Like Clojure

Seriously.

Its logo is up top in the language bar, I was one of the inaugural members of the Toronto Clojure User Group, I recommend it as a first lisp you should learn, and have for about six years now. I'm also painfully aware of the shortcomings of Common Lisp, and make no excuses for them.

However.

  • I don't like the JVM. It's slow as balls, its' deployment options are less than ideal for my purposes, its' error system is at best useless, and Clojure without it is unlikely.
  • Clojurescript build incompatiblities are, if anything, worse2.
  • I don't like the underlying licensing decisions.

These are deep reasons to stay away. They're not the sort of thing I can paper over with a library or two. Fixing them would mean a superhuman amount of work poured into the underlying technical and social infrastructure, and I'm not into it. I wouldn't be into it even if the community was interested in heading that way, and near as I can tell, they're not particularly.

Whether or not I think you should learn Clojure as your first3 lisp, it definitely wasn't my first lisp. The more uniform, mostly-better-thought-out interface, lack of historical baggage and functional data structures are not enough to pull me all the way over.

It is enough for me to start plotting a smash-and-grab of as much of the stuff I like as I can carry. Which is exactly what clj represents. As of this writing, it defines and exports exactly four symbols: if-let, when-let, -> and ->>. This is a tiny beginning of the list, and I fully plan to put something more substantial together using cl-hamt, named-readtables, test-utils and possibly optima. Stay tuned to that repo if you're interested, but it's not the focus today.

cl-zipper

The thing that percipitated this thought was having used the Clojure Zipper implementation. So, obviously, this is something I want next time I need to manipulate trees in Common Lisp. The paper is here, and unless you have a terminal phobia of datastructures4, you should go read it. It's six pages, they're light, and one of them taken up by the intro and references.

The operations defined in the paper are left, right, up, down, insert_right, insert_left, insert_down and delete. There's a few conveniences defined for the Clojure version, and I've implemented some of my own stuff too. Lets go through the main file in almost-literate style.

First up, we have constructors.

(defstruct path
  (left) (path) (right))

(defstruct loc
  (node)
  (path)

  (fn-branch?)
  (fn-children)
  (fn-make-node))

;;;;;;;;;; Constructors
(defun zipper (branch? children make-node root)
  (make-loc
   :node root
   :fn-branch? branch? :fn-children children :fn-make-node make-node))

(defmethod make-zipper ((thing list))
  (zipper #'listp #'identity (lambda (node children) (declare (ignore node)) children) thing))

(defun make-node (zipper children)
  (funcall (loc-fn-make-node zipper) zipper children))

You can see influence from both clojure.zip and the paper here. I'm taking the lead from the paper by explicitly separating the path triple our from the loc definition. However, I'm not explicitly defining my own type tree the way that Huet does. Instead, I'm going to be dealing with assorted lisp trees. These could be implemented as lists, vectors, hashes, or any number of other formats. I'm going to implement a few type-distpatching built-ins, including the make-zipper list method above, but the basic zipper function just needs to take an interface as input in the form of branch?, children and make-node arguments. This is the same solution that the Clojure implementation went with, and I see no reason to go a different way. The only material difference is that theirs uses the Clojure metadata system, while I explicitly define slots in the loc structure.

Now that we can construct, we need to be able to select.

;;;;;;;;;; Selectors
(defun branch? (zipper) (funcall (loc-fn-branch? zipper) (loc-node zipper)))
(defun children (zipper)
  (funcall
   (loc-fn-children zipper)
   (loc-node zipper)))
(defun node (zipper) (loc-node zipper))
(defun path (zipper) (loc-path zipper))

(defun lefts (zipper)
  (when (loc-path zipper)
    (reverse (path-left (loc-path zipper)))))

(defun rights (zipper)
  (when (loc-path zipper)
    (path-right (loc-path zipper))))

The basic navigation is four functions; down, up, left and right

;;;;;;;;;; Navigation
;;;;;;;;;;;;;;; Basic navigation
(defun down (zipper)
  (when (children zipper)
    (let ((fresh (copy-loc zipper)))
      (setf (loc-node fresh) (first (children zipper))
	    (loc-path fresh)
	    (make-path
	     :left nil
	     :path (loc-path zipper)
	     :right (rest (children zipper))))
      fresh)))

(defun up (zipper)
  (when (path zipper)
    (let ((fresh (copy-loc zipper)))
      (setf (loc-node fresh)
	    (make-node
	     zipper (append
		     (reverse (path-left (path zipper)))
		     (cons (loc-node zipper)
			   (path-right (path zipper)))))
	    (loc-path fresh) (path-path (path zipper)))
      fresh)))

(defun left (zipper)
  (when (and (path zipper) (path-left (path zipper)))
    (let ((fresh (copy-loc zipper)))
      (setf (loc-node fresh) (first (path-left (path zipper)))
	    (loc-path fresh)
	    (make-path
	     :left (rest (path-left (path zipper)))
	     :path (path-path (path zipper))
	     :right (cons (loc-node zipper) (path-right (path zipper)))))
      fresh)))

(defun right (zipper)
  (when (and (path zipper) (path-right (path zipper)))
    (let ((fresh (copy-loc zipper)))
      (setf (loc-node fresh) (first (path-right (path zipper)))
	    (loc-path fresh)
	    (make-path
	     :left (cons (loc-node zipper) (path-left (path zipper)))
	     :path (path-path (path zipper))
	     :right (rest (path-right (path zipper)))))
      fresh)))

The main difference between this and the paper is that I've chosen nil as my Top representation, which lets me pull the trick of using when to check for the presence of a path, and its' non-Top-ness at the same time.

The bad news is that since Common Lisp doesn't have pervasive functional data structures, I have to explicitly copy locs while moving through a tree. The good news is that the copy is fairly light weight. Effectively, I'm copying out a set of 5 pointers, and could get that down to 3 by defining an intermediate struct.

Hm.

Which I probably should do. Note to self.

Out of those, we get three compound navigation functions. With more probably coming soon. Specifically, I found find useful for the work I did. It's easily externally definable, but would be even easier to bundle along. The ones I've already implemented are root, leftmost and rightmost.

;;;;;;;;;;;;;;; Compound navigation
(defun root (zipper)
  (if-let (z (while zipper #'up))
    (node z)))

(defun leftmost (zipper) (while zipper #'left))

(defun rightmost (zipper) (while zipper #'right))
Each of these involve an intermediate call to while. Which isn't a generic macro; it's a function defined in util.lisp
...
(defun until (zipper f)
  (let ((z zipper))
    (loop for next = (funcall f z) while next
       when next do (setf z next))
    z))
...
As you can see, all it does is repeatedly call a given function on a zipper and return the last non-nil loc result. That's loc, not node, so this doesn't run into the usual Common Lisp conflict of "Did you fail to find a thing, or find the element nil?".

That's the traversals done. Next up, we've got modification, without which this library is fairly useless. The basics are replace, delete and the insert/child twins.

;;;;;;;;;; Modification
(defun replace (zipper node)
  (let ((fresh (copy-loc zipper)))
    (setf (loc-node fresh) node)
    fresh))

(defun delete (zipper)
  (when (path zipper)
    (let ((fresh (copy-loc zipper))
	  (fresh-path (copy-path (loc-path zipper))))
      (cond ((rights zipper)
	     (setf (loc-node fresh) (pop (path-right fresh-path))
		   (loc-path fresh) fresh-path))
	    ((lefts zipper)
	     (setf (loc-node fresh) (pop (path-left fresh-path))
		   (loc-path fresh) fresh-path))
	    (t (setf (loc-path fresh) (path-path fresh-path))))
      fresh)))

(defun insert-child (zipper node)
  (replace
   zipper
   (make-node
    zipper
    (cond ((not (branch? zipper))
	   (list node (node zipper)))
	  ((children zipper)
	   (cons node (children zipper)))
	  (t (list node))))))

(defun append-child (zipper node)
  (replace
   zipper
   (make-node
    zipper
    (cond ((not (branch? zipper))
	   (list (node zipper) node))
	  ((children zipper)
	   (append (children zipper) (list node)))
	  (t (list node))))))

(defun insert-left (zipper node)
  (let ((fresh (copy-loc zipper))
	(fresh-path (copy-path (loc-path zipper))))
    (push node (path-left fresh-path))
    (setf (loc-path fresh) fresh-path)
    fresh))

(defun insert-right (zipper node)
  (let ((fresh (copy-loc zipper))
	(fresh-path (copy-path (loc-path zipper))))
    (push node (path-right fresh-path))
    (setf (loc-path fresh) fresh-path)
    fresh))

The paper defines an insert_down function. It fails on a Leaf node, and otherwise inserts a singleton branch at the given location. The insert/append child functions above also insert nodes at a lower level at the current loc. They give you a choice about whether to insert the new node as the leftmost or rightmost child, and additionally succeed on Leaf nodes by including the leaf value as a child of the new branch.

There are, thus far, three compound modification functions; edit, splice-left and splice-right.

(defun edit (zipper f &rest args)
  (replace zipper (apply f (node zipper) args)))

(defun splice-left (zipper node-list)
  (reduce #'insert-left node-list :initial-value zipper))

(defun splice-right (zipper node-list)
  (reduce #'insert-right (reverse node-list) :initial-value zipper))

edit takes a function instead of a new node, and replaces the node at loc with the result of running that function on the existing node. The splice-* twins are fairly self-explanatory; they're like insert-left/insert-right, but work on multiple nodes rather than single ones.

I haven't yet implemented next, prev and remove because these might relate to the different representation of the traversal end? state. The reason for this seems to be that next/prev/remove assume a depth-first traversal. The reason I'm being weasely here is that I haven't thought about it hard enough to be sure that the end? marker is really necessary. It also seems odd to privilege depth-first over breadth-first traversals; ideally, I think you'd want to be able to support either. Possibly interchangeably.

Minor Housekeeping

That wraps it up for this edition. My immediate intention is to do more work on the cl-zipper and clj libraries, as well as that game I mentioned last time. Ideally, I'd like to up my blogging output too. Probably not to the same volume as I had at my peak, but it was definitely helpful to keep some sort of written journal around for a while. The current state of the world is, hopefully, going to make it easy for me to get more programming time in. All things considered, I'd count that as a win.

  1. Although admittedly, it does require me to explain the concept of zippers to a few other people for maintenance purposes. So ironically, this adds complexity despite being much more technically elegant than other options.
  2. There's a reason that langnostic.js is a raw JS file, rather than compiled from clojurescript source, and that reason is like 90% that the compilation process is nontrivial to set up.
  3. "First", not "only". You can probably make educated guesses about which other ones I think you should learn.
  4. In which case, why are you here? This blog could kill you accidentally with an errant click or two. You should probably just go do something else.




j

Jack-in-the-pulpit

Jack-in-the-pulpit, another native with a great name.  And such an unusual appearance. The roots are apparently edible, but only with some serious treatment — you have to let them dry for at least six months, then roast them, then grind them to mix in with flour…otherwise, you can get severe irritation of the mouth. I’m having … Continue reading "Jack-in-the-pulpit"




j

The Conjuring House Tour




j

Topo Designs Packable Ultralight Jacket




j

Japan cinema






j

2017 Best Music: Jacques Greene

musicisart magazine 2017 Best Music: Jacques Greene

Jacques Greene is blessed with the ability to create music that not only makes you feel good but makes you want to move. This spring Jacques Greene released his debut album “Feel Infintite” on March 8th, 2017 via LuckyMe Records. The Montreal native has always had a knack for being a DJ and music tastemaker mixing artists and beats that were energetic and unique. By […]

The post 2017 Best Music: Jacques Greene appeared first on musicisart magazine.




j

SAN HOLO – THE FUTURE (FEAT. JAMES VINCENT MCMORROW)

musicisart magazine SAN HOLO – THE FUTURE (FEAT. JAMES VINCENT MCMORROW)

Producer San Holo, AKA Sander van Dijck, creates ballad like electronic music that brings a listener on a journey full of emotion. San Holo is most known for his hit single ‘Light‘, which reached over 151 thousand likes on Soundcloud. SAN HOLO – THE LIGHT || San Holo’s latest single ‘The Future‘ features the smooth Irish vocals of […]

The post SAN HOLO – THE FUTURE (FEAT. JAMES VINCENT MCMORROW) appeared first on musicisart magazine.




j

Tycho :: Japan

musicisart magazine Tycho :: Japan

Tycho is back with a new single titled “Japan”.   Tycho :: Japan (Original Version) The original version features female vocalist x Saint Sinner, who expressed she wrote the lyrics after experiencing an intense relationship with two people: a man and a woman. While the instrumentals of electric guitars shimmer underneath her vocals, the feelings of […]

The post Tycho :: Japan appeared first on musicisart magazine.




j

I swear Australia is just filled with real life pokemon

I swear Australia is just filled with real life pokemon



View Comic!







j

[tasty review] United Tastes of America by Gabrielle Langholtz, Jenny Bowers, and DL Acken

  Feeling a little peckish? What’s your pleasure? If you’re craving something savory, perhaps we should zip on over to Illinois for some deep dish pizza and pierogies. Something a little more substantial? Well, we could feast on chicken fried steak in Oklahoma and bison burgers in Wyoming, before topping everything off with a platter … Continue reading [tasty review] United Tastes of America by Gabrielle Langholtz, Jenny Bowers, and DL Acken




j

new art crush: jane newland

  I recently “discovered” UK illustrator Jane Newland while browsing images online. Safe to say that 80% of the time, when something different/exceptional/beautiful stops me in my tracks, the artist turns out to be British. ????         Jane lives and works in Norwich (the most complete Medieval city in the UK), which … Continue reading new art crush: jane newland




j

[review + recipe] On Wings of Words by Jennifer Berne and Becca Stadtlander

  Each bird, bee, blossom, butterfly — was a source of joy and wonder for young Emily Dickinson. In this beautiful new picture book biography, aptly illustrated with a butterfly motif, we witness her singular metamorphosis from a keenly observant child into one of the most original and innovative poets in American literature. On Wings … Continue reading [review + recipe] On Wings of Words by Jennifer Berne and Becca Stadtlander




j

cookie jar capers

“A balanced diet is a cookie in each hand.” ~ Barbara Johnson   Did YOU take the cookies from the cookie jar? Who, me? Yes, you! Couldn’t be. Then, who?   Can’t fool me. I see crumbs on your face. ???? Don’t blame you, though. A cookie, at any time of day, always makes things … Continue reading cookie jar capers




j

Reflections on the judicial system in Malta

One is often surprised when one reads about the trials and their outcome in Malta. What is most astonishing is how long time it takes in Malta between a crime is committed and the perpetrator’s identity is known to the police and the trial takes place.

The Court House in Valletta, Malta
In today’s The Times one can read about a hold-up that had taken place in 2007. Obviously a firearm was used and goods of substantial value were taken. If the police got to know about the robber’s identity in 2011 one can understand why the trial took place in February 2012, but that seems not to be the case.

One of the most outrageous cases is the one regarding a man, who was jailed in April 2011 and sentenced to 29 years after he was found guilty of the murder of a prostitute who was killed in 1999. The circumstances around the killing and the man who was later convicted were known to the police in a much earlier stage. 

One can reflect in these cases on what the then suspected men did during the time between the crimes and the trials. Were they still on the loose or were they kept in custody without trial for all these years, probably not the latter. One can also wonder how the murdered girl’s relatives felt. All their sorrow must have been experienced once more, especially as Maltese papers publish names and details and even the name of the community where they live.  It is also unfair to a suspect not to have his case tried; he might be innocent. Almost every week you can read about cases like these. 

The same, or even worse, goes for civil cases that can go on for much more than a decade to be ruled by a court.




j

The possibilites for a disabled person to enjoy Malta

Disabled people shall not visit Malta if they intend to see the islands and not just stay in their hotels. There is almost nothing done in Malta to help disabled people. The pavements mostly lack ramps and are far too high. The new buses are a little bit better than the old classical ones but not enough improvements have been made. When entering or leaving a bus, persons in wheelchairs cannot manage themselves but have to rely on helpful fellow passengers due to the fact that the bus is too high up from the street. That could be helped if the buses stop close to the pavements, but very often they stop one or two meters from the very high pavement.
The old classical type of bus no longer in use
There are very few shops with ramps, a fact that makes it almost impossible to visit shops if you are sitting in a wheelchair.
The pavements are, with very few exceptions, in a condition that makes it impossible to go by a wheelchair. The main exceptions in the Gzira, Sliema and S:t Julian’s area beeing, of course, The Strand and Tower Road as well as George Borg Oliver Road. In Marsaskala, Marsaxlokk and other towns by the sea with many tourists, there are also roads that are suitable for disabled people. BUT, how to get there?




j

The collapsed Maltese judicial system

It is obvious that the Maltese judicial system has totally collapsed. In todays The Times one can read of a man who has raped his nephew and niece and sexually abused their cousin when they were five, eight and thirteen years old. The abuses took place during several years until 2007. The father of the siblings reported this to the police 2007 and insisted that the police should take immediately action. The perpetrator, when then heard by the police, immediately admitted the acts and also showed the police videos that he previously had shown to his victims. The videos contained sexual actions the perpetrator had had with his wife. One can wonder why these terrible crimes not ended up in court until 2012! The man was this week sentenced to ten years in prison. What has happened since 2007? How have the victims and their families felt during this time? Is there any excuse for this failure of the judicial system? There is no wonder that the people in Malta has very low confidence in the judicial system and that so many people think that judges accept bribes; they are probably more interested in their own wellbeing than the one of people who have been abused. Those people are not abused only by a perpetrator but also by the judicial system. This is a shame on Malta and its (lack of ) functional judicial system.




j

A Maltese priest’s distorted view of the judiciary's role in society

In yesterdays The Times a Maltese priest, Mgr. Anton Gaucia, complains once more that a High Court in London a few weeks ago gave a sentence ruling that “the Catholic Church can be held liable for the wrongdoings of its priests”. Mgr. Gaucia have earlier, January 8 in Sunday Times, made the same complaint. Now Mgr. Gaucia also complains over the fact that a Mr. Justice in London has ruled that “the saying of prayers as part of the formal meeting of a council is not lawful”, adding that “there is no statutory power permitting the practice to continue”.
First things first; of course the Church shall be liable for what its employees/priests do in Alphain their capacity as priests. The children in these cases were in the care of a Catholic institution. I wonder what Mgr. Gaucia would say about if a municipal employee at a daycare sexually molest a child that the child’s parents left in its care. Of course, the municipality would be responsible for its negligence and for its failure to protect a child. The same goes of course for the Church. Mgr. Gaucia may of course, probably not being a father himself in the more down to earth sense, not understand what damage the Church and its priests done to these children. The people The Observer talked to in this matter in Malta all agree with The Observer and I think it would be wise of the Church to listen to the people in this.
Second; it might soon be time for priests like Mgr. Gauci and his colleagues to realize what century they live in. The time when Catholics ruled southern Europe is gone forever. There are Muslims, Hindus, Jews and many other people of different beliefs that have and are going to have positions in the society among which, of course, also positions in a council. Does Mgr. Gauci really mean that these people must attend Catholic or Protestant prayers? Or shall they leave when such prayer is to be said? Another possibility would of course be to have, say ten, different rooms where people of different beliefs could pray in accordance with such belief before the council meeting. Mgr Gauci, please grow up and realize what reality you live in.




j

Malta's judicial system once more

In todays The Times the public is given a good explanation why the Maltese courts do not have time for unimportant cases like murders, trafficking, rapes, smuggling of narcotics etc. The courts have far more important cases to deal with, namely cases of insulting. A circus agent felt insulted after being called a clown. This terrible crime was rather soon brought to court for judgment. AlphaThe Observer is confident that the public feel great gratitude that the legal system makes such wise priorities.




j

Again, the Maltese judicial system is proven to have collapsed and now it also seems ridiculous



Today one can read in The Times of a man being sentenced to one month in prison and fined 233€ for illegal gambling. The fantastic and almost unbelievable fact is that the crime was committed in 2001 and the man pleaded guilty in 2002. The man had to wait ten years to be punished for a crime he had admitted almost immediately! To make this even more surprising (well, maybe not so surprising; this is probably typically for the judicial system in Malta) the judge found that the prosecution had failed to prove the allegations against the man, but, since he had admitted the crime the judge had to find him guilty. The Observer sincerely hopes that the latter is not true. In most other countries, with a more sophisticated and functioning judicial system than Malta, an admission is not enough to prove that a person has committed a crime.  When famous murders occur, quite many people come to the police and plead guilty. This is a well-known fact among Alphacriminologists. Probably and hopefully The Times has not published full details about why the judge had to find the man guilty.






j

Kans op 2e golf, maar contactopsporing moet 2e lockdown vermijden: bekijk de beste fragmenten uit "Het coronadebat" - VRT NWS

  1. Kans op 2e golf, maar contactopsporing moet 2e lockdown vermijden: bekijk de beste fragmenten uit "Het coronadebat"  VRT NWS
  2. Het Corona Debat met Marc Van Ranst, Erika Vlieghe, Maggie De Block (Open Vld), Bart De Wever (N-VA) en anderen  De Morgen
  3. 'We moeten tijd winnen tot vaccin er is'  De Standaard
  4. Het grote coronadebat: “We moeten tijd winnen tot vaccin er is”  Het Belang van Limburg
  5. Hele verhaal bekijken via Google Nieuws












j

173 gestrande Belgen eindelijk thuis na quarantaine in Tenerife: “Regering liet ons aan ons lot over. We hebben twee maanden op ons terras moeten doorbrengen” - Het Laatste Nieuws

  1. 173 gestrande Belgen eindelijk thuis na quarantaine in Tenerife: “Regering liet ons aan ons lot over. We hebben twee maanden op ons terras moeten doorbrengen”  Het Laatste Nieuws
  2. 173 gestrande Belgen eindelijk thuis na quarantaine in Tenerife: “Regering heeft te weinig gedaan!”  Het Laatste Nieuws
  3. Na quarantaine in Tenerife: 173 Belgen eindelijk weer thuis  De Morgen
  4. Belgen die vastzaten op Tenerife charterden zelf vliegtuig naar huis  De Standaard
  5. West-Vlaming regelt repatriëring gestrande Belgen  Focus en WTV
  6. Hele verhaal bekijken via Google Nieuws