2020-03-16
I used working on Pandoc Bash Blog as an excuse to look into GitHub Actions.
I ended up creating three pretty simple actions.
There were already actions similar to this one on the Marketplace, but a) I wanted to learn to write actions myself and b) none of them allows to use your own style file.
My Markdown linter of choice is Markdownlint (mdl) in its Ruby incarnation. I’ve used it for a long time with ALE and have my own style file to enforce exactly the rules I want. (Two, actually; one is specifically for VimWiki.)
There are two types of actions: JavaScript and Docker based ones. I’m
using shell scripts in Docker containers for all my actions so far. The
Docker container and the script are both very simple; the Docker
container is just based on an Alpine image with Ruby, and I install the
mdl
gem.
The script then checks if a style file is provided as a parameter. If yes, it runs mdl using that parameter, and if no, without it. Mdl checks all Markdown files recursively when called with a directory as its argument:
stylefile=$1
if [ -n "$stylefile" ]; then
mdl --style "$GITHUB_WORKSPACE/$stylefile" .
else
mdl .
fi
That’s all! Using the action is pretty simple:
uses: 'bewuethr/mdl-action@v1'
with:
style-file: '.github/workflows/style.rb'
And without a style file, it’s just a one-liner. I like getting my own style file in a separate step in the same job:
run: curl "$STYLE_FILE" > .github/workflows/style.rb
where $STYLE_FILE
is the URL of my style file on
GitHub.
The action is alive and well on the Marketplace.
The next action is even easier to use; it runs ShellCheck on all shell scripts in the repository.
The Docker container uses the latest ShellCheck Alpine image and
installs the file
command.
ShellCheck doesn’t find shell script files for you, so we have to do
that ourselves; the script being run in the action boils down to a
single invocation of find
.
find . \
-type d \
-name '.git' \
-prune \
-o \
-type f \
-exec sh -c \
'file --brief "$1" | grep -qw "shell script"' _ {} \; \
-exec shellcheck --color=always {} +
First, we ignore the .git
directory; then, for each
file, we compare the output of file
to
shell script
, and the files that match get sent to
shellcheck
. --color=always
is a nice touch for
the output in the GitHub Actions tab.
I’m very used to Bash and GNU Coreutils, so when using Alpine with its BusyBox provided ash shell and commands, I always have to double check I’m not using some Bashism or GNUism.
Using the action requires just this:
uses: 'bewuethr/shellcheck-action@v1'
Like the Markdownlint action, the ShellCheck action is published on the Marketplace.
Actions provided by GitHub itself such as the Checkout action allow you to specify the version you want with just a prefix:
- uses: actions/checkout@v2
gets you the latest release with prefix v2
. This is a
convenient way to provide users of the action with non-breaking updates
and patches without them having the do anything, so I wanted to do the
same for my actions.
As far as I can tell, these tags are manually updated, but wouldn’t that be a great use case for… an action? Exactly.
Enter the Release tag tracker action!
It goes through all tags in a repository and finds the most recent one per minor and major release. Then, it checks if a prefix tag for them exists and if so, deletes it; finally, it creates a new prefix tag pointing at the proper object and pushes everything to the remote.
I got the fundamentals right pretty soon, and deleting tags worked
fine. Pushing new tags, however, eluded me for many hours. I wasn’t
trying to use the GitHub API, I just wanted the action to run a shell
script that pushes the new tags in the end with a simple
git push
.
This was met with an extremely annoying error:
refusing to allow a bot to create or update workflow
even though I didn’t do that! I tried everything I could think of or find online:
.git
to the remote URLI eventually asked
in the Community Forum, and the (not very satisfying) answer was
that it was “because GITHUB_TOKEN
is used to update the
tag”. Deleting tags is okay, but pushing new ones isn’t? Strange. And
the error message is just completely wrong, as I wasn’t touching the
workflow file.
In any case, the choice was now between using a personal access token or using the API. PAT seemed to be annoying (and would trigger the action to run again, causing an infinite loop), so API it was.
This added a few dependencies to the container: curl
and
jq
had to be added. I continued to struggle for a few days;
the worst bug to track down must have been the one where I kept getting
“422 Unprocessable Entity” responses from the API, but the exact same
commands worked just fine when running locally.
In the end, I found the culprit; to create the timestamp to send in the request body, I used
date -Iseconds
to get an ISO 8601 timestamp with second precision. Something like this:
2020-03-15T23:36:03-04:00
Just as required in the API
docs: “a timestamp in ISO 8601 format”. Even with a helpful
Wikipedia link and a formatting template:
YYYY-MM-DDTHH:MM:SSZ
. Aha.
After lots of squinting, I figured it out: in BusyBox, the output of
date -Iseconds
looks like
2020-03-16T03:40:51+0000
First of all, UTC, but that’s fine; the crucial difference is that the timezone offset has no colon in it! ISO 8601 says
The UTC offset is appended to the time in the same way that
Z
was above, in the form±[hh]:[mm]
,±[hh][mm]
, or±[hh]
.
And in the relevant RFC 3339, “Date and Time on the Internet: Timestamps”, the formal definition of the offset is
time-numoffset = ("+" / "-") time-hour [[":"] time-minute]
Again, colon optional! Looks like GitHub is too strict here.
Anyway, after I finally realized all this, I also noticed that the timestamp is optional, and I just stopped sending it. Success!
The three actions are now happily running on each other, and pbb is using them as well.
I have a pretty good understanding of GitHub Actions now, not least because of the quite readable documentation. I’m looking forward to playing around with something more substantial, like turning pbb into an action.
Because my simplistic approach (“just a shell script”) didn’t pan out, I also got to touch the GitHub API, which doesn’t hurt either.
We tried using actions at work to run a simple pull request title linter and even talked about moving our whole CI/CD pipeline from Jenkins to actions, but bumped into a pretty big roadblock: a pull request from the fork of a private repository does not trigger a workflow. Which is exactly our setup at work.
We’re not the only ones surprised by this and the official GitHub response is
This is a feature we want to support and plan to.
but that was three weeks ago. Until then, I’ll just play around with actions for my hobby projects, but it would be nice to get that feature eventually, as overall, actions integrate very nicely and are quite powerful!
After this little tangent into CI/CD, I’ll get back to feature work on pbb. Or maybe some unit tests first, which would of course be run in a workflow.


My name is @theNicoKoenig
I love css, coffee and codepen
I work at e.solutions
We build premium human machine interfaces
Dive into timeline
Your javascript code (event handlers, callbacks, fancy framework code, ...)
Use web workers for heavy scripting
Use requestAnimationFrame for visual changes
Use requestIdleCallback for non-critial background tasks at the end of a frame
Style calculation is tinder for html and css
Keep your selectors simple
// dude - what?
#foo .bar .baz a { ... }
Use class centric methodology like BEM
.block { ... }
.block__element { ... }
.block__element--modifier { ... }
"Performance is the art of avoiding work, and making any work you do as efficient as possible. In many cases it's about working with the browser, not against it."
from developers.google.comAvoiding work
From janky to snappy cats
will-change is the modern version of the good old translate3d hack
Mind the vram
Use requestAnimationFrame, requestIdleCallback and web workers
Use composite properties for animations and transitions
kkthxbye


class Solution: def getSmallestString(self, n: int, k: int) -> str: curr = k - n res = [1] * n for i in range(n): if not curr: break inc = min(curr, 25) curr -= inc res[i] += inc return ''.join([chr(r + 96) for r in res[::-1]])


{% extends 'base.html' %} {% block content %}
[president's name] was born on [date], in [place]. He was [age] when he took office on [date]. He was a member of the [party] Party. He left office on [date]. His occupation before the presidency: [occupation]. His college: [college]. He died in [place] on [date].
View Wikipedia entry for {{ pres['President'] }}.


Progress indicators let the user know the app is busy at work. Two varieties are available:
hc-progress-spinner
- can be determinate or indeterminatehc-progress-dots
- especially useful to be used inline, or when a smaller loading indicator is needed


 Don't Miss Out!
Visit Harbor Freight Tools:
Sale Extended One More Day!Ends Monday 12/16 Now! |
http://click.harborfreightemail.com/?qs=6f7a43695f7e2ca06cc93383a3e46a34c6157a5bc0f3912999fa152b2d86b81289dedc160e6b89ad
view this email online
http://click.harborfreightemail.com/?qs=6f7a43695f7e2ca06922bc5dcc846e17e1c1a8fe4b7f9dff55d28c49c8277977fa974ccdcaf997f9
http://click.harborfreightemail.com/?qs=6f7a43695f7e2ca07174fbef724a80385231393f30848bc33f11189ad1a7da761d4e2485615b2bda
Find a store near you
Shop
http://click.harborfreightemail.com/?qs=6b17c343ce031f0ed95c0e747b0af87aabeea1e32f3237b501d8532860a6d00b2005535329578ac3
www.HarborFreight.com or Call 1-800-423-2567 to Order
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e9cb4d429d840d75a6f090f19a8cccf64f150739217573f58e8cfc691d6945edb
http://click.harborfreightemail.com/?qs=6b17c343ce031f0ed7a33e44893531cda8476c76a49895389e36046f0ac0b8d0d8cd3390c90f2a8f
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e7fd7023ce1a4b9d7bf9adf29e40311231a269f39c1c12b4c11ac4c71f1682544
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e81ce13ed54687167337d8a79d610377413aa6a4044d144628750232dd17bba1f
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e253d832ea0cc8f56fd0e41780fa6654c094c658f0b9f00257d5751b5fca239da
http://click.harborfreightemail.com/?qs=6b17c343ce031f0ea855970ce6f3a2ca34a22ec54a9aa088f460ce4d1cece32f05477376a69e1b64
http://click.harborfreightemail.com/?qs=6b17c343ce031f0efaa2dd36d8a3c46e5c922303f8c6dde60996906499f2bde0c5a88597b08176dc
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e172ef664b1fb1b9d09c11029b1c0a62a45373aa2e12093bf3b9f1f687b518a73
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e35b2a76197fde9be23769290e6c5e4ef962c0b077b678289297436e82196deba
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588b547bf5f52a2510e51c7c7d7a40591d05be24caf5f144baeef0e1e5e3832610fb
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588bb25956989223ea94e03cfec3d322cbc5584c4c1fb85614c8a2c0052ae6dd792e
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588b1f9b0aae5e8bf80b7efc43d4c937454432f9a8630a5253921538741efe8827d2
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588b06569f9fef7141831df3038a6fc4c69c6b07d1e37c5e86e473bf5777088ec6ab
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588bcbcca53742e2d0f9aab4555dac1a296a281532df4c8553a4893a9b7165d4d400
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588b96dfa95a95aa38d4424ed89832fc2934f363887f237b9ae3e944bd0034262611
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588bc0a88f9f9b03245132e47b77c5c1a3a62bfe9acc69b1b042a4875a33e0f754a2
http://click.harborfreightemail.com/?qs=6b17c343ce031f0e253d832ea0cc8f56fd0e41780fa6654c094c658f0b9f00257d5751b5fca239da
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588b404e5d50b4fed5f4c41bf2505060a1f7a793272a56ec5344fd9aaa5d78d3ff0c
Links
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588bd5d62e86823e25be977200b5ec4c9907b230edc8dadfdd226a4027d710e9c427
Customer Service
http://click.harborfreightemail.com/?qs=a9ccfe7ca697588bf6c8fdc4616da97b04ebd3ac4f14580da00c33988166d7275a6bf2a667bfcccc
Store Locator
http://click.harborfreightemail.com/?qs=04c5ba9035f47945278ef7eeda5e80af5fe5f3ce0713545ae1b6d897fef8a1a78a53a17fd27ae945
Current Ad
http://click.harborfreightemail.com/?qs=04c5ba9035f479451c677d2ac15428b4b722f5a5f759530f4906167ac8e756803cfb2e6a32d37c12
How to Use Coupons
http://click.harborfreightemail.com/?qs=04c5ba9035f479459a936a0546ac5bfdd962eaa5c6966b2a5a151cee35edfe225a883ca5e3198850
Buy Gift Cards
http://click.harborfreightemail.com/?qs=04c5ba9035f479459324a7856b9257f0ff9943a947bb0d7655eb83142bf1418801502a098eee6884
Unsubscribe
Top Categories
http://click.harborfreightemail.com/?qs=04c5ba9035f4794598d7678e3dba7db2962af1fa75ca969656ae85146dd6c57da33f902ab554884f
Automotive/Motorcycle
http://click.harborfreightemail.com/?qs=04c5ba9035f47945e5c450226360f368537605998a9daf314566ad6461a3d10ef371b8fbb15c29ed
Garage & Shop
http://click.harborfreightemail.com/?qs=04c5ba9035f479453785796c20c70df0b17ceb97fa98d7a37296b9b9c5c98807d504316e3fe41223
Power Tools
http://click.harborfreightemail.com/?qs=04c5ba9035f47945bc650685f32e8b5cbf12282aecda49ad580b4c5bfd59c03d90f9a4743b3f2f77
Air Tools
http://click.harborfreightemail.com/?qs=04c5ba9035f479455ff7b3b3f3a5caca56ac2a95e9bc68201bfc873eda379c8df522ece6fe94e5cd
Engines & Generators
http://click.harborfreightemail.com/?qs=04c5ba9035f47945536b784f67c1575770c5113a56382572115dfa1670d5d037f086ac69f06d2268
Hand Tools
http://click.harborfreightemail.com/?qs=e4620470defb1b2e70f5b190ec6e9bb7f0b38bde3cb2c144bd61add67280371c6435e75f300aa9f9
http://click.harborfreightemail.com/?qs=e4620470defb1b2e38265da15f71e4b0140ef393b67b21e0f6b9004207303e7c1ebe2eff5b7c450a
Shop
http://click.harborfreightemail.com/?qs=6b17c343ce031f0ed95c0e747b0af87aabeea1e32f3237b501d8532860a6d00b2005535329578ac3
www.HarborFreight.com or Call 1-800-423-2567 to OrderStay Connected with HFT :
http://click.harborfreightemail.com/?qs=e4620470defb1b2ea20e837f408a8a23f6e928d0c54d332740df327b8043a09464dafcba1d74d9ab
http://click.harborfreightemail.com/?qs=e4620470defb1b2e384ecc43e4132639edf4089676382671e478731b8c55c538264e0fbfd574ce44
http://click.harborfreightemail.com/?qs=e4620470defb1b2e3dc6bbcd918de9268905e1d9dbebffd38dbf625fdc1057d56b5c138d722f057a
http://click.harborfreightemail.com/?qs=e4620470defb1b2e64180a0b0973a6f3beda0ba590dfa588d79ae04d0e842288218ae6d13e115026
http://click.harborfreightemail.com/?qs=e4620470defb1b2e92056622072a5fa4aa5ff7b9fe8f3aec269773cdd525209ab8399aaf6c8fc977
PRICES- Although we make every effort to assure that our prices, products and coupons are advertised as accurately as possible, we are only human, and in the event an error is made, we reserve the right to correct it. To receive the coupon prices from this email online, the coupon code(s) must be entered into your shopping cart.


| Name: smt.shobha | Reg No: 012-6SMHC19 |
|---|---|
| Age / Sex:30/f | Contact No: |
| Marital Status: ml – 13 years | Date:16/7/19 |
| Occupation:servant | Dr. |
| Address: native of tpt. | DIAGNOSIS- |
Headache , eyes blurred. Nauseated from morning. Hands and feet full paining.
From many days If pressing the calf muscle immediately getting pain. shin region also. Got chikun gunya 1 n half year back post tht pain.
Urine infection recurrent. Burning 3 -5 days. Lumbar back pain flank region.
Gastritis.
Rx:
Belladonna200/ coculus 200/ nux vom 200 – 4 pills 10 min once for 1 hour then 1 hourly.
Berbulgarisq/solidago/sarsaparilla q – 15-15-15-15 drops a/food water.
Cantharis1m/ apis 1m – 4 pills 10 min then 1hourly.


My Feed
My Achievements
My Timeline
Create a new Event
Achievements
Achievements Unlocked!
3 Personal Post
Journal Post
Acheivements to Get!
Attend class for 1000 days straight
Become doctor


Guatemala Casi Cielo® is back for a limited time. With its unique brightness and rich cocoa finish, it's no wonder this medium-roast coffee is a fan favorite. Available in whole bean, Verismo® Espresso Pods, and K-Cup® Pods.
Coffee and ice cream. Ice cream and coffee. I’m not sure I could love two things more.
“They’re just two great ingredients that taste well on their own but when you just bring them together...it’s like mind-blowing,” she said.
Lillian and her team had the extremely difficult assignment (ha!) of developing an assortment of coffee-based ice cream drinks, which debuted at the Starbucks Reserve® Roastery in June 2016.
“I love creating,” Lillian said. “So being able to have my creations on the menu for the Roastery is a dream come true.”
The four-year partner (employee) started off as a barista in Orange County, California. She moved to Seattle in 2015 with the hopes of working at the Roastery. But a few months in, she got the opportunity to join the Starbucks Food and Beverage Concept Innovation team.
One of her first projects was launching the coffee-based ice cream beverages. That means she got to drink coffee and eat ice cream every day. For her job. Lillian used her coffee expertise to make sure the finished beverages brought out the nuanced flavors of each Starbucks Reserve® coffee.


{% extends "index.html" %} {% block content %}
Something is wrong, the page you are looking for was moved, removed, renamed or might have never existed


This past weekend my wife and I travelled up to South Bend, IN to spend the weekend with her family. Her youngest brother turned 16, and with both of his older siblings out of the house, we wanted to shake it up a little bit for such a large milestone in his life. My in-laws live out in the country on the west side of the city, and the cold front that blew through the midwest this weekend pushed us outside for the majority of the weekend. It was a great time of relaxing and just enjoying the outdoors without sweating for the first time in months.
 The alley we like to go to has 12 lanes and usually less than 10 people. Its a nice, quiet place that we usually head to when we get the urge. By no means am I an accomplished (or even mediocre) bowler, so I’ll leave my score out of the discussion…and to be totally honest, I really didn’t even begin thinking about this post until the end of the day today.
 We all pretend we know what we’re doing, carefully picking out our ball, lacing our shoes, and testing the hand dryer on the ball rack. We spend time preparing and visualizing bowling strike after strike while our friends and family cheer and give us high-fives as we strut back to the benches.
What really happens, is we throw gutter balls for the first couple of frames as we get our feet under us. The weight of the ball is strange and that lane begins to look a lot wider and narrower as we struggle to find a rhythm.
Teaching can be just like that, especially in our first few years. I’m only in my third year, and while I feel much more comfortable in the classroom now than I did when I started, I still struggle to find my rhythm.
I can plan my game all I want, but when it comes down to it, the best way to throw a strike is to relax and let the weight of the ball do the work.
My experience, albeit short, will guide my curriculum, my relationships, my decisions, and everything else that comes along with teaching.
So, what about those of us that have very little [no] experience? That’s when we find the pro in your department or school. They can guide you, give tips, and help keep your aim true while you continue to find your rhythm. There is no shame in asking for help, as long as you ask with humility. Be willing to take some criticism and realize that they have seen just about everything. We can learn from their experience and grow continually into better teachers.
Don’t expect a perfect game your first, second, or even third time out. Continue to work, learn from mistakes, and keep looking down the lane.
Written on September 6th, 2011 by Brian Bennett Categorized in: All Teaching
Leave a comment


What would you like your username to be?
When you see this icon appear on the screen, you can make a choice on your phone. When a decision is made david is infromed and he will be instructed to perform a dance based on your choice.
You are in control of David.
Join David


Table of Contents
1 Propectus: Queer Interfaces
Filipa Calado
1.1 The Utility of DH Tools
Since Franco Moretti first drew attention to "distant reading," there has been much debate about what digital tools can do for the humanities, and literary studies in particular.1 Although many DH practitioners have been careful to situate their methodologies within the context of humanistic study, there persists an idea that digital methods ought to verify, correct, or establish facts about literature and literary history, similarly to the social sciences. Clarifying the distinction, Stephen Ramsay points out that, while scientific inquiry aims to describe the 'real world,' the humanities approach observation as a phenomenal experience. Drawing from Lisa Samuels's and Jerome McGann's concept of "deformative critcism," Ramsay frames the constraints of computation as an opportunity for reflection on the ways that critics change and transform the texts under their scrutiny. He reminds us that digital tools function within a larger, rhetorical process: “The understanding promised us by the critical act arises not from a presentation of facts, but from the elaboration of a gestalt, and it rightfully includes the vague reference, the conjectured similitude, ironic twist, and the dramatic turn" (16). However, in continuing to underestimate the role of critical subjectivity in analysis, critics have begun to double down on the pretense of objectivity promised by DH methods. Recently, Nan Z. Da deems Computational Literary Studies ineffective when her own experiments fail to reproduce or verify the results of her colleagues. Her emphasis on the "reproducible" extends Moretti's call from 1983 for a "falsifiable criticism"—both advocating for a methodology that is as reliable and verifiable as the sciences. Though Moretti and Da are starkly opposed on the actual efficacy of digital methods, they both value the objectivity made possible by the machine.
1.2 Experimentation, Exploration, Error
This project interrogates the assumption that the results of using digital tools ought to be reproducible or falsifiable. Instead, it proposes that we use tools in ways that resist the impulses for fixity, correction, certainty, verification. Such a method values experimentation and exploration, and revels in the inconsistencies, errors, and idiosyncrasies of close reading. It examines the ways that both human minds and computers are prone to making mistakes and misreadings, and takes these ironies as points of inspiration for re-imagining human-computer interactions. I look at digital methods that engage reading and interpretive processes, such as electronic editing practices and social reading tools. I’m interested in how these methods allow users to mine and/or imagine terrains of affect in queer life writing and compositional forms, such as memoirs, journals, and manuscripts. This examination of affect draws me into studies of consciousness, where I look at cognitive and embodied perceptual processes and what they might reveal about the reading experience. Here, I pose a variety of parallels between human and computers in order to speculate on what happens in interface between reader and text. My goal with this project is to explore how digital methods and media can be used to engage questions about queer embodied experience and subjectivity. Could the logics and limitations of technology reflect the complexities of identity? How might we “encode” or “decode” queerness?
1.3 Queer DH Now
As an emerging field, Queer DH is still finding and outing itself, unlike more popular and established Digital methodologies, like Computational Literary Studies. Tracing the current trajectory of Queer DH, Bonnie Ruberg, Jason Boyd, and James Howe point out that “many of the data-driven initiatives that have earned DH its most visible accolades eschew rather than engage topics of difference and identity” (108). In response, these authors constellate some ways that “queerness” might engage DH research practices, focusing heavily on speculative or critical making projects that interrogate the constructed nature of objects and promote play. For example, Zach Blas and micha cárdenas’s transCoder, a “queer programming anti-language,” features programming functions like the “destabilizationLoop(),” inspired by Judith Butler, which “breaks apart any process that acts as a continuously iterating power” (“Queer Technologies / transCoder”). Another project that probes the possibilities of queerness and DH is “Queer OS: A User’s Manual,” created by Fiona Barnett, Zach Blas, micha cárdenas, Jacob Gaboury, Jessica Marie Johnson, and Margaret Rhee, who reimagine how various components of an operating system, such as interfaces, applications and memory, might work (or not) within an ethos of queerness. The speculative nature of these projects is a necessary step that allows us to imagine the emergence of queered technological contexts, but it also overlooks the ways in which current technological systems already contain elements of queerness. While these projects address what they perceive to be a lack of queer analysis and methods in DH, mine looks to the queerness of our present tools, and to the assumptions about functionality that queerness evokes.
1.4 Touching without Touching
At stake here is the critic's relation to the object of study. Some DH critics have already proposed useful models for reading that emphasize the critic's role in analysis, such as Ramsay's "algorithmic criticism," McGann and Samuel's "deformative criticism," and Johanna Drucker's "Speculative Computing." These approaches are careful to temper the common reductions and rhetoric of "distant reading" by being explicit about the role of critical self-awareness and the constructed nature of data in their analysis. In a parallel vein, Queer Theory has also been exploring new ways of relating to textual objects in ways that do not delimit them. But, unlike DH, it has been forced to contend with affect, particularly negative affect, where it is plagued by what to do with bad feelings that arise when confronting histories of queer exclusion, repression, and violence. According to Eve Sedgwick, critics are compelled to pursue "the heroic, ‘liberatory,’ inescapably dualistic righteousness of hunting down and attacking prohibition/repression in all its chameleonic guises” (10). This logic of exposure perpetuates modes of "suspicious" or "paranoid" reading, in which, according to critics like Sedgwick, Rita Felski and Heather Love, the goal of demystification closes off alternative ways and possibilities for responding to texts. Throughout my project, Sedgwick's idea of "touching/feeling," looking "beside rather than beneath," joins forces with Love's idea of "touching without touching" to offer a model of relationality that resists the temptations to verify, establish, or fix knowledge about queer subjects.2
1.5 Cyborgs
An important figure for this project is the cyborg, that human-computer engagement offered up by Donna Haraway which embodies the blurring of boundaries between human and machine and does away with the old dualisms of natural/artificial and mind/body, man/machine, etc. My project deconstructs man and machine as cultural objects to replace them with the image of the cyborg, repurposed to explore the illuminating parallels between cognition and computation. My deconstruction of media and perceptual processes finds many points of intersection between the biological-mechancial, such as neurons and transistors, memory and RAM, that are used to spur our thinking about human-machine interfaces. I also focus on the role of misrecognition and misreading across perception and computation. These forays into media archaeology and studies of consciousness bring me to the boundary between the material and the immaterial, to the gaps in our knowledge about how our machines and minds works. In tracing the relationship between the material and the immaterial, I speculate on how words mark us, trigger our emotions and memories to create aesthetic, affective reading experiences.
1.6 Life Writing by Queer Authors
This investigation takes life writing, which includes autobiography, memoir, fictionalized autobiography, biography and roman a clef, as well as compositional forms like journals and manuscripts, as its main focus of study. I use the term "life writing" loosely, without adhering to any conventional criteria of genre, besides demonstrating a writing self or an experimental style that reflects the fragmentary and processural nature of subjecthood. My interest in life writing emerges from a concern with the ways that literary form shapes the coherence of queer identity and engages embodied affects and experience. Woolf's fictional biography, Orlando, acts as a fulcrum around which the false distinctions of fictionality and biography revolve. My focus on composition, particularly in the manuscripts and journals of Oscar Wilde and Virginia Woolf, highlights how writing is an iterative practice that continually calls into question the constructions of embodiment and subjectivity. Readings from what I call the "memoiresque," including 21st century works by Alison Bechdel, Jordy Rosenberg, and Yiyun Li, function as present day examples of life writing that continue to pose fresh problems for understanding identity and affect. A recurring theme in my analysis is the difficulty of categorizing and decoding or encoding queer identity, especially when affective responses to reading get in the way of interpretation, or overanalysis delimits queer subjecthood. My interest in life writing centers on whether it is or will be possible to mark queerness as legible while keeping it dynamic.
1.7 Chapter Descriptions
1.7.1 Toward a Queer DH
The first chapter, "'Touching without Touching:' Toward a Queer DH," lays out what Digital Humanities methodologies might learn from queer theory. It looks at specific reading practices by Eve Sedgwick and Heather Love, which question the proper relationship of the critic to the object of study. Sedgwick's ideas about "touching/feeling" and Love's notion of "touching but not touching" pose queer modes of relationality that do not presume full connections as prerequisite for analysis. This chapter engages these techniques with various critical methods, many from the Digital Humanities, such as distant, surface, and post-critical reading, and deformative, algorithmic, and speculative criticism. I pay particular attention to how digital formats and interfaces might harness queer critical methods, speculating on the intimate process of engaging with texts on a computer, where users can manipulate and transform texts in virtually infinite and unique ways. Examining two digital projects, a text analysis and visualization web application called Voyant-Tools, and a hypertext novella by Caitlin Fischer, These Waves of Girls, I reflect how these tools work alongside the reader’s intuition, in what McGann calls a “prosthetic extension of that demand for critical reflection,” by which the reader is able to feel her way through the text. In particular, I question how the haptic and exploratory activity of working with these tool might enliven the reading process by allowing the reader to play, experiment, and imagine new connections to the textual object.
1.7.2 Editing
The second chapter, "Editing: Encoding Identity," examines two contrasting ideas—the instability of queer identity and subjecthood against the limitations and fixities of computational methods. How do the abstractions and structures of digital formats struggle or fail to mark the complexities of embodied experience and identity? To answer this question, I first review the relation between queerness and negative affects like loss, failure and shame. Then, I explore how TEI (the Text Encoding Initiative), an encoding standard or "markup language" for electronic editing, struggles to portray the complexity of the data it represents. Here, I demonstrate how TEI might be used to mark up the manuscript of Oscar Wilde's The Picture of Dorian Gray, which was repeatedly edited by Wilde in ways that minimized homoerotic content. I question how TEI as a markup standard enables editors to register such revisions, given the hierarchical structure of XML (TEI's parent language) and the availability of relevant "tags" for marking up manuscripts. I bring my investigation into conversation with other critics who have stumbled across productive failures with their own deployments of TEI. For example, Pamela Caughie's attempts to encode gender in Lili Elbe's memoir, Man Into Woman, turn the issue of technical difficulty back to the difficulty of pinning down sexual identity, leading her to question whether "ontologies [can] ever capture the complex, multi-layered, dynamic nature of gender identities” (1).  This chapter ends by emphasizing the complex question of gender ontology and sexual identity, which are never fully legible despite our tools.
1.7.3 Teaching
The third chapter, "Teaching: Social Annotation," questions how digital annotation tools might facilitate embodied interactions with text. To begin to answer this question, I examine biological processes of perception and analogies between man and machine. I take the figure of cyborg to explore biological-mechanical intersections in order to re-present the human as a creative machine, a thinking/feeling machine. This human-computer engagement, rather than reduce the differences between humans and machines, allows me to explore unexpected affinities that emerge in the interface between reader and text. Interrogating the ways that certain perceptual and computational processes work across biological and mechanical levels sparks my thinking about human-machine interactions. I take up social annotation as a test case, examining a particular digital annotation tool that I've modified for purposes of engaging preverbal and nonverbal responses while reading. This chapter ends with a close reading of Virginia Woolf and Djuna Barnes’s novels, to see how their prose evokes some of the perceptual processes involved in reading and writing as well as how digital annotation practice helps readers to recognize these processes. I highlight how these writers' formal strategies engage cognitive, affective, and embodied reading processes.
1.7.4 Archiving
The fourth chapter, "Queer Displacements: Feeling Backward / Feed Forward," explores how displacements across our understanding of media, perception, and language affects our engagement with literary objects. Here, various displacements between how we see/experience digitized literary and cultural objects and how they work/function offer a model for thinking about how we interact with these objects. In digital media, there is a central displacement between what we see on the screen and what is inscribed in the computer’s hardware—what Matt Kirschenbaum refers to as the levels of formal and forensic materiality. Within neuroscientific debates about consciousness, the central displacement is the “explanatory gap," or the idea that the physiological processes of the body, such as the neurons firing in the brain, cannot explain the quality of sensation that is being experienced by each individual. With language, displacement inheres in the stubborn instability of the signifier, which is passed through words, syntactic structures and sound in order to signify. This chapter examines how the digitization practices of textual objects engage these displacements to open up our experience and interpretation of them. I look at the examples of the Lesbian Herstory Archive digitization efforts and "Comparing Marks: A Versioning Edition of Virginia Woolf's 'A Mark on the Wall,'" a digital resource of print witnesses of Woolf's short story across time. I find in these examples an occasion for thinking through how emergent perceptual experiences (Mark Hansen's idea of "Feed Forward") might contend with backward looking or negative affects of queer theory (Love's model of "Feeling Backward").
1.8 Works Cited
Anzaldua, Gloria. Borderlands/La Frontera: The New Mestiza. 1987. Baldwin, James. Giovanni's Room. 1956. Barnes, Djuna. Nightwood. 1936. Barnett, Fiona, Zach Blas, Micha Cárdenas, Jacob Gaboury, Jessica Marie Johnson, and Margaret Rhee. “QueerOS: A User’s Manual.” Debates in the Digital Humanities, 2016. Barthes, Roland. R.B.. 1975. Barthes, Roland. S/Z. 1970. Bechdel, Alison. Are You My Mother? A Comic Drama. 2012. Bennett, Jane. Vibrant Matter: A Political Ecology of Things. 2010. Bersani, Leo. “Is the Rectum a Grave?” 1987. Zach Blas, micha cárdenas. Queer Technologies / TransCoder. 2007-2012. Butler, Judith. Bodies That Matter. 1993. Caldwell, Kelly. "The Torment of Queer Literature," The Rumpus. 2018. Caughie, Emily Datskou and Rebecca Parker. “Storm Clouds on the Horizon: Feminist Ontologies and the Problem of Gender.” Feminist Modernist Studies. 1:3, 230-242. 2018. Chalmers, David and Andy Clark. "The Extended Mind." 1998. PDF. Chun, Wendy. Control and Freedom: Power and Paranoia in the Age of Fiber Optics. 2006. Cixous, Hélène. "The Laugh of the Medusa." 1975. Cvetkovich, Ann. An Archive of Feelings: Trauma, Sexuality, and Lesbian Public Cultures.
Da, Nan Z. “The Computational Case against Computational Literary Studies.” Critical Inquiry 45 (Spring 2019), 601-639. Dahaene, Stanislas. Reading in the Brain: The New Science of How We Read, 2010. Damasio, Antonio. First chapter from The Feeling of What Happens, 2000. Damasio, Antonio. Self Comes to Mind, 2010. Derrida, Jacques. “Archive Fever: A Freudian Impression.” Diacritics. Vol. 25, no. 2. 1995. Drucker, Johanna. "Humanities Approaches to Graphical Display." DHQ: Digital Humanities Quarterly. 2011. Drucker, Johanna. "Introduction," SpecLab: Digital Aesthetics and Projects in Speculative Computing. 2009. Felski, Rita. The Limits of Critique. 2015. Field, Michael. Sight and Song. 1892. Fisher, Caitlin. These Waves of Girls. 2001. Foucault, Michel. History of Sexuality Vol. 1. 1984. Gaboury, Jacob. "Becoming NULL: Queer Relations in the Excluded Middle." Women & Performance: a Journal of Feminist Theory. 28:2, 2018. pp. 143-158. Galloway, Alexander. Protocol: How Control Exists after Decentralization. 2004. Hansen, Mark. Feed-Forward: On The Future of 21st Century Media. 2014. Haraway, Donna. "A Cyborg Manifesto", in Simians, Cyborgs and Women: The Reinvention of Nature 1990. Hayles, Katherine N. Cognitive Unconscious, 2017. PDF. Hayles, Katherine. How We Became Posthuman: Virtual Bodies in Cybernetics, Literature, and Informatics, 2000. Hayles, N. Katherine. Writing Machines. 2002. Kirschenbaum, Matthew. Mechanisms: New Media and the Forensic Imagination. 2008. Kittler, Friedrich. Gramophone, Film, Typewriter. 1999. Klein, Lauren F. "The Image of Absence: Archival Silence, Data Visualization, and James Hemings." American Literature. 85 (4): 661–688. 2013. Landow, George. Hypertext 3.0: Critical Theory and New Media in an Era of Globalization.
LeDoux, Joseph. Chapter from Anxious: Using the Brain to Understand and Treat Fear and Anxiety, 2015. Li, Yiyun. Dear Friend, from My Life I Write to You in Your Life. 2017. Love, Heather. Feeling Backward: Loss and the Politics of Queer History. 2009. Mansfield, Katherine. "Bliss," 1918 & The Katherine Mansfield Notebooks. 2002. McGann, Jerome. Radiant Textuality: Literature after the World Wide Web. 2001. McKenzie, D.F. Bibliography and the Sociology of Texts. 1986. Merleau-Ponty, Maurice. The Phenomenology of Perception, 1945. PDF. Moretti, Franco. Graphs, Maps, Trees: Abstract Models for Literary History. 2007. Moten, Fred and Stefano Harney. The Undercommons: Fugitive Planning & Black Study. 2013. Muñoz, José. Cruising Utopia: The Then and There of Queer Futurity. 2009. Myles, Eileen. Chelsea Girls. 1994. Noe, Alva. Out of Our Heads: Why You Are Not Your Brain, and Other Lessons from the Biology of Consciousness, 2010. Pater, Walter. Studies of the History of the Renaissance. 1873. Peters, John Durham. The Marvelous Clouds: Toward a Philosophy of Elemental Media. 2016. Piper, Andrew. Enumerations: Data and Literary Study. 2018. Pitts-Taylor, Victoria. The Brain's Body: Neuroscience and Corporeal Politics, 2016. Powers, Richard. Galatea 2.2 1995. Ramsay, Stephen. Reading Machines: Toward an Algorithmic Criticism. 2011. Rich, Adrienne. "When We Dead Awaken: Writing as Revision." 1979. Rockwell, Geoffrey and Stefan Sinclair. Voyant-Tools. 2018. Rosenberg, Jordy. Confessions of the Fox. 2018. Ruberg, Bonnie et al. “Toward a Queer Digital Humanities.” Bodies of Information, edited by Elizabeth Losh and Jacqueline Wernimont, University of Minnesota Press, 2018, pp. 108–28. Sedgwick, Eve Kosofsky. "Shame, Theatricality, and Queer Performativity" & "Paranoid Reading and Reparative Reading" from Touching Feeling: Affect, Pedagogy, Performativity.
Sedgwick, Eve Kosofsky. The Epistemology of the Closet. 1990. Shaviro, Steven. The Universe of Things: On Speculative Realism, 2014. Print. Singer, Kate. “Digital Close Reading: TEI for Teaching Poetic Vocabularies.” The Journal of Interactive Technology and Pedagogy. 3, May 15, 2013. Stein, Gertrude. "Lifting Belly," 1989 & Tender Buttons, 1914 & The Autobiography of Alice B. Toklas, 1933. Tanselle, Thomas. "A Rationale of Textual Criticism." 1992. Tenen, Dennis. Plain Text: the Poetics of Computation. 2017. The Lesbian Herstory Archives. New York, NY. 1972-present. Tougaw, Jason. The Elusive Brain: Literary Experiments in the Age of Neuroscience, 2018. Tufekci, Zeynep. Twitter and Tear Gas: the Power and Fragility of Networked Protest. 2017. Turing, Alan. "Computing Machinery and Intelligence". 1950. Varela, Francisco, Evan Thompson, and Eleanor Rosch. The Embodied Mind: Cognitive Science and Human Experience, 1991. PDF. Whitehead, Alfred North. Modes of Thought, 1938. Print. Wilde, Oscar. The Picture of Dorian Gray. 1890, 1891 & Manuscript. William James. “The Sentiment of Rationality,” and "Stream of Thought," circa 1890. Wilson, Elizabeth. Affect and Artificial Intelligence, 2010. Woolf, Virginia, Emily McGinn, Amy Leggette, Matthew Hannah, and Paul Bellew. "Comparing Marks: A Versioning Edition of Virginia Woolf's 'The Mark on the Wall.'" Scholarly Editing: The Annual of the Association for Documentary Editing. Vol. 35, 2014. Woolf, Virginia. Orlando, 1928 & A Writer's Diary, 1953 & "A Sketch of the Past," 1939.
Footnotes:
These theorists take different stances on whether DH tools facilitate a more objective, or what Franco Moretti calls “falsifiable," method of criticism, where graphs and other visualizations might answer questions about literary history and form, or a more “speculative” mode, championed by Johanna Drucker, who purposefully skews graphical metrics in order to reflect the ambiguity and partiality of the data they represent. In between these two extremes, there are theorists like Andrew Piper and Ted Underwood, who temper the reductions and rhetoric of "distant reading" by incorporating close readings and explanations, or Catherine D'Ignazio and Lauren Klein, whose attempts to recover emotion and emobodiment are a direct indictment on data science as an exclusionary discipline.
Though Sedgwick focuses on reconceptualizing traditionally negative affects (like shame) into creative resources, and Love prefers to dwell in the painful past, giving inconsolable characters full reign over their own darkness, both critics look at touch as a new way of making connections between the critic and object of study


When you click on the picture, it must be selected and calculate the number of selected pictures
Selected Items:
Show mouse coordinates in the block
X: 0 Y: 0
Slider (from scratch)
Sort numbers that entered in the input field
The correct order is:


{% extends 'base.html' %} {% load static %} {% block pagecontent %}
Log in
Your username and password didn't match. Please try again.
{{ field.label_tag }} {{ field }} {% for error in field.errors %}
{{ error }}
{{ field.help_text }}


--- layout: post title: Ubuntu 12.04, Ruby, Rails, Nginx, Unicorn and git-deploy date: 2012-12-19 11:43:03.000000000 -06:00 type: post published: true status: publish categories: - Ruby on Rails tags: [] meta: _edit_last: '15714693' publicize_reach: a:2:{s:7:"twitter";a:1:{i:482036;i:229;}s:2:"wp";a:1:{i:0;i:22;}} publicize_twitter_user: broberts_az _wpas_done_482036: '1' _publicize_done_external: a:1:{s:7:"twitter";a:1:{i:199393780;b:1;}} author: login: broberts65 email<EMAIL_ADDRESS>display_name: Bob Roberts first_name: '' last_name: '' ---
I recently put together a sort of setup script for setting up a Rails production server:
https://gist.github.com/4330509


A Serif variable font, by Ilya Yudin.
To learn more about this project, visit https://github.com/cyrealtype/Podkova.


Parris W (He/Him)
Parris was born in Erie, PA. He moved around a little but mostly stayed there. At the age of 21 he moved to Washington in search of new beginings.
Merry C (They/Them)
Merry is a queer artist, witch, and a developer. They are originally from the Midwest, but currently lives in WA. In their free they enjoy reading comics, collecting art, and being a lovely Lolita
Bonnie W (She/Her)
Bonnie is a music and computer nerd from Texas who currently works as a music instructor and intern developer at AWSOM in Seattle. Her hobbies include snowboarding, painting, and doing obstacle runs.
Sources:
Zakroff, Laura Tempest. Sigil Witchery: A Witch’s Guide to Crafting Magick Symbols. Woodbury, MN: Llewellyn Publications, 2018.
“Magic Squares.” Carolina Conjure. Accessed February 28, 2019. https://www.carolinaconjure.com/magic-squares.html.
“Chaos Magick Sigil Generator - Magic Square Kamea, Musical, or Word Method Sigils.” Chaos Tarot. Accessed February 27, 2019. http://www.chaostarot.com/chaos-magick-sigil-generator/#kamea.
Hart, Avery. “Big Power In A Little Symbol: How To Create Sigils.” The Traveling Witch. December 28, 2018. Accessed February 27, 2019. https://thetravelingwitch.com/blog/2016/12/21/creating-sigils


Hey! You don't have anything in your basket! Why not view our products and find something you like.
View all products on trajans.market
{{sellerOrder.name}}
Shipping with this order free if purchased with another item.
Only paying shipping cost for one item.


htdig(1) htdig(1) NAME htfuzzy - fuzzy command-line search utility for the ht://Dig search engine SYNOPSIS htfuzzy [-c configfile] [-v] algorithm [options] DESCRIPTION Description to follow here OPTIONS -c configfile Use the specified configfile instead of the default. -v Verbose mode Use this to get more verbose output while running htfuzzy. More than one v can be specified (ie. -vv , -vvv etc ). Specifying more than two v's is probably only useful for debugging purposes. Supported Algorithms Different algorithms are supported for searching: soundex Creates a slightly modified soundex key database. Differ‐ ences with the standard soundex algorithm are: Keys are 6 digits and the first letter is also encoded. metaphone Creates a metaphone key database. This algorithm is more specific to Eng‐ lish, but will get fewer "weird" matches than the soundex algorithm. accents (No description of the algorithm at the moment) endings Creates two databases which can be used to match common word endings. The creation of these databases requires a list of affix rules and a dictionary which uses those affix rules. The format of the affix rules and dictionary files are the ones used by the ispell program. Included with the distribution are the affix rules for English and a fairly small English dictionary. Other languages can be supported by getting the appropriate affix rules and dictionaries. These are available for many lan‐ guages; check the ispell distribution for more details. synonyms Creates a database of synonyms for words. It reads a text database of synonyms and creates a database that htsearch can then use. Each line of the text database consists of words where the first word will have the other words on that line as synonyms. Notes on searching Please consult specialised literature to find out how the different algo‐ rithms work or simply try another search strategy you do not get the intended search results. FILES /etc/htdig/htdig.conf The default configuration file. SEE ALSO Please refer to the HTML pages (in the htdig-doc package) /usr/share/doc/htdig-doc/html/index.html and the manual pages htdigcon‐ fig(8) , htmerge(1) , htnotify(1) , htsearch(1) and rundig(1) for a detailed description of ht://Dig and its commands. AUTHOR This manual page was written by Robert Ribnitz. It is based on documenta‐ tion of ht://Dig, and on earlier manpages provided by Christian Schwarz and Stijn de Bekker. 21 July 1997 htdig(1)


 BEL-ZULU SANI AHMED
SOUTH AFRICA
EMAIL<EMAIL_ADDRESS>DEAR SIR,
I AM AN OFFICER CORPORATE BANKING DEPARTMENT OF RENNIES BANK
S.A.[SOUTH AFRICA] MY DEPARTMENT RELATES MORE WITH THE AFFAIRS
OF THE STATE. VERY LATELY AN AMOUNT OF MONEY WAS DISCOVERED BY
US IN A SUSPENSE / AN ABANDONED ACCOUNT TO THE SUM OF FIFTEEN
POINT THREE MILLION US DOLLARS ONLY. AN ACCOUNT THAT BELONGED TO
ONE OF OUR FOREIGN CUSTOMERS WHO DIED ALONG WITH HIS ENTIRE FAMILY
ON NOVEMBER 1994 IN A GHASTLY PLANE CRASH. SINCE WE GOT
INFORMATION ABOUT HIS DEATH, WE HAVE BEEN EXPECTING HIS
NEXT-OF-KIN TO COME OVER AND CLAIM HIS MONEY BECAUSE WE CANNOT
RELEASE IT UNLESS SOMEBODY APPLIED FOR IT AS NEXT- OF-KIN, OR
RELATION TO THE DECEASED AS INDI! C ATED IN OUR BANKING
GUIDELINES.   MOREOVER, WE DO NOT WANT THE
MONEY TO GO INTO THE GOVERNMENT ACCOUNT AS UNCLAIMED BILL.

NOW IT IS BEING SPECULATED THAT THE ABOVE SUM WILL BE TRANSFERED
INTO THE GOVERNMENT ACCOUNT AS AN UNCLAIMED FUND ON OR BEFORE
DECEMBER 2003.  SIONED BY THE FACT THAT THE
DECEASED (CUSTOMER) WAS A FOREIGNER.

AFTER RECEIVING YOUR REPLY, YOU WILL BE COMMUNICATED TO WITH THE
EXACT STEPS TO TAKE.
PLEASE TREAT THIS BUSINESS ! PROPOSAL AS STRICTLY CONFIDENTIAL
FOR SECURITY REASONS.
KIND PERSONAL REGARDS,
MR. BEL-ZULU SANI AHMED
---- Msg sent via TruthMail - http://WebBasedEmail.com/


Nicholette Sams
About
(current)
Portfolio
Contact
Anytime is Train Time
Choo Choo. Chee Chee.
Current Train Schedule
Train Name
Destination
Frequency (min)
Next Arrival
Minutes Away
Add Train
Train Name
Destination
First Train Time (HH:mm - military time)
Frequency (min)
Submit


It should be started with the fact that Final Fantasy doesn't have an official plugin system as WoW does. But thanks to some members of the community there is an API and injector, all of which rely on community reverse-engineering efforts. Those are made in two areas: network packet interception & decoding and static + dynamic assembly analysis.
Developing plugins for the said system is not easy, and while you can avoid reverse-engineering if you stick to an already discovered API, it's still pretty tricky since it involves a lot of function hooking. The game was made in C/C++ so it's all x86_64. Plugins themselves are made with C#, which run in injected Mono instance.
During the span of late 2021 to early 2022 I have created three plugins for said community plugin system:
FaderPlugin
| Short: |
Plugin to conditionally hide elements of user interface |
| Tech: |
C#, Mono |
| Links: | |
| Downloads: |
More than 15,000 |
Plugin hijacks into the in-game HUD system to control the visibility of the elements based on in-game conditions, for example hiding elements of the interface when you're out of combat. Interface API was already reverse-engineered at that point so I only had to make use of it, albeit it still took changing the approach to "hiding" several times until it was stable and was working for all of the elements.
Configuration is done in a matrix arrangement, which was very usable at the beginning when there weren't many conditions, but now UI is due to rework since said matrix now occupies a better half of the screen. I received several UI sketches from users of the plugin and will implement one of those ideas eventually.
PartyIcons
| Short: |
Plugin to replace character names with role information |
| Tech: |
C#, Mono |
| Links: | |
| Downloads: |
More than 22,000 |
Instead of showing character names, the plugin can show their class icons or raid positions (in XIV players usually have positions assigned to them for easier communication). In addition to that, the plugin listens to the game chat to figure out which position is taken by which player automatically.
Plugin hijacks several things: character nameplates (I've found a hook signature in another plugin, but still had to decipher some of the structs in memory), messages in chat (to add the role prefix to character messages), and player character context menus (later two had an API fortunately).
Initially, there were only three presets for nameplates, but that number grew considerably with suggestions from the users.
RaidBuffTracker
| Short: |
Plugin to track party member cooldowns |
| Tech: |
C#, Mono |
| Links: |
The plugin displays a widget with relevant party member cooldowns, allowing you to align your actions to fall under buffs, or quickly tell if you're supposed to take the required action, because everyone else has that action on cooldown.
To accomplish it, plugin intercepts network messages, contents of which I had to decipher (so I can figure out which packet is action invocation, whom it belongs to, and which action it is). While the previous two plugins were rather light on the architectural side of things, this one is done more properly, using Ninject for it's DI (which I had to hook up with the game's own DI system).
During the development, I worked with an experienced raider to figure out which actions people would be interested in tracking, with the list growing from an initial 16 to a staggering 48.


Read large text files by splitting them in smaller files.
| Version: | 0.1.3 |
| Imports: | data.table, Rcpp, parallel, fpeek, utils |
| LinkingTo: | Rcpp |
| Suggests: | spelling, testthat, covr |
| Published: | 2018-08-13 |
| Author: | Florian Privé [aut, cre] |
| Maintainer: | Florian Privé <florian.prive.21 at gmail.com> |
| BugReports: | https://github.com/privefl/bigreadr/issues |
| License: | GPL-3 |
| URL: | https://github.com/privefl/bigreadr |
| NeedsCompilation: | yes |
| Language: | en-US |
| Materials: | README |
| CRAN checks: | bigreadr results |
| Reference manual: | bigreadr.pdf |
| Package source: | bigreadr_0.1.3.tar.gz |
| Windows binaries: | r-devel: bigreadr_0.1.3.zip, r-release: bigreadr_0.1.3.zip, r-oldrel: bigreadr_0.1.3.zip |
| OS X binaries: | r-release: bigreadr_0.1.3.tgz, r-oldrel: bigreadr_0.1.3.tgz |
| Old sources: | bigreadr archive |
| Reverse imports: | bigstatsr |
Please use the canonical form https://CRAN.R-project.org/package=bigreadr to link to this page.


Class SplayMap<E>
- java.lang.Object
-
- org.apache.qpid.protonj2.engine.util.SplayMap<E>
-
- Type Parameters:
E
- The type stored in the map entries
- All Implemented Interfaces:
java.util.Map<UnsignedInteger,E>
,java.util.NavigableMap<UnsignedInteger,E>
,java.util.SortedMap<UnsignedInteger,E>
- Direct Known Subclasses:
LinkedSplayMap
public class SplayMap<E> extends java.lang.Object implements java.util.NavigableMap<UnsignedInteger,E>
Map class that is implemented using a Splay Tree and uses primitive integers as the keys for the specified value type. The splay tree is a specialized form of a binary search tree that is self balancing and provides faster access in general to frequently used items. The splay tree serves well as an LRU cache of sorts where 80 percent of the accessed elements comes from 20 percent of the overall load in theMap
. The best case access time is generally O(long n) however it can be Theta(n) in a very worst case scenario.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description class
SplayMap.ImmutableSplayMapEntry
An immutableMap
entry that can be used when exposing raw entry mappings via theMap
API.protected static class
SplayMap.SplayedEntry<E>
-
Field Summary
Fields Modifier and Type Field Description protected RingQueue<SplayMap.SplayedEntry<E>>
entryPool
protected java.util.Set<java.util.Map.Entry<UnsignedInteger,E>>
entrySet
protected java.util.Set<UnsignedInteger>
keySet
protected int
modCount
protected SplayMap.SplayedEntry<E>
root
Root node which can be null if the tree has no elements (size == 0)protected int
size
Current size of the splayed map tree.protected java.util.Collection<E>
values
-
Constructor Summary
Constructors Constructor Description SplayMap()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description SplayMap.ImmutableSplayMapEntry
ceilingEntry(UnsignedInteger key)
UnsignedInteger
ceilingKey(UnsignedInteger key)
void
clear()
java.util.Comparator<? super UnsignedInteger>
comparator()
boolean
containsKey(int key)
Searches the map using the given primitive integer key value which will be treated internally as an unsigned value when comparing against keys in the mapping.boolean
containsKey(java.lang.Object key)
boolean
containsValue(java.lang.Object value)
protected void
delete(SplayMap.SplayedEntry<E> node)
java.util.NavigableSet<UnsignedInteger>
descendingKeySet()
java.util.NavigableMap<UnsignedInteger,E>
descendingMap()
protected void
entryAdded(SplayMap.SplayedEntry<E> newEntry)
protected void
entryDeleted(SplayMap.SplayedEntry<E> deletedEntry)
java.util.Set<java.util.Map.Entry<UnsignedInteger,E>>
entrySet()
protected SplayMap.ImmutableSplayMapEntry
export(SplayMap.SplayedEntry<E> entry)
SplayMap.ImmutableSplayMapEntry
firstEntry()
UnsignedInteger
firstKey()
SplayMap.ImmutableSplayMapEntry
floorEntry(UnsignedInteger key)
UnsignedInteger
floorKey(UnsignedInteger key)
void
forEach(java.util.function.BiConsumer<? super UnsignedInteger,? super E> action)
void
forEach(java.util.function.Consumer<? super E> action)
A specialized forEach implementation that accepts aConsumer
function that will be called for each value in theSplayMap
.E
get(int key)
Gets the value of the element stored in theMap
with the key (treated as an unsigned integer for comparison.E
get(java.lang.Object key)
java.util.SortedMap<UnsignedInteger,E>
headMap(UnsignedInteger toKey)
java.util.NavigableMap<UnsignedInteger,E>
headMap(UnsignedInteger toKey, boolean inclusive)
SplayMap.ImmutableSplayMapEntry
higherEntry(UnsignedInteger key)
UnsignedInteger
higherKey(UnsignedInteger key)
boolean
isEmpty()
java.util.Set<UnsignedInteger>
keySet()
SplayMap.ImmutableSplayMapEntry
lastEntry()
UnsignedInteger
lastKey()
SplayMap.ImmutableSplayMapEntry
lowerEntry(UnsignedInteger key)
UnsignedInteger
lowerKey(UnsignedInteger key)
java.util.NavigableSet<UnsignedInteger>
navigableKeySet()
SplayMap.ImmutableSplayMapEntry
pollFirstEntry()
SplayMap.ImmutableSplayMapEntry
pollLastEntry()
E
put(int key, E value)
Puts the value into the in theMap
at the entry specified by the given key (treated as an unsigned integer for comparison.E
put(UnsignedInteger key, E value)
void
putAll(java.util.Map<? extends UnsignedInteger,? extends E> source)
E
putIfAbsent(int key, E value)
If the specified key is not already associated with a value associates it with the given value and returns null, otherwise returns the current value.E
putIfAbsent(UnsignedInteger key, E value)
E
remove(int key)
Removes the mapping for the primitiveint
key from this map if it is present and returns the value to which this map previously associated the key, or null if the map contained no mapping for the key.boolean
remove(int key, java.lang.Object value)
Removes the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the specified value in theMap
.E
remove(java.lang.Object key)
boolean
remove(java.lang.Object key, java.lang.Object value)
E
remove(UnsignedInteger key)
Removes the mapping for theUnsignedInteger
key from this map if it is present and returns the value to which this map previously associated the key, or null if the map contained no mapping for the key.E
replace(int key, E value)
Replaces the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the a value in theMap
with the new value provided.boolean
replace(int key, E oldValue, E newValue)
Replaces the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the specified value in theMap
with the new value provided.E
replace(UnsignedInteger key, E value)
boolean
replace(UnsignedInteger key, E oldValue, E newValue)
void
replaceAll(java.util.function.BiFunction<? super UnsignedInteger,? super E,? extends E> function)
int
size()
java.util.NavigableMap<UnsignedInteger,E>
subMap(UnsignedInteger fromKey, boolean fromInclusive, UnsignedInteger toKey, boolean toInclusive)
java.util.SortedMap<UnsignedInteger,E>
subMap(UnsignedInteger fromKey, UnsignedInteger toKey)
java.util.SortedMap<UnsignedInteger,E>
tailMap(UnsignedInteger fromKey)
java.util.NavigableMap<UnsignedInteger,E>
tailMap(UnsignedInteger fromKey, boolean inclusive)
java.util.Collection<E>
values()
-
-
-
Field Detail
-
entryPool
protected final RingQueue<SplayMap.SplayedEntry<E>> entryPool
-
root
protected SplayMap.SplayedEntry<E> root
Root node which can be null if the tree has no elements (size == 0)
-
size
protected int size
Current size of the splayed map tree.
-
modCount
protected int modCount
-
keySet
protected java.util.Set<UnsignedInteger> keySet
-
values
protected java.util.Collection<E> values
-
entrySet
protected java.util.Set<java.util.Map.Entry<UnsignedInteger,E>> entrySet
-
-
Method Detail
-
size
public int size()
- Specified by:
size
in interfacejava.util.Map<UnsignedInteger,E>
-
isEmpty
public boolean isEmpty()
- Specified by:
isEmpty
in interfacejava.util.Map<UnsignedInteger,E>
-
get
public E get(int key)
Gets the value of the element stored in theMap
with the key (treated as an unsigned integer for comparison. As a side effect of calling this method the tree that comprises the Map can be modified to bring up the found key or the last accessed key if the key given is not in theMap
. For entries at the root of the tree that match the given search key the method returns immediately without modifying theMap
.- Parameters:
key
- the integer key value to search for in theSplayMap
.- Returns:
- the value stored for the given key if found or null if not in the
Map
.
-
put
public E put(int key, E value)
Puts the value into the in theMap
at the entry specified by the given key (treated as an unsigned integer for comparison. As a side effect of calling this method the tree that comprises the Map can be modified to bring up the found key or the last accessed key if the key given is not in theMap
. For entries at the root of the tree that match the given search key the method returns immediately without modifying theMap
.- Parameters:
key
- the integer key value to search for and or insert in theSplayMap
.value
- the value to assign to the entry accessed via the given key.- Returns:
- the previous value stored for the given key if found or null if not in the
Map
.
-
putIfAbsent
public E putIfAbsent(UnsignedInteger key, E value)
- Specified by:
putIfAbsent
in interfacejava.util.Map<UnsignedInteger,E>
-
putIfAbsent
public E putIfAbsent(int key, E value)
If the specified key is not already associated with a value associates it with the given value and returns null, otherwise returns the current value. As a side effect of calling this method the tree that comprises the Map can be modified to bring up the found key or the last accessed key if the key given is not in theMap
. For entries at the root of the tree that match the given search key the method returns immediately without modifying theMap
.- Parameters:
key
- the integer key value to search for and or insert in theSplayMap
.value
- the value to assign to the entry accessed via the given key.- Returns:
- the previous value associated with the given key or null if none was present.
-
remove
public E remove(UnsignedInteger key)
Removes the mapping for theUnsignedInteger
key from this map if it is present and returns the value to which this map previously associated the key, or null if the map contained no mapping for the key.- Parameters:
key
- TheUnsignedInteger
key whose value will be removed from theSplayMap
.- Returns:
- the value that was removed if one was present in the
Map
.
-
remove
public E remove(int key)
Removes the mapping for the primitiveint
key from this map if it is present and returns the value to which this map previously associated the key, or null if the map contained no mapping for the key. The integer value is treated as an unsigned int internally.- Parameters:
key
- TheUnsignedInteger
key whose value will be removed from theSplayMap
.- Returns:
- the value that was removed if one was present in the
Map
.
-
containsKey
public boolean containsKey(int key)
Searches the map using the given primitive integer key value which will be treated internally as an unsigned value when comparing against keys in the mapping.- Parameters:
key
- The key which will be searched for in this mapping.- Returns:
true
if the key mapping is found within thisMap
.
-
put
public E put(UnsignedInteger key, E value)
- Specified by:
put
in interfacejava.util.Map<UnsignedInteger,E>
-
get
public E get(java.lang.Object key)
- Specified by:
get
in interfacejava.util.Map<UnsignedInteger,E>
-
remove
public E remove(java.lang.Object key)
- Specified by:
remove
in interfacejava.util.Map<UnsignedInteger,E>
-
containsKey
public boolean containsKey(java.lang.Object key)
- Specified by:
containsKey
in interfacejava.util.Map<UnsignedInteger,E>
-
clear
public void clear()
- Specified by:
clear
in interfacejava.util.Map<UnsignedInteger,E>
-
putAll
public void putAll(java.util.Map<? extends UnsignedInteger,? extends E> source)
- Specified by:
putAll
in interfacejava.util.Map<UnsignedInteger,E>
-
containsValue
public boolean containsValue(java.lang.Object value)
- Specified by:
containsValue
in interfacejava.util.Map<UnsignedInteger,E>
-
keySet
public java.util.Set<UnsignedInteger> keySet()
- Specified by:
keySet
in interfacejava.util.Map<UnsignedInteger,E>
- Specified by:
keySet
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
values
public java.util.Collection<E> values()
- Specified by:
values
in interfacejava.util.Map<UnsignedInteger,E>
- Specified by:
values
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
entrySet
public java.util.Set<java.util.Map.Entry<UnsignedInteger,E>> entrySet()
- Specified by:
entrySet
in interfacejava.util.Map<UnsignedInteger,E>
- Specified by:
entrySet
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
forEach
public void forEach(java.util.function.BiConsumer<? super UnsignedInteger,? super E> action)
- Specified by:
forEach
in interfacejava.util.Map<UnsignedInteger,E>
-
forEach
public void forEach(java.util.function.Consumer<? super E> action)
A specialized forEach implementation that accepts aConsumer
function that will be called for each value in theSplayMap
. This method can save overhead as it does not need to box the primitive key values into an object for the call to the provided function. Unless otherwise specified by the implementing class, actions are performed in the order of entry set iteration (if an iteration order is specified.)- Parameters:
action
- The action to be performed for each of the values in theSplayMap
.
-
replaceAll
public void replaceAll(java.util.function.BiFunction<? super UnsignedInteger,? super E,? extends E> function)
- Specified by:
replaceAll
in interfacejava.util.Map<UnsignedInteger,E>
-
remove
public boolean remove(java.lang.Object key, java.lang.Object value)
- Specified by:
remove
in interfacejava.util.Map<UnsignedInteger,E>
-
remove
public boolean remove(int key, java.lang.Object value)
Removes the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the specified value in theMap
.- Parameters:
key
- The key whose value will be removed if matched.value
- The value that must be contained in the mapping for the remove to be performed.- Returns:
true
if an entry was removed from theMap
-
replace
public boolean replace(UnsignedInteger key, E oldValue, E newValue)
- Specified by:
replace
in interfacejava.util.Map<UnsignedInteger,E>
-
replace
public boolean replace(int key, E oldValue, E newValue)
Replaces the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the specified value in theMap
with the new value provided.- Parameters:
key
- The key whose value will be removed if matched.oldValue
- The old value that must be contained in the mapping for the replace to be performed.newValue
- The value that will replace the old value mapped to the given key if one existed..- Returns:
true
if an entry was replaced in theMap
-
replace
public E replace(UnsignedInteger key, E value)
- Specified by:
replace
in interfacejava.util.Map<UnsignedInteger,E>
-
replace
public E replace(int key, E value)
Replaces the entry for the specified primitive int (treated as unsigned) key only if it is currently mapped to the a value in theMap
with the new value provided.- Parameters:
key
- The key whose value will be removed if matched.value
- The value that will replace the old value mapped to the given key if one existed..- Returns:
true
if an entry was replaced in theMap
-
entryAdded
protected void entryAdded(SplayMap.SplayedEntry<E> newEntry)
-
entryDeleted
protected void entryDeleted(SplayMap.SplayedEntry<E> deletedEntry)
-
delete
protected void delete(SplayMap.SplayedEntry<E> node)
-
export
protected SplayMap.ImmutableSplayMapEntry export(SplayMap.SplayedEntry<E> entry)
-
comparator
public java.util.Comparator<? super UnsignedInteger> comparator()
- Specified by:
comparator
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
firstKey
public UnsignedInteger firstKey()
- Specified by:
firstKey
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
lastKey
public UnsignedInteger lastKey()
- Specified by:
lastKey
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
firstEntry
public SplayMap.ImmutableSplayMapEntry firstEntry()
- Specified by:
firstEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
lastEntry
public SplayMap.ImmutableSplayMapEntry lastEntry()
- Specified by:
lastEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
pollFirstEntry
public SplayMap.ImmutableSplayMapEntry pollFirstEntry()
- Specified by:
pollFirstEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
pollLastEntry
public SplayMap.ImmutableSplayMapEntry pollLastEntry()
- Specified by:
pollLastEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
lowerEntry
public SplayMap.ImmutableSplayMapEntry lowerEntry(UnsignedInteger key)
- Specified by:
lowerEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
lowerKey
public UnsignedInteger lowerKey(UnsignedInteger key)
- Specified by:
lowerKey
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
higherEntry
public SplayMap.ImmutableSplayMapEntry higherEntry(UnsignedInteger key)
- Specified by:
higherEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
higherKey
public UnsignedInteger higherKey(UnsignedInteger key)
- Specified by:
higherKey
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
floorEntry
public SplayMap.ImmutableSplayMapEntry floorEntry(UnsignedInteger key)
- Specified by:
floorEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
floorKey
public UnsignedInteger floorKey(UnsignedInteger key)
- Specified by:
floorKey
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
ceilingEntry
public SplayMap.ImmutableSplayMapEntry ceilingEntry(UnsignedInteger key)
- Specified by:
ceilingEntry
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
ceilingKey
public UnsignedInteger ceilingKey(UnsignedInteger key)
- Specified by:
ceilingKey
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
descendingMap
public java.util.NavigableMap<UnsignedInteger,E> descendingMap()
- Specified by:
descendingMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
navigableKeySet
public java.util.NavigableSet<UnsignedInteger> navigableKeySet()
- Specified by:
navigableKeySet
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
descendingKeySet
public java.util.NavigableSet<UnsignedInteger> descendingKeySet()
- Specified by:
descendingKeySet
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
subMap
public java.util.NavigableMap<UnsignedInteger,E> subMap(UnsignedInteger fromKey, boolean fromInclusive, UnsignedInteger toKey, boolean toInclusive)
- Specified by:
subMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
headMap
public java.util.NavigableMap<UnsignedInteger,E> headMap(UnsignedInteger toKey, boolean inclusive)
- Specified by:
headMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
tailMap
public java.util.NavigableMap<UnsignedInteger,E> tailMap(UnsignedInteger fromKey, boolean inclusive)
- Specified by:
tailMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
-
subMap
public java.util.SortedMap<UnsignedInteger,E> subMap(UnsignedInteger fromKey, UnsignedInteger toKey)
- Specified by:
subMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
- Specified by:
subMap
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
headMap
public java.util.SortedMap<UnsignedInteger,E> headMap(UnsignedInteger toKey)
- Specified by:
headMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
- Specified by:
headMap
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
tailMap
public java.util.SortedMap<UnsignedInteger,E> tailMap(UnsignedInteger fromKey)
- Specified by:
tailMap
in interfacejava.util.NavigableMap<UnsignedInteger,E>
- Specified by:
tailMap
in interfacejava.util.SortedMap<UnsignedInteger,E>
-
-


Club ready to hold talks over Southampton player – Want to agree reduced fee
by Nihat Emre KocaaslanTurkish website Sporx claims Galatasaray manager Fatih Terim wants Southampton loanee Mario Lemina to remain at the club beyond this season.
Gala loaned Lemina from the Premier League side in August, and after a poor start the Gabonese international has found some form in recent weeks.
The 26 year old is now one of the most important members of Terim’s struggling Galatasaray side and Sporx report there’s a genuine desire to get a deal done.
Lemina’s redemption clause is said to be €16m and it’s claimed Galatasaray officials will negotiate with Southampton in order to get them to reduce this amount.
Given the finances of the Turkish champions it’s likely they will struggle to pay the €16m, so another season-long loan deal could be a possibility if they can’t get the Saints to go lower.
The former Juventus midfielder has made 10 appearances for the Super Lig side in all competitions this season. His contract with Southampton will expire at the end of June 2022.


About
Projects
Contact
I am
ntp client
Microcontroller computer
Blender 3D cup Model
GSOC16 project
sensor
Elevator


Workout Site
A CPSC 471 Project
Main
|
Profile
|
Search
|
Workout
|
Schedule
|
Login
Login
Username
Password
Register
Username
Password
Name
Age
Gender
Male
Female
Height
Weight


Commercial use of Unpaywall data
The Unpaywall dataset is free for noncommercial use. However, for commercial use you'll need to sign up for the Service-Level Agreement (SLA). This lets you:
- Use the downloaded dataset for commercial purposes.
- Get weekly updates on what changed in the Unpaywall database. So, if you start with the download file, then subscribe to the weekly updates, you'll be able to maintain an exact copy of the Unpaywall database, on your own local servers.
- Get enterprise-level service and support established and guaranteed in writing.
- Help support Unpaywall and keep it sustainable over the long term.
Of course, if you don't need these features, you can always just use the API; it's free to everyone for any use.
Our pricing on the SLA is flexible, depending on your revenue and use-case. So if you're interested, please contact us; we'd love to hear from you!


--- layout: post title: "The Test Data Generator functor" description: "A Test Data Generator modelled as a functor." date: 2017-09-18 7:55 UTC tags: [Unit Testing, Software Design, FsCheck] --- {% include JB/setup %}
{{ page.description }}
In a previous article series, you learned that while it's possible to model Test Data Builders as a functor, it adds little value. You shouldn't, however, dismiss the value of functors. It's an abstraction that applies broadly.
Closely related to Test Data Builders is the concept of a generator of random test data. You could call it a Test Data Generator instead. Such a generator can be modelled as a functor.
At its core, the idea behind a Test Data Generator is to create random test data. Still, you'll like to be able control various parts of the process, because you'd often need to pin parts of the generated data to deterministic values, while allowing other parts to vary randomly.
In C#, you can write a generic Generator like this:
public class Generator<T> { private readonly Func<Random, T> generate; public Generator(Func<Random, T> generate) { if (generate == null) throw new ArgumentNullException(nameof(generate)); this.generate = generate; } public Generator<T1> Select<T1>(Func<T, T1> f) { if (f == null) throw new ArgumentNullException(nameof(f)); Func<Random, T1> newGenerator = r => f(this.generate(r)); return new Generator<T1>(newGenerator); } public T Generate(Random random) { if (random == null) throw new ArgumentNullException(nameof(random)); return this.generate(random); } }
The Generate
method takes a Random
object as input, and produces a value of the generic type T
as output. This enables you to deterministically reproduce a particular randomly generated value, if you know the seed of the Random
object.
Notice how Generator<T>
is a simple Adapter over a (lazily evaluated) function. This function also takes a Random
object as input, and produces a T
value as output. (For the FP enthusiasts, this is simply the Reader functor in disguise.)
The Select
method makes Generator<T>
a functor. It takes a map function f
as input, and uses it to define a new generate
function. The return value is a Generator<T1>
.
Functors are immanently composable. You can compose complex Test Data Generators from simpler building blocks, like the following.
For instance, you may need a generator of alphanumeric strings. You can write it like this:
private const string alphaNumericCharacters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static Generator<string> AlphaNumericString = new Generator<string>(r => { var length = r.Next(25); // Arbitrarily chosen max length var chars = new char[length]; for (int i = 0; i < length; i++) { var idx = r.Next(alphaNumericCharacters.Length); chars[i] = alphaNumericCharacters[idx]; } return new string(chars); });
This Generator<string>
can generate a random string with alphanumeric characters. It randomly picks a length between 0 and 24, and fills it with randomly selected alphanumeric characters. The maximum length of 24 is arbitrarily chosen. The generated string may be empty.
Notice that the argument passed to the constructor is a function. It's not evaluated at initialisation, but only if Generate
is called.
The r
argument is the Random
object passed to Generate
.
Another useful general-purpose building block is a generator that can use a single-object generator to create many objects:
public static Generator<IEnumerable<T>> Many<T>(Generator<T> generator) { return new Generator<IEnumerable<T>>(r => { var length = r.Next(25); // Arbitrarily chosen max length var elements = new List<T>(); for (int i = 0; i < length; i++) elements.Add(generator.Generate(r)); return elements; }); }
This method takes a Generator<T>
as input, and uses it to generate zero or more T
objects. Again, the maximum length of 24 is arbitrarily chosen. It could have been a method argument, but in order to keep the example simple, I hard-coded it.
From such general-purpose building blocks, you can define custom generators for your domain model. This enables you to use such generators in your unit tests.
In order to generate post codes, you can combine the AlphaNumericString
and the Many
generators:
public static Generator<PostCode> PostCode = new Generator<PostCode>(r => { var postCodes = Many(AlphaNumericString).Generate(r); return new PostCode(postCodes.ToArray()); });
The PostCode
class is part of your domain model; it takes an array of strings as input to its constructor. The PostCode
generator uses the AlphaNumericString
generator as input to the Many
method. This generates zero or many alphanumeric strings, which you can pass to the PostCode
constructor.
This, in turn, gives you all the building blocks you need to generate Address
objects:
public static Generator<Address> Address = new Generator<Address>(r => { var street = AlphaNumericString.Generate(r); var city = AlphaNumericString.Generate(r); var postCode = PostCode.Generate(r); return new Address(street, city, postCode); });
This Generator<Address>
uses the AlphaNumericString
generator to generate street and city strings. It uses the PostCode
generator to generate a PostCode
object. All these objects are passed to the Address
constructor.
Keep in mind that all of this logic is defined in lazily evaluated functions. Only when you invoke the Generate
method on a generator does the code execute.
You can now write tests similar to the tests shown in the article series about Test Data Builders. If, for example, you need an address in Paris, you can generate it like this:
var rnd = new Random(); var address = Gen.Address.Select(a => a.WithCity("Paris")).Generate(rnd);
Gen.Address
is the Address
generator shown above; I put all those generators in a static class called Gen
. If you don't modify it, Gen.Address
will generate a random Address
object, but by using Select
, you can pin the city to Paris.
You can also start with one type of generator and use Select
to map to another type of generator, like this:
var rnd = new Random(); var address = Gen.PostCode .Select(pc => new Address("Rue Morgue", "Paris", pc)) .Generate(rnd);
You use Gen.PostCode
as the initial generator, and then Select
a new Address
in Rue Morgue, Paris, with a randomly generated post code.
Such a Test Data Generator is a functor. One way to see that is to use query syntax instead of the fluent API:
var rnd = new Random(); var address = (from a in Gen.Address select a.WithCity("Paris")).Generate(rnd);
Likewise, you can also translate the Rue Morgue generator to query syntax:
var address = ( from pc in Gen.PostCode select new Address("Rue Morgue", "Paris", pc)).Generate(rnd);
This is, however, awkward, because you have to enclose the query expression in brackets in order to be able to invoke the Generate
method. Alternatively, you can separate the query from the generation, like this:
var g = from a in Gen.Address select a.WithCity("Paris"); var rnd = new Random(); var address = g.Generate(rnd);
Or this:
var g = from pc in Gen.PostCode select new Address("Rue Morgue", "Paris", pc); var rnd = new Random(); var address = g.Generate(rnd);
You'd probably still prefer the fluent API over this syntax. The reason I show this alternative is to demonstrate that the functor gives you the ability to separate the definition of data generation from the actual generation. In order to emphasise this point, I defined the g
variables before creating the Random
object rnd
.
The above Generator<T>
is only a crude example of a Test Data Generator. In order to demonstrate how such a generator is a functor, I left out several useful features. Still, this should have given you a sense for how the Generator<T>
class itself, as well as such general-purpose building blocks as Many
and AlphaNumericString
, could be packaged in a reusable library.
The examples above show how to use a generator to create a single random object. You could, however, easily generate many (say, 100) random objects, and run unit tests for each object created. This is the idea behind property-based testing.
There's more to property-based testing than generation of random values, but the implementations I've seen are all based on Test Data Generators as functors (and monads).
FsCheck is an open source F# library for property-based testing. It defines a Gen
functor (and monad) that you can use to generate Address
values, just like the above examples:
let! address = Gen.address |> Gen.map (fun a -> { a with City = "Paris"} )
Here, Gen.address
is a Gen<Address>
value. By itself, it'll generate random Address
values, but by using Gen.map
, you can pin the city to Paris.
The map
function corresponds to the C# Select
method. In functional programming, map is the most common name, although Haskell calls the function fmap
; the Select
name is, in fact, the odd man out.
Likewise, you can map from one generator type to another:
let! address = Gen.postCode |> Gen.map (fun pc -> { Street = "Rue Morgue"; City = "Paris"; PostCode = pc })
This example uses Gen.postCode
as the initial generator. This is, as the name implies, a Gen<PostCode>
value. For every random PostCode
value generated, map
turns it into an address in Rue Morgue, Paris.
There's more going on here than I'd like to cover in this article. The use of let!
syntax actually requires Gen<'a>
to be a monad (which it is), but that's a topic for another day. Both of these examples are contained in a computation expression, and the implication of that is that the address
values represent a multitude of randomly generated Address
values.
Hedgehog is another open source F# library for property-based testing. With Hedgehog, the Address
code examples look like this:
let! address = Gen.address |> Gen.map (fun a -> { a with City = "Paris"} )
And:
let! address = Gen.postCode |> Gen.map (fun pc -> { Street = "Rue Morgue"; City = "Paris"; PostCode = pc })
Did you notice something?
This is literally the same syntax as FsCheck! This isn't because Hedgehog is copying FsCheck, but because both are based on the same underlying abstraction: functor (and monad). There are other parts of the API where Hedgehog differs from FsCheck, but their generators are similar.
This is one of the most important advantages of using well-known abstractions like functors. Once you understand such an abstraction, it's easy to learn a new library. With professional experience with FsCheck, it only took me a few minutes to figure out how to use Hedgehog.
Functors are well-defined objects from category theory. It may seem abstract, and far removed from 'real' programming, but it's extraordinarily useful. Many category theory abstractions can be applied to a host of different situations. Once you've learned what a functor is, you'll find it easy to learn to use new libraries that build on that abstraction.
In this article you saw a sketch of how the functor abstraction can be used to model Test Data Generators. Contrary to Test Data Builders, which turned out to be a redundant abstraction, a Test Data Generator is truly useful.
Many years ago, I had the idea to create a Test Data Generator for unit testing purposes. I called it AutoFixture, and although it's had some success, the API isn't as clean as it could be. Back then, I didn't know about functors, so I had to invent an API for AutoFixture. This API is proprietary to AutoFixture, so anyone learning AutoFixture must learn this particular API, and its abstractions. It would have been so much easier for all involved if I had designed AutoFixture as a functor instead.
Comments
I'm curious as to what the "useful features" are that that you left out of the Test Data Generator?
Stuart, thank you for writing. Test Data Generators like the one described here are rich data structures that you can do a lot of interesting things with. As described here, the generator only generates a single value every time you invoke its
Generate
method. What property-based testing libraries like QuickCheck, FsCheck, and Hedgehog do is that instead of a single random value, they generate many values (the default number seems to be 100).These property-based testing libraries tend to then 'elevate' their generators into another type of data structure called Arbitraries, and these again into Properties. What typically happens is that they use the Generators to generate values, but for each generated value, they evaluate the associated Property. If all Properties succeed, nothing more happens, but in the case of a test failure, no more values are generated. Instead, the libraries switch to a state where they attempt to shrink the counter-example to a simpler counter-example. It uses a Shrinker associated with the Arbitrary to do this. The end result is that if your test doesn't hold, you'll get an easy-to-understand example of the input that caused the test to fail.
Apart from that, there are many other features of Test Data Generators that I left out. Some of these include ways to combine several Generators to a single Generator. It turns out that Test Data Generators are also Applicative Functors and Monads, and you can use these traits to define powerful combinators. In the future, I'll publish more articles on this topic, but it'll take months, because my article queue has quite a few other articles in front of those.
If you want to explore this topic, I'd recommend playing with FsCheck. While it's written in F#, it also works from C#, and its documentation includes C# examples as well. Hedgehog may also work from C#, but being a newer, more experimental library, its documentation is still sparse.
That's right. Hedgehog may be used from C# as well.


TERM 5
TERM(5) TERM(5)
NAME
term - format of compiled term file.
SYNOPSIS
term
DESCRIPTION
Compiled terminfo descriptions are placed under the direc-
tory /usr/share/terminfo. In order to avoid a linear
search of a huge UNIX system directory, a two-level scheme
is used: /usr/share/terminfo/c/name where name is the name
of the terminal, and c is the first character of name.
Thus, act4 can be found in the file /usr/share/ter-
minfo/a/act4. Synonyms for the same terminal are imple-
mented by multiple links to the same compiled file.
The format has been chosen so that it will be the same on
all hardware. An 8 or more bit byte is assumed, but no
assumptions about byte ordering or sign extension are
made.
The compiled file is created with the tic program, and
read by the routine setupterm. The file is divided into
six parts: the header, terminal names, boolean flags, num-
bers, strings, and string table.
The header section begins the file. This section contains
six short integers in the format described below. These
integers are (1) the magic number (octal 0432); (2) the
size, in bytes, of the names section; (3) the number of
bytes in the boolean section; (4) the number of short
integers in the numbers section; (5) the number of offsets
(short integers) in the strings section; (6) the size, in
bytes, of the string table.
Short integers are stored in two 8-bit bytes. The first
byte contains the least significant 8 bits of the value,
and the second byte contains the most significant 8 bits.
(Thus, the value represented is 256*second+first.) The
value -1 is represented by the two bytes 0377, 0377; other
negative values are illegal. This value generally means
that the corresponding capability is missing from this
terminal. Note that this format corresponds to the hard-
ware of the VAX and PDP-11 (that is, little-endian
machines). Machines where this does not correspond to the
hardware must read the integers as two bytes and compute
the little-endian value.
The terminal names section comes next. It contains the
first line of the terminfo description, listing the vari-
ous names for the terminal, separated by the `|' charac-
ter. The section is terminated with an ASCII NUL charac-
ter.
The boolean flags have one byte for each flag. This byte
is either 0 or 1 as the flag is present or absent. The
capabilities are in the same order as the file <term.h>.
Between the boolean section and the number section, a null
byte will be inserted, if necessary, to ensure that the
number section begins on an even byte (this is a relic of
the PDP-11's word-addressed architecture, originally
designed in to avoid IOT traps induced by addressing a
word on an odd byte boundary). All short integers are
aligned on a short word boundary.
The numbers section is similar to the flags section. Each
capability takes up two bytes, and is stored as a little-
endian short integer. If the value represented is -1, the
capability is taken to be missing.
The strings section is also similar. Each capability is
stored as a short integer, in the format above. A value
of -1 means the capability is missing. Otherwise, the
value is taken as an offset from the beginning of the
string table. Special characters in ^X or \c notation are
stored in their interpreted form, not the printing repre-
sentation. Padding information $<nn> and parameter infor-
mation %x are stored intact in uninterpreted form.
The final section is the string table. It contains all
the values of string capabilities referenced in the string
section. Each string is null terminated.
Note that it is possible for setupterm to expect a differ-
ent set of capabilities than are actually present in the
file. Either the database may have been updated since
setupterm has been recompiled (resulting in extra unrecog-
nized entries in the file) or the program may have been
recompiled more recently than the database was updated
(resulting in missing entries). The routine setupterm
must be prepared for both possibilities - this is why the
numbers and sizes are included. Also, new capabilities
must always be added at the end of the lists of boolean,
number, and string capabilities.
Despite the consistent use of little-endian for numbers
and the otherwise self-describing format, it is not wise
to count on portability of binary terminfo entries between
commercial UNIX versions. The problem is that there are
at least three versions of terminfo (under HP-UX, AIX, and
OSF/1) which diverged from System V terminfo after SVr1,
and have added extension capabilities to the string table
that (in the binary format) collide with System V and XSI
Curses extensions. See terminfo(5) for detailed discus-
sion of terminfo source compatibility issues.

Some limitations: total compiled entries cannot exceed
4096 bytes. The name field cannot exceed 128 bytes.
FILES
/usr/share/terminfo/*/* compiled terminal capability data
base
SEE ALSO
curses(3x), terminfo(5).
TERM(5)
Man(1) output converted with
man2html


Thanks for asking. I know that Chinese can be a challenging language to learn, and pronouncing a bizarre-looking romanization can be mildly frustrating. First, don't feel nervous. I totally understand it since I unintentionally mispronounce English words/names all the time. Simply try it. I should recognize your pronunciation fairly quickly.
Chinese name, like some other East Asian languages, such as Japanese, Korean, etc., places the surname before the given name. So in Chinese, my name is pronounced (and also written) as "Bao, Yunjia". But I accept both orderings, and it is convenient to use the English ordering to avoid confusions. For relatively close friends and colleagues, I welcome you to simply address me with my given name. In fact, I find calling only my given name by my friends quite a delightful experience.
Unlike many languages, Chinese is a tonal language, i.e. pitch and intonation are part of its phonology. This "tone" is an extra dimension other than vowels and consonants to distinguish words. I am also aware that this can be tricky. Don't be afraid. I understand this. For my name, try your best to reproduce the tone or simply ignore it. It's fine.
Excellent! That is how I usually romanize my name too! My name is bāo yún jiā.
This works too! My name is /pɑʊ̯⁵⁵/ /yn³⁵/ /t͡ɕi̯a̠⁵⁵/. (The superscript here denotes tone numerals. See wikipedia for more.)
Great! Here it is. The pattern in this audio is: "surname, given name, full name" (with the correct tones).
Trust me. You are not the only one who thinks that. It is rather a coincidence that my name contains two non-existing phonemes in English: the vowel, ü or /y/, and the consonant, j or /t͡ɕ/. This is why my name not only looks confusing but also sounds strange.
However, the first vowel is quite prevalent in many languages with subtle but phonetically indistinguishable differences. For English speakers, you may imagine this sound as a muffled combination of i as in pick and u as in true. But in reality, it is really one vowel sound.
The consonant is a little exotic but is still used by several languages. For English speakers, you can imagine it as a consonant in between j as in jump and z as in zero (and if you wish, with a little y as in yes). Again, this is just a consonant on its own instead of a mesh of all of aforementioned phonemes, but mixing them and finding the middle ground is a good starting point.
形容不识识乡音，挑尽寒灯到夜深。
Li, Changqi (李昌祈) Xiangrenzhiyehua 《乡人至夜话》
All content copyright: Yunjia Bao


A multi-disciplinary designer with a goal towards communicating visually.
UX/UI Design with curiosity towards software development (hence this website :D )
From sketching to ideating and creating, I'm into everything in between!
No design exists without understanding it's visual language, hence the interest!