Space Antenna Hat

So I did the first Space Invader Hat, that I made a dozen pieces of and everybody was happy.  But there is always someone, who want something different.  In order to fulfil all needs brought towards me, I made this second hat.  And I want to share the pattern with you folks.  It is very similar to the original; only the middle part is changed.  However, I give you the full list of steps again, so you don’t have to switch between references.

Thanks to the awesome model modelling awesomely.

Thanks to the awesome model modelling awesomely.

Materials you need:

  • 3.5 mm double pointed needles (dpns) (or circulars for magic loop method)
  • 2 balls of yarn (I used Lana Grossa Cool Wool for that project, but any sports weight will do) in different colours (I will use the actual colours used here to explain the pattern).  You will only use up about half of the inserted colour (here: green).
  • stitch markers
  • tapestry needle
Closing in on the top.

Closing in on the top.

Abbreviations (a.k.a. stitches you should know):

  • k – knit
  • p – purl
  • ktbl – knit through back loops
  • k2tog – knit two together
  • stb – switch to black
  • stg – switch to green
Traditional Hipster Shot.

Traditional Hipster Shot.

Techniques you should know (because I will not explain them; there are already so many helpful videos and tutorials out there!):

  • intarsia
  • intarsia in the round
  • how to switch colours effectively horizontally and vertically

Pattern Note:

  • 2×2 rib: 2ktbl, 2p (throughout the round)
Mug shot with the invader

Mug shot with the invader

Steps:

  1. with black: cast on 120 stitches
  2. distribute stitches on needles (if you use dpns) as you like, join the round, being careful not to twist
  3. work 3 rows in 2×2 rib
  4. stg, repeat step 3
  5. stb, repeat step 3
  6. repeat step 4
  7. stb, k 3 rows
  8. stg, k 3 rows
  9. repeat step 7, k 3 more rows
  10. k48, stg, k3, stb, k18, stg, k3, stb, k48  (you start intarsia in the round for the end of the round)
  11. p48, stg, p3, stb, p18, stg, p3, stb, p48
  12. repeat step 10
  13. p51, stg, p3, stb, p12, stg, p3, stb, p51
  14. k51, stg, k3, stb, k12, stg, k3, stb, k51
  15. repeat step 13
  16. k51, stg, k18, stb, k51
  17. p51, stg, p18, stb, p51
  18. repeat step 16
  19. p48, stg, p24, stb, p48
  20. k48, stg, k24, stb, k48
  21. repeat step 19
  22. k45, stg, k9, stb, k3, stg, k6, stb, k3, stg, k9, stb, k45
  23. p45, stg, p9, stb, p3, stg, p6, stb, p3, stg, p9, stb, p45
  24. repeat step 22
  25. p45, stg, p3, stb, p3, stg, p18, stb, p3, stg, p3, stb, p45
  26. k45, stg, k3, stb, k3, stg, k18, stb, k3, stg, k3, stb, k45
  27. repeat step 25
  28. k45, stg, k3, stb, k6, stg, k3, stb, k6, stg, k3, stb, k6, stg, k3, stb, k45
  29. p45, stg, p3, stb, p6, stg, p3, stb, p6, stg, p3, stb, p6, stg, p3, stb, p45
  30. repeat step 28
  31. p51, stg, p3, stb, p12, stg, p3, stb, p51
  32. k51, stg, k3, stb, k12, stg, k3, stb, k51
  33. repeat step 31
  34. k 6 rows
  35. stg, k 3 rows
  36. stb, k 3 rows
  37. stg, (k13, k2tog) around, k 1 row, (k12, k2tog) around
  38. stb, (k11, k2tog) around, k 1 row, (k10, k2tog) around
  39. stg, (k9, k2tog) around, k1 row, (k3, k2tog) around
  40. stb, (k2, k2tog) around, k1 row, (k1, k2tog) around
  41. thread yarn twice through remaining stitches and pull tightly
  42. weave in ends
  43. set your intarsia straight
  44. block if wanted
  45. done!
And done!

And done!

Space Invader Hat

Years ago, I started these and gave them all around.  However, I never published a pattern for them.  With an upcoming move, I remembered that I promised someone to make them one and haven’t managed in five years (there are _good_ reasons for that, though).  Finally, I made another one and this time, I thought of writing things down.  So enjoy this little friend.  (I also plan on doing one with another space invader, so if you want a more iconic version, stay tuned.)

2014-08-06 19.39.43

Materials you need:

  • 3.5 mm double pointed needles (dpns) (or circulars for magic loop method)
  • 2 balls of yarn (I used Lana Grossa Cool Wool for that project, but any sports weight will do) in different colours (I will use the actual colours used here to explain the pattern)
  • stitch markers
  • tapestry needle

2014-08-06 19.40.11

Abbreviations (a.k.a. stitches you should know):

  • k – knit
  • p – purl
  • ktbl – knit through back loops
  • k2tog – knit two together
  • stb – switch to black
  • stg – switch to green

2014-08-06 19.38.36

Techniques you should know (because I will not explain them; there are already so many helpful videos and tutorials out there!):

  • intarsia
  • intarsia in the round
  • how to switch colours effectively horizontally and vertically

2014-08-06 19.39.06

Pattern:

  • 2×2 rib: 2ktbl, 2p (throughout the round)

2014-08-06 19.40.03

Steps:

  1. with black: cast on 120 stitches
  2. distribute stitches on needles (if you use dpns) as you like, join the round, being careful not to twist
  3. work 3 rows in 2×2 rib
  4. stg, repeat step 3
  5. stb, repeat step 3
  6. repeat step 4
  7. stb, k 3 rows
  8. stg, k 3 rows
  9. repeat step 7, k 3 more rows
  10. k48, stg, k3, stb, k3, stg, k3, stb, k6, stg, k3, stb, k3, stg, k3, stb, k48  (you start intarsia in the round for the end of the round)
  11. p48, stg, p3, stb, p3, stg, p3, stb, p6, stg, p3, stb, p3, stg, p3, stb, p48
  12. repeat step 10
  13. p51, stg, p3, stb, p3, stg, p6, stb, p3, stg, p3, stb, p51
  14. k51, stg, k3, stb, k3, stg, k6, stb, k3, stg, k3, stb, k51
  15. repeat step 13
  16. k54, stg, k3, stb, k6, stg, k3, stb, k54
  17. p54, stg, p3, stb, p6, stg, p3, stb, p54
  18. repeat step 16
  19. p48, stg, p24, stb, p48
  20. k48, stg, k24, stb, k48
  21. repeat step 19
  22. k48, stg, k6, stb, k3, stg, k6, stb, k3, stg, k6, stb k48
  23. p48, stg, p6, stb, p3, stg, p6, stb, p3, stg, p6, stb, p48
  24. repeat step 22
  25. p51, stg, p18, stb, p51
  26. k51, stg, k18, stb, k51
  27. repeat step 25
  28. k54, stg, k12, stb, k54
  29. p54, stg, p12, stb, p54
  30. repeat step 28
  31. p57, stg, p6, stb, p57
  32. k57, stg, k6, stb, k57
  33. repeat step 31
  34. k 6 rows
  35. stg, k 3 rows
  36. stb, k 3 rows
  37. stg, (k13, k2tog) around, k 1 row, (k12, k2tog) around
  38. stb, (k11, k2tog) around, k 1 row, (k10, k2tog) around
  39. stg, (k9, k2tog) around, k1 row, (k3, k2tog) around
  40. stb, (k2, k2tog) around, k1 row, (k1, k2tog) around
  41. thread yarn twice through remaining stitches and pull tightly
  42. weave in ends
  43. set your intarsia straight
  44. block if wanted
  45. done!

2014-08-06 19.39.33

Sunflower Felting Pins – Pattern

For the last election campaign, we needed small tokens to identify our candidates again.  This time I made felted pins in the shape of sunflowers.  And now that campaigning time is over, I want to share the pattern.

Materials needed

2014-07-22 15.59.24

  • Felting Mat
  • Scissors
  • Fine Felting Needle
  • Sewing Needle
  • Some Thread
  • Empty Pin
  • Yellow and Green Felt
  • Green Felting Wool

Steps

1. Cut out a small circle-ish shape from the green felt.

2. Cut out leaves (as many as you want/need) and start felting them on individually.

3. In order to create a nice shape, start with four you distribute roughly around the circle. You will felt the leaves on on the back.

2014-07-22 17.11.46

Front

2014-07-22 17.11.52

Back

Then you add up on pedals as much as you want. Keep on adding them from behind and creating a sturdy  back.  Here is an intermediate view front and back.

2014-07-31 20.26.07

Front

2014-07-31 20.26.15

Back

When you’re satisfied with your flower, sew the empty pin on.

2014-08-01 23.34.27

Finally, take the little bit of loose felting wool and felt it loosely into the middle.

2014-08-01 23.34.52 2014-08-01 23.35.12

And done!  Just attach it wherever you want and carry the sun around with you.

2014-08-01 23.36.35

<3

Pytris – A Python Script for Testing Tetris Algorithms

In another post, I explained a probably non exhaustive list of the different types of Choosing Blocks Algorithms that might exist for Tetris.  Here I explain Pytris, a script that has the logging abilities for research into the algorithms.  This is part of my ongoing Master’s Thesis Project.  If you’re interested in the source code, just contact me!  I’m happy to provide it with additional explanation.

Pytris has been implemented in Python under heavy use of the pygame library. This made it possible to account for the desired goal of having test participants create a realistic game environment on their own computer. With pyg.exe even Windows users were enabled to play the game on their operating system.

Game Mechanics

Pytris offers all game mechanics, that can generally be found in any implementation of Tetris. Players are able to translate and rotate pieces coming down. Additionally, they can listen to the original Tetris score while playing, if they desire to do so.

Upon starting the script, Pytris captures the screen in a full-screen mode so that players are not visually distracted on the screens of their computers. Graphically there are also no further distractions from the game itself. It does not show a score or a number of lines made indicating performance directly.

The initial speed of the game is set to 400 ms, which means the tetromino is moved every 400 ms. Speed increases of 5 ms happen whenever a line is removed. If more than one line is removed at the same time, the speed increase is multiplied by the number of lines removed. The minimum speed is set to 75 ms. These parameters can be changed, if needed.

tetris2

For each game the algorithm for choosing pieces is chosen at random without replacement from a bag holding all five basic algorithms described above, each of them twice. This means, each player plays ten games of Tetris, two per algorithm in a random order.

A game ends after five minutes or if a player looses – whichever event comes first. The script pauses upon that point in order to give players time to fill in a questionnaire or have a self paced break between games. However, during these breaks the screen is still captured preventing players to do any other computer based activity, at least at the machine they are playing Pytris on. Due to the time restrictions for each individual game, players play a maximum of 50 minutes during one session.

Data Recording

Pytris has been designed in order to record a lot of data in general, not only for the data analysis required for this research. For each game within a session, a log file is created. After a test session has been concluded, these files can be retrieved in a folder named by the participant ID.

Every entry in a log file has a timestamp. A log file consists foremost of a header for general test data such as the participant ID defined in the player setup, the number of the game (ranging from 1 to 10), which algorithm has been used in this game, whether the player had the original Tetris score activated and finally, when the game started. The initial speed and every speed change are recorded as well.

For each new block, a situational analysis is performed. This consists of a count of lines made so far into the game, the current pile height, the current bumpiness measure, the current number of closed holes and for which type of tetromino there are possible placements on the current contour. Finally, the chosen block and the current grid are recorded as well as every keyboard interaction of the player.

Different Tetris Algorithms

I am currently writing my Master’s thesis and using Tetris as a game of reference.  In a pre-test I needed a quick version of Tetris, that records a lot of the interaction and tests different algorithms for choosing blocks.  Before I present the resulting implementation (Pytris), I want to briefly talk about algorithms that choose blocks in Tetris.  Part of this post is in the draft of my written thesis as well.

But lets get into the heart of Tetris: how to choose blocks! Next to obvious solutions like a random choosing of all available blocks, there have also been propositions of using Tetris games as means of communication by encoding information in how the blocks are chosen. This selection of blocks is then still supposed to appear random or at least semi-random to an unknowing player of such a game (see for an example Ou, 2011).

In this post, the five algorithms implemented are presented with the general idea behind how the blocks are chosen. An exemplary implementation of each algorithm is provided in Python.

Nicetris

In order to offer players an algorithm that helps them learn the game and play it with a minimum amount of challenge, the Nicetris algorithm has been designed specifically for this work, but with the inverted principles of the Bust Head (see below) algorithm. By analysing the situation of the current game board and especially, how the contour looks like.situation[4] in the code example refers to an array containing all shapes, that are fitting the current built-up. If the current built up is really not fitting for any piece (which is theoretically impossible), the choice is made from the set of generally well fitting blocks (O, I, and L-blocks).


nice_bag = []
for element in bag:
  if element in situation[4]:
    nice_bag.append(element)
if len(nice_bag) > 1:
  return choice(nice_bag)()
else:
  return choice([I,O,L])()

This approach was designed to ensure that the player always has an edge-fitting option to place the current tetromino and, hence, enable them to clear rows fast.

Grab Bag

According to the Tetris Wiki, this is the original Tetris algorithm. Essentially, all possible tetrominoes are put in a bag and drawn randomly one after the other without replacement, which means, until the bag is empty. Then, another bag is started for the next seven pieces.


if len(ungrabbed_bag) == 0:
  ungrabbed_bag = [ O, I, S, Z, L, J, T ]
block = choice( ungrabbed_bag )
ungrabbed_bag.remove(block)
return block()

This is assumed to create a fair random game. The properties of this algorithm are, that there are at most 12 pieces between two I tetrominoes and a maximum of four ß pieces can come in a row. Hence, the chances of encountering a run of the same (bad) pieces are eliminated.

True Random

The most basic algorithm for choosing blocks in a game of Tetris is the True Random version.

return choice( O,I,L,J,T,S,Z )()

This algorithm is equal to drawing from an urn of tetrominoes with replacement. Very fortunate and very unfortunate series of blocks are likely in an equal way. However, this algorithm might actually sometimes show stronger patterns than the others.

Skewed Random

In order to increase the likelihood for a kill sequence as described by Burgiel, 1997, Skewed Random assigns a 50% chance to either of the ß (S or Z) pieces instead of the usual likelihood of 2/7 = 28.57%.


if random.randint(0,1) == 0:
  return choice([S,Z])()
else:
  return choice([O,I,L,J,T])()

Mild Skewed Random

A milder version of this algorithm adapts Skewed Random as such, that the likelihood for ß pieces are at about 39%. This version is expected to still be more difficult than the previously described algorithms (Nicetris, Grab Bag and True Random) while being less harsh than the 50% version.

Bust Head

This algorithm is inspired by the Bastet game developed by Frederico Poloni. While his version relies on a well analysis, the version used in this research is based on a contour analysis, but with a similar idea. First, the algorithm checks, which pieces do not fit the contour (fitting pieces are recorded in an array in situation[4] in the code example). Then, a bag of these pieces plus the O piece is used to randomly choose the next tetromino. If every possible tetromino could fit the contour, the undesirable combination of O and ß pieces is used as a bag for the next elements.


tiny_bag = [O]
for element in bag:
  if element not in situation[4]:
    tiny_bag.append(element)
if random.randint(0,2) > 0:
  if len(tiny_bag) == 1:
    return choice([O,S,Z])()
  else:
    return choice(tiny_bag)()
else:
  return choice(bag)()

While Bastet and Bust Head share the same core idea, which is to create a really difficult game of Tetris, their methods of achievement differ. Hence, the algorithm used here is named differently, but phonetically similar in order to keep the roots of the idea in mind.

I hope this helped a bit in understanding that randomness can be achieved in different ways and how the choosing block algorithm in Tetris can be manipulated.  This helps then in understanding the soon to come implementation description for Pytris.

Beach in Langballigau

Last week we spent some time at the Baltic Sea. There is a tragicomic story to tell about how I lost my phone and found it again in the beach two days later although the cover was done in a sandy colour. It still had 50% battery, alas I didn’t have it for the day at Legoland. Enjoy these for now.

Talk ‘Surveil and Calculate’ at XII Conference on Culture and Computer Science

In May I was at the XII Conference on Culture and Computer Science in Berlin and gave this talk when it was accepted as a contribution to the conference by a peer reviewed abstract.  That was also my first conference ever at which I was talking, so I was a little nervous. However it worked out and I have even been asked to put this online for others to share and find, which I do here happily.

Vortrag Digitale Emanzipation – 20. Mai 2014 in Ilmenau

— Disclaimer: Since the talk was requested in German and my slides are also all German, I omitt a translation as long as no one is asking for it —

Letzten Dienstag hat mich die Initiative Solidarische Welt Ilmenau (ISWI e.V.) zu einem Vortrag zu ‘Datenschutz und Bürgerrechte’ eingeladen.  Der Titel war vorgegeben.  Wir ihr an den Folien sehen könnt, bin ich eher der Meinung, dass es sich bei Datenschutz und Privatsphäre um ein Menschenrecht handelt, nicht um ein Bürgerrecht.  Deswegen habe ich den Haupttitel auch auf ‘Digitale Emanzipation’ umgemünzt, denn insbesondere in digital kryptographischen Zusammenhängen ist genau dieses Schlagwort von Bedeutung.

Hier findet ihr die Präsentation.

1 2 3 6