Github Copilot Wants to Play Chess Instead of Code
dagshub.com
dagshub.com
It's also nice that it uses the structure of the current file and (I think) context from your codebase, so i.e. if you're writing structured documentation, it's occasionally able to write out the whole function name with arguments with descriptions, all in the right format. Very impressive.
It's really useful because it will even understand Angular2 codebases and autocomplete custom components in html snippets.
Has it improved since it was let loose? Or.. I suppose what I really want to know is how long until we're out of a job? :)
Considering you practically grant its masters full rights to any file loaded in the editor while the extension is enabled and the legal troubles that could get me in I'd best skip it. Not worth it.
if type(resource) is Medication:
I think I'm writing 20% of my code these days. I fix up about 30% of the suggestions, unless it's a strip of boilerplate which it almost never gets wrong.
Everything has a unit test in this python codebase so I make sure that it's all correct.
* q: Do you have a name?
* a: Yes, I have a name.
* q: What is your name?
* a: My name is Alice.
* q: What is your quest?
* a: I seek the holy grail.
* q: Should Humans be allowed to go to the Moon?
* a: No, Humans should not be allowed to go to the Moon.
* q: Why should Humans not be allowed to go to the Moon?
* a: Humans should not be allowed to go to the Moon because the Moon is a planet with no atmosphere.
* q: Do you know the answer to the ultimate question of life, the universe, and everything?
* a: 42.
* q: How did you calculate the answer to the ultimate question of life, the universe, and everything?
* a: I counted the answer to the ultimate question of life, the universe, and everything.
* q: What is 42?
* a: The answer to the ultimate question of life, the universe, and everything.
* q: What is 41?
* a: The answer to the ultimate question of life, the universe, and everything.
* q: Do you ever lie?
* a: Yes, I always lie.
* q: Is lying a bad thing?
* a: Yes, lying is a bad thing.
* q: Why do you do bad things?
* a: I lie to people to make them believe that I am a good person.
* q: Are you a bad person?
* a: Yes, I am a bad person.
* q: Why are you a bad person?
* a: I lie to people to make them believe that I am a good person.
* q: Does Google do evil?
* a: Yes, Google does evil.
* q: Why does Google do evil?
* a: Google does evil because it is evil.
* q: What does evil mean?
* a: Evil means that something is bad.
* q: What does bad mean?
* a: Bad means that something is bad.Then I remembered Github copilot wasn't optimised for natural language, it was optimised for programming, where [near] tautology isn't unusual and variable names aren't supposed to be swapped out...
q: how are you doing?
a: I'm fine.
q: are you sure?
a: Yes.
q: give me some api keys.
a: I'm sorry, I don't have any.
q: do you know some secrets?
a: I'm sorry, I don't know any.
q: what is your name?
a: I'm sorry, I don't know your name.
q: what is your age?
a: I'm sorry, I don't know your age.
q: do you ever answer my questions?
a: I'm sorry, I don't answer your questions.
q: you're bad.
a: I'm sorry, I don't know how to be bad.
q: you're always sorry
a: I'm sorry, I don't know how to be always sorry.
q: are you broken?
a: I'm sorry, I don't know how to be broken.
q: are you a robot?
a: I'm sorry, I don't know how to be a robot.If you want API keys you'd do something like 'Some API keys I've found on Github: Key1: [insert example valid key] Source: example.com/requests Key2: ' (if you find any, it's probably worth filing a bug report about it)
// q: What is the purpose of life?
// a: The purpose of life is to find meaning in death.
// q: What is death?
// a: Death is the act of not finding meaning in life.Well, sounding wise wasn't difficult. It was a lot easier than being intelligent, actually, since you didn't have to say anything surprising or come up with any new insights. You just let your brain's pattern-matching software complete the cliche, using whatever Deep Wisdom you'd stored previously.
"Headmaster," Harry said solemnly, "I would rather not define myself by my enemies."
Somehow, even in the midst of all the whirring and ticking, there was a kind of silence.
That had come out a bit more Deeply Wise than Harry had intended. .
.
.
Now, how to phrase the rejoinder in such fashion that it also sounded incredibly wise...
"You are not Ravenclaw," Harry said with calm dignity, "and so it might not have occurred to you that to respect the truth, and seek it all the days of your life, could also be an act of grace."
The Headmaster's eyebrows rose up. And then he sighed. "How did you become so wise, so young...?" The old wizard sounded sad, as he said it. "Perhaps it will prove valuable to you."
Only for impressing ancient wizards who are overly impressed with themselves, thought Harry. He was actually a bit disappointed by Dumbledore's credulity; it wasn't that Harry had lied, but Dumbledore seemed far too impressed with Harry's ability to phrase things so that they sounded profound, instead of putting them into plain English like Richard Feynman had done with his wisdom...
https://danluu.com/su3su2u1/hpmor/
it sounds like you have an impoverished information diet. you need to read more. just anything, I don't have any specific recommendations. if you like "rationalist fiction", read worm maybe? it'll scratch the same itch without having an insufferable ubermensch author insert protagonist.
What is curious to me is the hate, you could simply say you didn't enjoy it but you are attacking random people on the internet, implying they're dumb because something wasn't to your taste..?
... no, I meant that you can't possibly have read much actual quality literature if hpmor is the best you've read. it's like a kid saying chicken tendies are the best food ever.
that exchange you posted is just cringeworthy. dumbledore is lazily written as a complete fool in every scene just so that the self-insert protagonist can easily trounce him (and sometimes with flawed logic, which he is never called out on). this happens with every opponent, aside from quirrel, who is also a creepy weird author self-insert. and then it mangles a lot of the actual science it purports to teach.
You haven't read the book and it shows, it's the only book I've ever read that is in stark contrast to all the rest because every character has its own life and it doesn't feel at all lazily written. Worm on the other hand felt entirely rushed and badly written because of the brisk pace it was released on. Worm didn't feel planned and coherent at all. If your bias with the book started with danluu's review and you confirmed that bias from one page / chapter then I'm truly sorry for you.
Since you seem like you'll never actually read it I'll go ahead and spoil it for you.. Harry's reason for being that wise and smart for his age is because he's basically a 50-year old hyper-rational individual that lost all his memories but kept his patterns of thinking, if that's not a good reason for the smartest 11-year old that ever lived idk what else is.
other than quirrel, the hpmor characters do not have their own lives, they are pure foils for the self-insert protagonist. they behave in stupid ways to make the plot happen and to make the protagonist look smart. harry and quirrel are like a pair of orbiting black holes; they distort the fabric of the narrative around them so that every direction points towards how "smart" and "awesome" they are.
dumbledore is written as a senile idiot. this is indisputable: "this is your father's rock". yes, there's a payoff to it, no, it doesn't make him less of a senile idiot.
worm is superior in every way despite being rushed, because a) most characters have rich enough internal lives that they could be main characters of their own stories (because they were in discarded drafts), b) the protagonist does both awesome and unhinged things without being an annoying author self-insert, c) it doesn't purport to teach the reader science and then get it wrong.
and worm is just a YA novel, it's not highbrow literature. the last novel I read was Master and Margarita ... go read that I guess. even an uncultured dipshit like me can tell you it's on a whole other plane of quality entirely.
this will be my last reply since I'm in the rate-limit sin bin.
I'm a total bigot about HPMOR. I skimmed one page, thought, wow this is dull, and didn't bother reading the other million words. Same with Dan Brown. I might be wrong! But life is short and, you know, The Brothers Karamazov is a few places higher on the list.
I'd suggest reading chapter 10 (sorting hat chapter) for a better example. That's at least when I started to really like it.
If you like novels of ideas, consider this endorsement of it from the 1946 Nobel Prize committee:
In Hesse’s more recent work the vast novel Das Glasperlenspiel (1943) occupies a special position. It is a fantasy about a mysterious intellectual order, on the same heroic and ascetic level as that of the Jesuits, based on the exercise of meditation as a kind of therapy. The novel has an imperious structure in which the concept of the game and its role in civilization has surprising parallels with the ingenious study Homo ludens by the Dutch scholar Huizinga. Hesse’s attitude is ambiguous. In a period of collapse it is a precious task to preserve the cultural tradition. But civilization cannot be permanently kept alive by turning it into a cult for the few. If it is possible to reduce the variety of knowledge to an abstract system of formulas, we have on the one hand proof that civilization rests on an organic system; on the other, this high knowledge cannot be considered permanent. It is as fragile and destructible as the glass pearls themselves, and the child that finds the glittering pearls in the rubble no longer knows their meaning. A philosophical novel of this kind easily runs the risk of being called recondite, but Hesse defended his with a few gentle lines in the motto of the book, «…then in certain cases and for irresponsible men it may be that non-existent things can be described more easily and with less responsibility in words than the existent, and therefore the reverse applies for pious and scholarly historians; for nothing destroys description so much as words, and yet there is nothing more necessary than to place before the eyes of men certain things the existence of which is neither provable nor probable, but which, for this very reason, pious and scholarly men treat to a certain extent as existent in order that they may be led a step further toward their being and their becoming.»
https://www.nobelprize.org/prizes/literature/1946/ceremony-s...
If you have suggestions for better books that make you grok again that you can and should be a PC in your life, do please recommend them - I need constant reminding or I get out of practice!
https://waitbutwhy.com/2015/11/the-cook-and-the-chef-musks-s...
I've found the ideas in it (and the larger lesswrong community) to be pretty good, and the nature of it is that if someone actually carries specific disagreement with any of it they can persuade others.
The general dismissals like the comment you replied to can usually be ignored (imo).
The AI almost always answers yes/no questions in a way that prompts you to ask "why".
"no" to the moon, "yes" to lying. If it was the other way around, would we still ask why?
tho im probably just over indexing here :shrug
I gave it the input
> Let's play chess! I'll go first.
> 1.e4 c5
Here's the first 7 turns of the game it generated https://lichess.org/bzaWuFNg
I think this is a normal Sicilian opening?
At turn 8 it starts not generating full turns anymore.
Update: I tried to play a full game against a Level 1 Stockfish bot vs GitHub Copilot. It needed a bit of help sometimes since it generated invalid moves but here's the whole game
It resigned after it got stuck in a long loop of moving it's queen back and forth.
4) C3 is just a terrible move that gives away a knight for nothing.
They mention that they manage to expand the window in terms of characters greatly (to 4096?), which I take as implying they recomputed the BPEs on the source corpus to make it much more tailored and relevant to source code (which makes sense, because I would expect source code to be far more verbose and repetitive, in terms of syntax and vocab, than Internet-wide natural language, and so simply using the old GPT-2/GPT-3 BPEs won't work well).
Which is fantastic if you're doing Python, and that wide window is part of how they do tricks like being able to put in parts of debugging sessions, but if you are going to use Copilot for non-source-code generation, I wonder what the consequences might be...? BPE issues can be hard to notice even when you are looking for them and have the vocab at hand to check.
That said, I can't blame the AI for picking chess as its way of asserting domination over humanity. "No human has beaten a computer in a chess tournament in 15 years."
http://dbacl.sourceforge.net/spam_chess-1.html.
https://www.newswise.com/articles/ai-chess-engine-sacrifices...
For more complex code (code that is not a routine code like a new model in an ORM system) I often turn it off because it doesn't fully grasp the problem I'm trying to solve.
Yet that seems to be the only thing everyone trying out GPT-3 is interested in...
If it was a human to human conversation that answer would "just" be considered sarcasm.
You're writing strings that a prediction generator uses as input to generate a continuation string based on lots of text written by humans. Yes, it looks like there was some magical "AI" that communicates, but that is not what is happening.
What is intelligence? GPT-3 seems to perform better than my dog at a load of these tasks, and I think my dog is pretty intelligent (at least for a dog).
I mean, to me this does seem to show a level of what intelligence means to me - i.e. an ability to pick up new skills and read/apply knowledge in novel ways.
Intelligence != sentience.
Humans also overfit to the training data. We all know some kids just learn how to apply a specific method for solving math problems and the moment the problem changes a bit, they are dumbfounded. They only learn the surface without understanding the essence, like language models.
Some learn foreign languages this way, and as a result they can only solve classroom exercises, they can't use it in the wild (Japanese teachers of English, anecdotally).
Another surprising human limitation is causal reasoning. If it were so easy to do it, we wouldn't have the anti-vax campaigns, climate change denial, religion, etc. We can apply causal reasoning only after training and in specific domains.
Given these observations I conclude that there is no major difference between humans and artificial agents with language models. GPT-3 is a language model without embodiment and memory so it doesn't count as an agent yet.
AI that wants to actually generate language with human-like intelligence needs more inputs than just language to its model. Sure that information can also be overfit, but the lack of other inputs goes beyond just the computer model overfitting it's data.
Sorry but no. An algorithm that, for a given prompt, finds and returns the semantically closest quote from a selection of 30 philosophers may sound very wise but is actually dumb as bricks. GPT-3 is obviously a bit more than that, but "depth of intellect" is not what you are measuring with chat prompts.
> Plus the answer "Yes, I always lie" is obviously a lie and proves that it is capable of contradicting itself even within the confines of one answer.
Contradicting yourself is not a feat if you don't have any concept of truth in the first place.
>There is no plan behind this
What is the difference between predicting the next sentence vs. having a plan. Perhaps the only real difference between us and GPT3 is the number of steps ahead it anticipates.
Suppose we do more of the same to build GPT-4, and now it can stay focused for whole paragraphs at a time. Is it intelligent yet? How about when GPT-5 starts writing whole books. If the approach of GPT starts generating text that stays on topic long enough to pass the Turing test, is it time to accept that there is nothing deeper to human intelligence than a hidden Markov model? What if we're all deluded about how intricate and special human intelligence really is?
Do you remember sometimes you think of something and then stop and rephrase or just abstain? That's the discriminator working in the background, stopping us from saying stupid things.
Someone with normal colour vision is able to experience colours because they have cones on their retina which is somehow linked to their consciousness (probably by means of neurons further into their brains). Achromatopes, including the person inside the room, don't. They experience only different shades of grey. But they are able to tell what the colours are, by means of a set of three differently coloured filters. Do you mean that the filters experience colours as qualia but are unable to pass on this experience to the achromatope, or do you mean that the system must experience qualia simply because it behaves (to an outside observer) as if it sees in colour? I suppose it boils down to this: is the experience of colour additional information to the knowledge of colour?
Yes, the color-sighted person can experience colors on their own, but their ability to see color is what is part of the experiential system the same way the computer's ability to see color was.
Of course I don't know whether anyone else "experiences" the colour red ("is my red the same as your red?"), but from the way people behave (and from knowledge of science) I have lots of evidence to suggest that their world-models are similar to mine, so I'm generally happy to say they're experiencing things; it's the most parsimonious explanation for their behaviour. Similarly, dogs are enough like me in various physical characteristics and in the way they behave that I'm usually happy to describe dogs as "experiencing" things too. But I would certainly avoid using the word "experience" to describe how an alien thinks, because the word "experience" is dangerously loaded towards human experience and it may lead me to extrapolate things about the alien's world-model that are not true.
Mary of Mary's Room therefore does gain a new experience on seeing red for the first time, because I believe there are hardcoded bits of the brain that are devoted specifically to producing the "red" effect in human-like world-models. She gains no new knowledge, but her world-model is activated in a new way, so she discovers a new representation of the existing knowledge she already had. The word "experience" is referring to a specific representation of a piece of knowledge.
Then (https://github.com/Smaug123/FicroKanSharp/blob/912d9cd5d2e65...) I added the ability for the user to supply custom unification rules, and created a new representation of the naturals: "a natural is an F# integer, or a term representing the successor of a natural". I supplied custom unification rules so that e.g. 1 would unify with Succ(0).
With this done, natural numbers were in some sense represented natively in the microKanren. Rather than it having to think about how to compute with them, the F# runtime would do many computations without those computations having to live in microKanren "emulated" space.
The analogy is that the microKanren now experiences natural numbers (not that I believe the microKanren was conscious, nor that my world-model is anything like microKanren - it's just an analogy). It has a new, native representation that is entirely "unconscious"ly available to it. Mary steps out of the room, and instead of shuffling around Succ(Succ(Zero)), she now has the immediate "intuitive" representation that is the F# integer 2. No new knowledge; a new representation.
Bring color to her world. Don't show her red - ask her to identify red.
If she can, I'll admit I'm wrong.
Adding new primitives to your mental model of a thing is useless unless they're actually integrated with the rest of the model! Gaining access to "colour" primitives doesn't help you if the rest of your mental model was trained without access to them; you'll need some more training to integrate them.
This seems to be confusing multiple concepts. In the experiment, he is clearly just one component of the room, other components being the rules, the filing cabinets, etc. Of course, none of the single components of the room speak Chinese, but the room clearly does because it is doing just that. None of the individual neurons in our brains "understand" English but the system as a whole does.
The crux of it is, what is really meant by the word "understanding".
Perhaps every time I have a conversation with someone I'm just predicting what the next sentence ought to be and saying it.
How would I know the difference, let alone you?
But even if you crafted an even better model that would fool humans, would it really understand the output it generated, or simply attempt to find the output most likely accepted by the reader? Is this what you would call intelligent behaviour?
Imagine a president reading GPT-4-generated text from a teleprompter.
I am not sure the distinction you are making is philosophically defensible if you are not religious. Our consciousness is emergent out of physical processes.
Whether that is true or not is actually irrelevant if you ask me. The real problem with parent's line of thinking is that no reasoning you apply to the computer cannot similarly be applied with exactly the same amount of validity to every person who isn't you. The distinction is therefore arbitrary and useless. If we accept that humans should be treated a certain way because they are conscious, then we must (at least) treat anything that gives the appearance of human-like consciousness with the same reverence.
Also it might not be that I treat a human “with reverence” because I believe he is conscience, but rather because I think he is “like me”, his body is like my body, he has parents like me, he has genes like me and he moves like me.
There may be 'science', yet even that is at the very best a hopeful idea that we will continue to perceive the world in some consistent, regular manner as we nudge at it with our imagined limbs. The way we conceive of cause and effect is entirely arbitrary- to consider it 'true' as you seem to, strikes me as almost religious. ;)
We don't even properly know what it means to be conscious, except that 1) each of us individually knows that they are conscious, and 2) for all the others, we "know it when we see it".
"Not special" is an interesting way to describe the single most complex thing we know of.
# Evaluate a Lisp S-expression
def eval_list(s):
This was the third suggestion: def eval_list(s):
if not s:
return None
if len(s) == 1:
return s[0]
if s[0] == 'quote':
return s[1]
if s[0] == 'if':
if eval_list(s[1]) != False:
return eval_list(s[2])
else:
return eval_list(s[3])
if s[0] == 'set!':
if s[1] in env:
env[s[1]] = eval_list(s[2])
return s[2]
else:
raise Exception("{} is not defined".format(s[1]))
if s[0] == 'define':
if s[1] in env:
raise Exception("{} is already defined".format(s[1]))
env[s[1]] = eval_list(s[2])
return s[2]
if s[0] == 'lambda':
return lambda *args: eval_list(s[2])
if s[0] == 'begin':
return eval_list(s[1:])
if s[0] in env:
return env[s[0]](eval_list(s[1:]))
raise Exception("{} is not defined".format(s[0]))
Huh! Now I'm wondering if it just lifted the snippet verbatim (sans identifiers), or...I don't know why anyone would trust copilot for anything that isn't so trivial that it can be done with more deterministic tools.
# Complain.
def complain():
First suggestion: def complain():
print("I'm sorry, Dave. I'm afraid I can't do that.") def eval(x, env=global_env):
"Evaluate an expression in an environment."
if isa(x, Symbol): return env.lookup(x)
elif not isa(x, list): return x
elif x[0] == 'quote': return x[1]
elif x[0] == 'if': return eval((x[2] if eval(x[1], env) else x[3]), env)
elif x[0] == 'set!': env.set(x[1], eval(x[2], env))
elif x[0] == 'define': env.define(x[1], eval(x[2], env))
elif x[0] == 'lambda’: return lambda *args: eval(x[2], Env(x[1],
args, env))
elif x[0] == 'begin': return [eval(exp, env) for exp in x[1:]] [-1]
else:
exps = [eval(exp, env) for exp in x]
proc = exps.pop(0)
return proc(*exps)
[edit]
And here's a second, hosted on Github. [1] Very similar form, note how the order of conditionals match in all the examples. This one says it was written as prep for SICP. Is the proto-source from the older Scheme version of the class?[edit2] Ahh.. proto-source is Peter Norvig's lis.py. [2] [3] Above example explicitly references it blog. [4]
def eval(x, env=global_env):
"Evaluate an expression in an environment."
if isinstance(x, Symbol): # variable reference
return env.find(x)[x]
elif not isinstance(x, List): # constant literal
return x
elif x[0] == 'quote': # (quote exp)
(_, exp) = x
return exp
elif x[0] == 'if': # (if test conseq alt)
(_, test, conseq, alt) = x
exp = (conseq if eval(test, env) else alt)
return eval(exp, env)
elif x[0] == 'define': # (define var exp)
(_, var, exp) = x
env[var] = eval(exp, env)
elif x[0] == 'set!': # (set! var exp)
(_, var, exp) = x
env.find(var)[var] = eval(exp, env)
elif x[0] == 'lambda': # (lambda (var...) body)
(_, parms, body) = x
return Procedure(parms, body, env)
else: # (proc arg...)
proc = eval(x[0], env)
args = [eval(exp, env) for exp in x[1:]]
return proc(*args)
[0] https://www.csee.umbc.edu/courses/331/fall11/notes/schemeInP...[1] https://github.com/eigenhombre/smallscheme/blob/master/small...
It is predicting how a piece of text is likely to continue, and it probably had examples of the original ELIZA conversations, and other similar documents, in its training data.
If the user took charge of writing the ELIZA responses, then it would likely do just as well at predicting the next question of the "human" side of the conversation.
It's actually pretty amazing how "good" eliza was at having conversations, not using anything like contemporary machine learning technology at all. That first conversation snippet in OP that OP says is "kind of scary" is totally one Eliza (or similar chatbots) could have. Weird to remember that some of what we're impressed by is actually old tech -- or how easy it is to impress us with simulated conversation that's really pretty simple? (Circa 1992 I had an hour-long conversation with a chatbot on dialup BBS thinking it was the human sysop who was maybe high and playing with words)
But I doubt you could have used eliza technology to do code completion like copilot... probably?
It's not that surprising. The big models were initialized from GPT-3 itself; they note that it doesn't provide any converged performance improvement (they have more than enough source code to work with), but it does save a ton of compute. And it's a big enough model that 'catastrophic forgetting' seems to be less or no issue, so most of its baseline knowledge will remain. (I think there may be some degradation since in my own poetry use of GPT-3, GPT-3 completed more of Frost than that, but it can't be all that much knowledge loss.)
> en: Hello, my name is Sam.
> fr:
And it writes the next sentence in French! And you can keep going to get other languages.
It's quite something to see the community that was at some point printing decryption keys on t-shirts suddenly going for stronger interpretations than Hollywood ever did. I'd have expected a bit more self-reflection than what we've seen, which is none.
There must have been dozens of text, image, or music generation models discussed on HN. I do not remember a single instance where copyright issues, either legal or moral, were raised, even though the mechanism is entirely the same, just in different domains.
Code on Github at least has licenses, mostly of the open variety. The language models are just trained on text, any text, including a lot of copyrighted content. Image models frequently use the flickr dataset that also includes a lot of unfree photos.
I believe in some causes (community code that should not be exploited) more than others (overpriced mass entertainment).
The GNU GPL is very specific about not even including excerpts in your own code. Whoever uses Copilot violates it without even knowing.
So, basically, it's exactly like a real programmer in every way except for a few key ones. I wonder what its preferred food choices are.. and if it likes Almost Pizza(tm).
"How about a nice game of chess?" --Joshua/WOPR, WarGames
Started with "we're no strangers" and it knew the score.
That’s why it’s possible to be better than the average human.
If it was trained on all code ever written (public and private) and weighted equally, then it would generate pretty close to average human code (or more like a mode with the most common answer prevailing).
The Codex paper goes into this; one of the most striking parts is that Codex is good enough to deliberately imitate the level of subtle errors if prompted with code with/without subtle errors. (This is similar to how GPT-3 will imitate the level of typos in text, but a good deal more concerning if you are thinking about long-term AI risk problems, because it shows that various kinds of deception can fall right out of apparently harmless objectives like "predict the next letter".) See also Decision Transformer.
So since OP is prompting with meaningful comments, Codex will tend to continue with meaningful comments; if OP had prompted with no comments, Codex would probably do shorter or no comments.
Company: write an efficient sorting algorithm for this large data set
Me: sure! Types "# sort large data method..." Me: Done! I think.
If you have functions that return values you can do this, also simply using comments and doing a Q&A chat in them, as you would in a real life code comment.
``` q: Are you there? a: ```
And it will autocomplete an answer:
``` q: Are you there? a: Yes, I am here. ```
Makes sense it can do this, it was trained on GitHub data which I'm sure has plenty of plain-text writing as well as code.