Source code: Lib/logging/__init__.py...
Similar names: flask.logging, disnake.logging, discordpy.logging, rich.label.logging, rich.doc.logging, arcade.logging, pytest.logging, aiohttp.logging, nextcord.logging
1 messages · Page 323 of 1
Source code: Lib/logging/__init__.py...
there's part where you setup a logger and part where you set up the handler, iirc
Typically import logging then get the logger named as the module
logger = logging.getLogger(__name__)
import logging, logging.handlers
import os # TODO: Change to pathlib
def setup_logging(log_directory: str) -> None:
"""Set up the logging for the application. Will also print to the CLI.
...
Parameters
----------
log_directory : str
The system path in which the log should be printed.
"""
log_file = os.path.join(log_directory, "whitelist.log")
if not os.path.exists(log_directory):
os.makedirs(log_directory)
file_handler = logging.FileHandler(log_file, mode="a")
file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
file_handler.setFormatter(file_formatter)
console_handler = logging.StreamHandler()
console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
console_handler.setFormatter(console_formatter)
logging.basicConfig(level=logging.INFO, handlers=[file_handler, console_handler])
Thanks, typing that out on mobile was going to take me like 10 minutes lol
this you call once, and that's not where logger is created
logger is defined at module scope right after imports, normally
You got it
That will give you a logger
The loggers form a hierarchy based on their dotted names
The root logger is just and empty string
inside config.py you can logger.error instead of logging.error
__name__ is just module name
Usually, you just set up handlers on the root logger

Man I haven’t actually programmed in like 2 months, just realised
with optional Timber support
lmao
for Ruby too
and Go
... and js https://github.com/ngworker/lumberjack
!pypi lumberjack-logging
@rugged root ^
You know near prisons they have signs telling you not to pick up hitchhikers lol
My phone is about to die sorry cya
Yeah
oh hell I opened it it's gold
that video uses Turbo C++ as an IDE
from components.check_player import (is_player_in_json, is_player_in_database)
Gtg phone is dying 👋
Lmao I was trying to avoid that convo 🤣
Hello peoples!
hi
hewo peeps
hey
hai hai
what yll in vc for
im just doing stable diffusion inpainting stuff
i see
i see you created an anime AI
replacing my use of adetailer because of two things, agpl license, and my pull request to the project have been ignored for months
yeah, i have a video pipeline too, but it's not done yet, i need to remove so much of the agpl license stuff
you seem passionned about it :p
i dislike the AGPL. they claim it's open source and nothing about it is opensource.
Oh the generation stuff, yeah
how old are you
im not saying my age smh
tru dat
i can get into the bars
lmfao
:)
im just curious man
wanna help me fight the ppl in general chat
fighting is bad
fighting is gud
not really, i fight colds and viruses when i'm sick
builds charactor
fighting is neutral
neuh
and I am nowhere near stoned nor drunk enough to go anywhere near general chat until midnight utc. then it's showtime.
i am in the stone
only a few minutes left until the server icon changes and a whole bunch of bigots lose their minds.
do the voicechat with us
i cant code and talk
well then no code just talk
coding > talking to you ❤️
is that greater then or less then
greater
both and neither
bruh, i am the greatest
i am the goat
im sure you believe that
i dont believe it, it is factual
unlike your code
are you strong
bruh join vc now or else face thy wrath
im shy
me too, we will get over shyness together
i must break shy
console.log("Script is running");
let config = {
type: Phaser.AUTO,
width: 1280,
height: 720,
parent: 'game-container',
backgroundColor: 'black',
scene: {
preload: preload,
create: create
}
};
let game = new Phaser.Game(config);
function preload(){
this.load.image('player', 'smileyface.png');
console.log('Preloading image');
}
function create() {
this.player = this.add.sprite(100,100, 'player');
console.log('Creating sprite');
const square = new Phaser.GameObjects.Rectangle(this, 300, 400, 50, 50, 0xff0000)
this.add.existing(square)
}
function update(time, delta){
this.square.y -= 10 * (delta / 1000)
}```
plz explain why broke
seems cuddly me joineth?
nah ima guy
you sure
yes im sure ima guy
it's 2024, are you really sure?
exactly
rigggght
okay you just gotta believe me
@balmy phoenix @silk prism plz explain why code no work
i coded your mom into my bed last night
whats the error
theres is no error which makes it annoying
then whats the 'mistake'
whats supposed to happen you bum xoxo
> [2024-05-31T23:43:55.759Z] "GET /" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
(node:27160) [DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
(Use `node --trace-deprecation ...` to show where the warning was created)
[2024-05-31T23:43:55.794Z] "GET /style.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
[2024-05-31T23:43:55.797Z] "GET /script.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
[2024-05-31T23:43:55.797Z] "GET /node_modules/phaser/dist/phaser.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
[2024-05-31T23:43:55.973Z] "GET /favicon.ico" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
[2024-05-31T23:43:55.975Z] "GET /favicon.ico" Error (404): "Not found"
[2024-05-31T23:43:56.327Z] "GET /smileyface.png" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
```server logs
a smiley face is supposed to render it doesnt
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TITLE HERE</title>
<link rel="stylesheet" href="style.css">
<script src="node_modules/phaser/dist/phaser.js"></script>
</head>
<body>
<div id="game-container"></div>
<script src="script.js"></script>
</body>
bruh tmi, join VC
im busy ifyk
why isnt this file rendering
ayo how old are you
22
lemme help ifyk
you male
yes lol
im not that down bad to become g*y
ayy dont worry no homo
name = nobdfasd()
Restrict all code to very simple control flow constructs—do not use goto statements, setjmp or longjmp constructs, or direct or indirect recursion.
Give all loops a fixed upper bound.
Do not use dynamic memory allocation after initialization.
No function should be longer than what can be printed on a single sheet of paper in a standard format with one line per statement and one line per declaration.
The code's assertion density should average to minimally two assertions per function.
Declare all data objects at the smallest possible level of scope.
Each calling function must check the return value of nonvoid functions, and each called function must check the validity of all parameters provided by the caller.
The use of the preprocessor must be limited to the inclusion of header files and simple macro definitions.
Limit pointer use to a single dereference, and do not use function pointers.
Compile with all possible warnings active; all warnings should then be addressed before the release of the software.
nasa?
Thanks ChatGPT
but oddly reworded
(idk which one is a rewording)
((wikipedia one is reworded, not the message))
@molten bronze help with what
@spare galleon did you send an invite or what?
invites are on whitelist basis
as for other domains -- idk
!paste
If your code is too long to fit in a codeblock in Discord, you can paste your code here:
https://paste.pythondiscord.com/
After pasting your code, save it by clicking the Paste! button in the bottom left, or by pressing CTRL + S. After doing that, you will be navigated to the new paste's page. Copy the URL and post it here so others can see it.
no i sent a link to the website, dontasktoask
don'tasktoask is banned? i don't even know what that site is
console.log("Script is running");
let config = {
type: Phaser.AUTO,
width: 1280,
height: 720,
parent: 'game-container',
backgroundColor: '#ffffff',
scene: {
preload: preload,
create: create,
}
};
let game = new Phaser.Game(config);
function preload(){
this.load.image('player', 'smileyface.png');
console.log('Preloading image');
}
function create() {
this.player = this.add.sprite(100,100, 'player');
console.log('Creating sprite');
const square = new Phaser.GameObjects.Rectangle(this, 300, 400, 50, 50, 0xff0000)
this.add.existing(square)
}
function update(time, delta){
this.square.y -= 10 * (delta / 1000)
}
it still doesnt work and now my square dont render also
why is banned?
jokes on you its not python
jokes on you there's a language selector
ohhh lol
to guess?
@spare galleon jump to voice chat 1
ohh i thought u were saying i should guess
i got confused
@balmy phoenix help
im more a python guy tbh
but help me iyk
bro gpt4 cant help me with that
no look now
pay me
try reading the #rules sometime
how i can show the error
!rule 15
how much
:x: Invalid rule indices: 15
!rule 10
play me BTD battles2
I won't see the initial stages of because going to sleep
now
gotcha
how can i ask python help
its changed for me already
So far they seem to be asleep.
no
why not
dont wanna
@balmy phoenix helppp\
too tired
but you playing btd6
no i want your help
cause cute cvat
round 300 with seventeen top path planes. it's a slide show
but im not good with js
thats why BTD batlles 2
im not gud wit your mom yet i try
No i'm trying to beat my planes only pb
and play me battles2
maybe if i get past round 350
kk
console.log("Script is running");
let config = {
type: Phaser.AUTO,
width: 1280,
height: 720,
parent: 'game-container',
backgroundColor: '#4488AA',
scene: {
preload: preload,
create: create
}
};
let game = new Phaser.Game(config);
function preload(){
this.load.image('player', 'smileyface.png');
console.log('Preloading image');
}
function create() {
this.player = this.add.sprite(100,100, 'player');
console.log('Creating sprite');
const square = new Phaser.GameObjects.Rectangle(this, 300, 400, 50, 50, 0xff0000)
this.add.existing(square)
}
function update(time, delta){
this.square.y -= 10 * (delta / 1000)
}
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
::1 - - [31/May/2024 19:13:01] "GET / HTTP/1.1" 200 -
::1 - - [31/May/2024 19:13:01] code 404, message File not found
::1 - - [31/May/2024 19:13:01] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:13:01] code 404, message File not found
::1 - - [31/May/2024 19:13:01] "GET /node_modules/phaser/dist/phaser.js HTTP/1.1
" 404 -
::1 - - [31/May/2024 19:13:01] "GET /script.js HTTP/1.1" 200 -
::1 - - [31/May/2024 19:13:01] code 404, message File not found
::1 - - [31/May/2024 19:13:01] "GET /favicon.ico HTTP/1.1" 404 -
::1 - - [31/May/2024 19:13:06] code 404, message File not found
::1 - - [31/May/2024 19:13:06] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:07] "GET / HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:07] code 404, message File not found
::1 - - [31/May/2024 19:15:07] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:07] "GET /script.js HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:07] "GET /smileyface.png HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:25] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:25] code 404, message File not found
::1 - - [31/May/2024 19:15:25] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:26] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:26] code 404, message File not found
::1 - - [31/May/2024 19:15:26] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:26] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:26] code 404, message File not found
::1 - - [31/May/2024 19:15:26] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:26] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:26] code 404, message File not found
::1 - - [31/May/2024 19:15:26] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:27] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:27] code 404, message File not found
::1 - - [31/May/2024 19:15:27] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:29] "GET / HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:29] code 404, message File not found
::1 - - [31/May/2024 19:15:29] "GET /style.css HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:29] "GET /script.js HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:29] "GET /smileyface.png HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:29] code 404, message File not found
::1 - - [31/May/2024 19:15:29] "GET /favicon.ico HTTP/1.1" 404 -
::1 - - [31/May/2024 19:15:43] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:15:43] "GET /style.css HTTP/1.1" 200 -
::1 - - [31/May/2024 19:15:43] "GET /script.js HTTP/1.1" 304 -
::1 - - [31/May/2024 19:16:28] "GET / HTTP/1.1" 304 -
::1 - - [31/May/2024 19:16:28] "GET /style.css HTTP/1.1" 304 -
::1 - - [31/May/2024 19:16:28] "GET /script.js HTTP/1.1" 200 -
::1 - - [31/May/2024 19:16:29] "GET /smileyface.png HTTP/1.1" 304 -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TITLE HERE</title>
<link rel="stylesheet" href="style.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/phaser/3.80.1/phaser.min.js"></script>
</head>
<body>
<div id="game-container"></div>
<script src="script.js"></script>
</body>
</html>
python -m http.server 5000
whoever was looking for the US Gov Definition of Open Source Software
https://www.acquisition.gov/epaar/§-1552.239-71-open-source-software./
um not sure why, but that period is supposed to be part of the link
@lusty ermine 👋
Hii @somber heath
I have completed my code, How can host it with using python flask
Ok @somber heath
Hello @whole bear
i cant turn on mic
how do you have then/
whats this Active for at least three different ten-minute blocks
@whole bear #voice-verification
i need to complete this one
Active for at least three different ten-minute blocks
yes
yes
i know little bit
print('Hello World')
or def my_function
you from india?
Ohh u from turkey??
cna you teach me
u r muslim?
me too
im pakistan
ok
but like where do i start
k
yes
@dire pebble Can you send me also?
yea i use it
@upper basin Is this good for learning linear algebra?
I'm checking it out now.
Ok thanks
Yeah seems good. It's good that it introduces tensors as well.
Ok so I should start it?
Ok thanks
so boring
what?
super().__init__()
!e
class Base:
def method(self):
print(1)
class Derived(Base):
def method(self):
print(2)
def method_base(self):
super().method()
def method_self(self):
self.method()
Base().method()
Derived().method()
Derived().method_base()
Derived().method_self()
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 1
002 | 2
003 | 1
004 | 2
@lost mauve 👋
i dont have perm to talk
!voice
Can’t talk in voice chat? Check out #voice-verification to get access. The criteria for verifying are specified there.
super() is somewhat special because it infers things from context
!e
class Base:
@classmethod
def method(cls):
print(1)
class Derived(Base):
@classmethod
def method(cls):
print(2)
@classmethod
def method_base(cls):
super().method()
@classmethod
def method_cls(cls):
cls.method()
Base.method()
Derived.method()
Derived.method_base()
Derived.method_cls()
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 1
002 | 2
003 | 1
004 | 2
.
the main meaning behind that line is:
ensure the base part of the object is in a well-defined/well-constructed state
!e
class Base:
def __init__(self):
self.__state = "something"
def method(self):
print(self.__state)
class Derived(Base):
def __init__(self):
self.__state = "something else"
Derived().method()
:x: Your 3.12 eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "/home/main.py", line 11, in <module>
003 | Derived().method()
004 | File "/home/main.py", line 5, in method
005 | print(self.__state)
006 | ^^^^^^^^^^^^
007 | AttributeError: 'Derived' object has no attribute '_Base__state'
!d itertools
This module implements a number of iterator building blocks inspired by constructs from APL, Haskell, and SML. Each has been recast in a form suitable for Python.
The module standardizes a core set of fast, memory efficient tools that are useful by themselves or in combination. Together, they form an “iterator algebra” making it possible to construct specialized tools succinctly and efficiently in pure Python.
For instance, SML provides a tabulation tool: tabulate(f) which produces a sequence f(0), f(1), .... The same effect can be achieved in Python by combining map() and count() to form map(f, count()).
many things there are classes
even though they might feel like functions
map too
!e
print(map, filter)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
<class 'map'> <class 'filter'>
!e
print(print)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
<built-in function print>
!e
def f():
pass
def g():
return
def h():
return None
print(f(), g(), h())
:white_check_mark: Your 3.12 eval job has completed with return code 0.
None None None
!e py result = print('Hello, world.') print(result)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | Hello, world.
002 | None
!e py result = print('Hello, world.')
:white_check_mark: Your 3.12 eval job has completed with return code 0.
Hello, world.
enhancement?
@buoyant bramble 👋
🫰
:ok_hand: applied timeout to @whole bear until <t:1717235507:f> (10 minutes) (reason: duplicates spam - sent 4 duplicate messages).
The <@&831776746206265384> have been alerted for review.
hello
discord.js? is for discord bots
Kieran, you just need to know what stuff you want to test with Actions, and then use YAML to write them.
I was in the same boat.
!projects
The Kindling projects page on Ned Batchelder's website contains a list of projects and ideas programmers can tackle to build their skills and knowledge.
The timing was impeccable
why? we don't want money
@green bone vc 0
@dark swan There is a moderator VC1.
french?
bonjour
ahahaha
I'm Canadian :p
I only got up like 1hr ago, but good myself!
NH is already descending into chaos, although I don't know whether that's because of the court decision this week or pride month
awww it's a "best of" episode, no new stuff this week
So I guess time for the workout
@vale plank 👋
usa vs canada is tomorrow? i thought the matches started today...
never mind.. it translates to today evening in dallas time
how tf did usa beat bangladesh?
I've seen a fair amount of cricket in my part of Canada, but I'm not really a sports person anyway.
George Carlin tells us why football rules and baseball sucks!
Taken from the forthcoming US 'Ready For This?' DVD and the existing UK 'Ready For This?' DVD. Recorded at Hammersmith Apollo, October 2009.
Available from:
UK & Europe shop: http://www.timminchin.com/merchandise/europe/
Australia shop: http://www.timminchin.com/merchandise/australasia/
North America shop: http://www.timminchin.com/merchandise/a...
oh
Alright. I'm going to head out, enjoy yourselves folks :)
bye bye
Norway jumped to second place with this find
well, once they start producing
pic from the city close to the finding:
"Nokia, the world's second-largest telecom equipment maker after Huawei Technologies, is stepping up efforts to reduce its supply chain exposure to China amid mounting geopolitical risks, going so far as to slash orders even from non-Chinese companies listed in the country."
"Over recent months, the Finland-headquartered company has reduced orders with longtime supplier Foxconn Industrial Internet, a Foxconn subsidiary that is not itself Chinese but is listed on the Shanghai Stock Exchange, in response to Washington's campaign for a "clean network" that is free from Chinese suppliers and capital, four people with direct knowledge of the matter told Nikkei Asia.
Nokia's move to reduce reliance on FII -- which has production capacity outside of China -- suggests an escalation in supply chain restructuring in the overall tech industry, the people said."
Caddy/Nginx/HAProxy (That's free) Paid is insane
Reliable, High Performance TCP/HTTP Load Balancer
@grim solar TCP
minecraft load balancing? aren't literally authors of Paper making that too?
Good bye see you after a month
Sure but Application needs to be aware of it
yeah, was about to say about cutting the world
> identical worlds
are we making RAID1 minecraft lol
you can also just use a protocol that is built for load-balancing
like TIPC
(don't get back to me when TIPC doesn't work, it's now your problem, I don't care)
how many machines are we load balancing over?
load average: 0.00, 0.00, 0.00
4
overleaf being cringe mostly
I know what process groups specifically is the main culprit
at all times at least one core is active
half a vCPU on some instances
Codingame anyone?
@amber raptor "this way idealistic devops is the route to self-hate: you write shit and then you also have to deal with it"
clash of code?
yeah
python only, all modes, ping when join (idk what your username there is)
https://www.codingame.com/clashofcode/clash/369383535cda72de51c164decde96844a2637c0
okay ig it's the same username lmao
oh wait how did I forget that lmao
(I should know this from math education)
The Open Systems Interconnection (OSI) model is a reference model from the International Organization for Standardization (ISO) that "provides a common basis for the coordination of standards development for the purpose of systems interconnection." In the OSI reference model, the communications between systems are split into seven different abst...
enough codingaming for me for today
(I need to get back to open-sourcing a project I've been working on)
that was cool
sure
anyone else?
What's codingaming?
Random chipmunk comes charging out of the woods, headbutts my shoe, refuses to elaborate, and leaves.
Big thank you to Brilliant for sponsoring this video! Try Brilliant for free (for 30 days) and to get a 20% discount, visit: https://Brilliant.org/DavidBombal
CVE-2023-45866 allows attackers to remotely control an Android phone (and other devices) without pairing.
Details: Bluetooth HID Hosts in BlueZ may permit an unauthenticated Peripheral ...
Gippity 4-o:
A more general definition of hacking that fits both uses could be:
"Hacking is the process of creatively solving technical problems or exploiting systems, often by understanding and manipulating the underlying mechanisms. This can involve unauthorized access and activities (often termed as 'black hat' hacking) or ethical, constructive efforts to innovate, improve, or secure systems (often seen in 'white hat' hacking and hackathons)."
This definition captures the essence of hacking as a practice that can be applied in both positive and negative contexts, emphasizing the technical ingenuity involved in the process.
hey guys i have a small doubt can you please help me on it.., it is regarding flet: #1246541669730488442
I don't
(helper role only gives video perms not video granting perms)
@willow light git+go: got? giot? goit?
I've been calling it Git GOod
new Git is nice (as in many small random enhancement it accumulated over 7 years since the last time I updated it)
damn those C# hackers
uninstalling JVMs from computers
@willow light over Perl
you don't even need to try
@deep forge original wiki implementation, iirc
mediawiki migrated it to PHP
mediawiki announcement, 2043: we're migrating to this brand new framework, Ruby on Rails
logic based, we don't know those
object oriented?
so we have
java
java 8
java 7
C#, the other C#, the other other C#
You mean Microsoft Java
shush or these ^ will come for you
and if they find your JVM
If they find it could they let me know? I had to rebuild my PATH from scratch.
AWK is popular
or, rather, old
it's ed/sed type of popular
I'm okay with fixing existing PHP software
but creating more of that -- rather not
@willow light His chipmunk friends dared him to do that. In return for a weeks worth of the saltiest nuts
html 🫶
SGML is superset of HTML/XML in a sense
some allege there could be a possibility for TeX being chosen over HTML as the language of the Web
microsoft ❤️ XML
because java likes xml, and so does c#
how will you pass attrs to tex?
that's not how choosing one language over the other works
as in the choice was in the earliest stages of webdev
when attrs (or HTML at all) weren't that more of a thing yet
@willow light Erlang docs are in XML (and Joe Armstrong said he liked that they are this way)
I've heard the name
@deep forge which D?
there is more than one
there's also DTrace D
both are called D
and have .d as an extension, afaik
sazk props for using catppuccin
(at least three as creator of dtrace mentioned once)
!d numpy.f2py
Copyright 1999 – 2011 Pearu Peterson all rights reserved. Copyright 2011 – present NumPy Developers. Permission to use, modify, and distribute this software is given under the terms of the NumPy License.
NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
USE AT YOUR OWN RISK
very good optimising compiler, gets hardware support before every other language
(fortran)
I learned Fortran on cards.
fortran is, like, the oldest optimising compiler
and from very early it was outperforming manually written machine code/whatever they had back then
so that people saying it couldn't outperform humans in fast code would shut up
@willow light yes
VBA
wasn't microsoft recently killing one of VBs?
A Programming Language
and a keyboard
BASIC is taught at unlucky schools where I live
less unlucky schools use Pascal
I was taught using BASIC, for a total of one hour.
wait I missed what was the language
lisp?
JavaScript is Lisp
Turbo Pascal was the first IDE I used
at the age of ||2|| :skull:
pandoc is written in Haskell
C+Haskell describes most of Rust
C + Haskell - simplicity
V in VLang stands for vaporware
I'm disconnected from socium enough not to hear/see most of that hype
do it generically, that's the way
there is poll and async-await, yeah
those both are needed
combine them, don't choose
tokio has migrated to async-await
now the problem is different
tokio and futures and async-std and smol have different interfaces for async
last three are mostly compatible
and making them work with tokio is just a single .compat() call
@deep forge look through V's history
some questionable stuff in there
they overpromised
https://github.com/TodePond/DreamBerd DreamBerd is already the best language though.
it's funny, compared to V, how Zig creator explicitly calls out which things Zig doesn't yet have implemented as "vaporware"
I miss the time when it was renamed to C
Good times indeed.
the language that removed "rockstar dev" from resume expectations
Now how about we have resume expectations that have anything whatsoever to do with the role itself and not the entire tech industry?
There are jokes that Oracle gets?
compile time DoS
I only now realised that sqlite sounds a bit like ethnonym/whatever because of -ite
(I forgot which other groups of words have that)
ohno
yeah that too
either dug up or it burned on its own under the ground
dig, dig, dig, faster, faster!
no, don't dig that one, it's already burning
demonym
I know someone who uses that (the first mentioned food) to track price changes
order borsch (1 litre)
(here it is $5 for 1kg of borsch in a relatively expensive place)
HTML+CSS+JS -- that somewhat forces to learn more than one thing at a time
(I haven't looked at it myself enough to know, but from many places I heard it to be this way)
there was also an odin lang
Odin seems to work well for whatever company the creator is partnered with/working for
integrate over network instead of function calls
gRPC/ZeroMQ/others
(but not everything at the same time)
"we use clustered message passing"
the only RabbitMQ node the company runs, waiting for even a single message to arrive:
ig Python-C-Go
well, not guess, it is doing that
I'd do the one that is Python-C-JVM-Go. Because apparently for some reason I already have it installed.
Preinstalled on the dev vm that I spun up internally
Mind you the JVM itself wasn't preinstalled
Python-C-Rust-C++-C-Go
Python-C because that's the only way CPython can do
Python-C-Rust because pyo3 is great
Rust-C++ because cxx is great
C++-C because C++ core guidelines say to wrap C in C++ if you're actually doing anything relatively modern
C-Go because that's the only way Go can do
Go-C-C++-Fortran-NumPy.f2py()
that just sounds normal
My brain......
in JS it does var by default in non-strict mode, iirc
function scope
@tawdry belfry starting with assembly is a sure way to either give up instantly or misunderstand everything for a long time
C is close enough to hardware while being actually useful, so that language is good enough to start with
(for those, to whom learning from lower layers of abstraction is easier)
((lower as in what everything above builds on top of))
@verbal zenith the "this should've been a blog entry instead" answers are useful indeed
as in
the answer is giant
!kindling @tawdry belfry
The Kindling projects page on Ned Batchelder's website contains a list of projects and ideas programmers can tackle to build their skills and knowledge.
!code
!pep 8
Name conventions.
@somber heath
remember me?
yes
i changed my mind
lol
i talked to hem
and asked him too unmute me
he said no
and he also said he didnt remember me
ye
yo
i gtg
i bsac
fdisk -l
mount -t ntfs /dev/(windows drive) /mnt
cd /mnt/Windows/System32
cp cmd.exe Utilman.exe
reboot
y?
Yooo
hi
What are the difference? I've seen some difference but don't get what exactly
The attributes whose start with property is not included in parameters of the object when creating
But what is this exactly? How does it function? Why?
Those are still attributes and reachable by add methods
embed = discord.Embed
!e ```py
class MyClass:
def init(self, value):
self.value = value
self.abc = 'abc'
instance = MyClass(123)
print(instance.value)
print(instance.abc)```
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 123
002 | abc
@sharp meadow 👋
I'm not allowed to talk tf
Verify failed
I have been in voice here before weird
You have sent less than 50 messages.
You have been active for fewer than 3 ten-minute blocks
Three times at least ten min
As I get it
And yea all my past messages are gone aswell
But i did once leave the server and rejoined
!e ```py
class MyClass:
def init(self):
self._value = -1
@property
def value(self):
self._value += 1
return self._value
instance = MyClass()
print(instance.value)
print(instance.value)
print(instance.value)```
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 0
002 | 1
003 | 2
But not a big deal
I just Hate it when servers have requirements to join VC, but I know it's needed as of spammers nowdays (I ran a server with 2500+ members in the past) so we had to do the same
And like be there for 10+ minuts to even send a message
Green beans are young, unripe fruits of various cultivars of the common bean (Phaseolus vulgaris), although immature or young pods of the runner bean (Phaseolus coccineus), yardlong bean (Vigna unguiculata subsp. sesquipedalis), and hyacinth bean (Lablab purpureus) are used in a similar way. Green beans are known by many common names, including ...
@worldly shoal 👋
@fossil void 👋
{
"jakobkhansen/journal.nvim",
config = function()
require("journal").setup()
end,
},
guess I'll work on this while waiting for Mr Sandman to arrive
probably going to see if I can setup autogit commits and pushes and pulls so I can get some sort of sync going
@jagged ferry 👋
!e
num_sites = 16
block_size = 4
blocks = []
for site in range(0, num_sites, block_size):
blocks.append(list(range(site, site + block_size)))
print(blocks)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
how can I get the git command in the terminal?
What OS?
windows
I have a it, thank you
so just
and you have git in bash
and no more dealing with cmd/poweshell
ls and whatnot works now
I hate how often I hit ls in cmd
I know I can alias but I'm not a fan of cmd anyways
which editor should I choose?
Your call, VSCode is pretty solid
vim
works for just about any language
vim if you want to spend more time learning your editor than the language
emacs
I'm a beginner and know how vs code work, like the basic stuf
ms word!
if we're looking for terrible options
but vscode is a solid place to begin
spacemacs
I can link terrible editors for beginners as well
do I get a prize?
idk
like i said, vscode is a nice solution, notepad++ or sublime if you really want it out of your way
vscode is extremely user friendly
hold on i have a very nice config for spacemacs
offers a ton of customization
I don't care, we're not talking about it
can we stay on topic of a good editor for a beginner?
luigi wants real help, not jokes
picking an editor can be frustrating, making a joke of it doesn't help
@clear tiger 👋
i don't care what you dictate we should talk about
there is no requirement that says you cannot use emacs as a beginner. that you should only use vscode and nothing else if you're a beginner
there's not
no requirement for much these days, luigi asked for a recommendation, I recommended
I also recommended against
I'm free to do that, nice chat
you are not free to stop others from being free
if you are programming python, pycharm is a very nice option
@sage fable 👋
hi
best game ever
how far are you in it?
when discord shuts down a server , users get a warning
@unique sorrel 👋
@obsidian dragon I'm available now if you have questions.
Sorry, I'm stuck on a few mathematical problems and was seeing if anyone in the math discord can help.
nerd
wdym?
😉
Can we change the voice chat region to India from Rotterdam?
I think the bot does it
Thanks
I'm asking for permission because if you think it's going to make it hard for you I'd just type here.
I can't talk when we're on Rotterdam.
@cobalt fractal Greetings there,
Hope you are well. Apologies for the bother, can you kindly set the vc0's voice region to India please? Hemlock's not available on weekends.
Only Admins can do that.
it's the one that have the most active user atm
If you can find this one instead (make sure its revision 2):
That's an accurate statement.
everyone is it in this server
from diffusers import DiffusionPipeline
import torch
import time
timestamp = 0
x = 0
num = 4
# load both base & refiner
#prompt = input("Image Prompt:\n")
prompt = """
Draw an anime girl with black wolf ears, long black hair, red eyes, and medium chest on tan skin. The character is eating a burger
"""
while x < num:
timestamp = time.time()
process_start = time.time()
base = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
base.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=base.text_encoder_2,
vae=base.vae,
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16",
)
refiner.to("cuda")
# Define how many steps and what % of steps to be run on each experts (80/20) here
n_steps = 18
high_noise_frac = 0.8
# run both experts
image = base(
prompt=prompt,
num_inference_steps=n_steps,
denoising_end=high_noise_frac,
output_type="latent",
).images
image = refiner(
prompt=prompt,
num_inference_steps=n_steps,
denoising_start=high_noise_frac,
image=image,
).images[0]
image.save(f"./images/{timestamp}.png")
process_end = time.time()
process_time = round(process_end - process_start, 2)
print(f"DEBUG > {timestamp}.png took {process_time}s")
x += 1
print("Process Complete")
two sets of ears
prompt = """
Draw an anime girl with black wolf ears, long black hair, red eyes, and medium chest on tan skin. The character is eating a burger
"""
This is just nightmare fuel.
I hate this soooo much HEHEHE.
Explore thousands of high-quality Stable Diffusion models, share your AI-generated art, and engage with a vibrant community of creators
It's set by default to rotterdam.
Not defined automatically.
If I go to vc1 it'll still be rotterdam.
DCed, let's goooo.
Gotta love rotterdam.
I don't understand what this all means anymore
> "only 300KB and another 300KB of icons"
> executable: 1.4MB (after unpacking)
> archive: 1.6M
What's this for?
^ this might be entirely untrue, I haven't looked up myself
there is no small package
Only small use-cases HEHEHE
they claim smaller
well, maybe, they used a different compression, idk
it's 2.4MB compressed to 1.4MB
1337KB after re-compressing with ultra lol
for(int i = 0; i < 10; /* this happend no matter what */ printf("%d\n", i), ++i)
{
if( i == 5 )
continue;
}
/*
Output:
0
1
2
3
4
5
6
7
8
9
*/
@primal shadow
in short: don't do this, bad practice, makes code harder to understand
!e
def with_print(iterable):
for element in iterable:
yield element
print('second', element)
for i in with_print(range(3)):
print('first ', i)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | first 0
002 | second 0
003 | first 1
004 | second 1
005 | first 2
006 | second 2
if you need to call something at the end of an iteration to free up some resource,
example, bad:
for _ in ...:
file = open("example.txt")
if some_condition:
continue # oops, file not closed
file.close()
use with instead:
for _ in ...:
with open("example.txt") as file:
if some_condition:
continue # ok, calls close anyway
def lookup_usage_str_id(self, addr):
MAX_INST_LOOKBACK = 256
instr_address = addr
for _ in range(MAX_INST_LOOKBACK)
instr = ida_ua.insn_t()
if idaapi.decode_insn(instr, instr_address) == 0:
return -1
# at this point, instruction decoded
if not instr:
instr_address = idaapi.prev_head(instr_address, func_entry)
continue
if instr.itype != idaapi.ARM_mov:
instr_address = idaapi.prev_head(instr_address, func_entry)
continue
if instr.Op1.type != idaapi.o_reg or instr.Op2.type != idaapi.o_imm:
instr_address = idaapi.prev_head(instr_address, func_entry)
continue
if instr.Op1.reg != ARM_REG_0:
instr_address = idaapi.prev_head(instr_address, func_entry)
continue
return instr.Op2.value
return -1
@primal shadow
why not just or/and all those conditions?
each iteration seems to end either in continue or return in this case
def instructions(addr):
MAX_INST_LOOKBACK = 256
for _ in range(MAX_INST_LOOKBACK):
instr = ida_ua.insn_t()
if idaapi.decode_insn(instr, addr) == 0:
break
yield instr
addr = idaapi.prev_head(addr, func_entry)
def lookup_usage_str_id(self, addr):
for instr in instructions(addr):
if not instr:
continue
if instr.itype != idaapi.ARM_mov:
continue
if instr.Op1.type != idaapi.o_reg or instr.Op2.type != idaapi.o_imm:
continue
if instr.Op1.reg != ARM_REG_0:
continue
return instr.Op2.value
return -1
def lookup_usage_str_id(self, addr):
MAX_INST_LOOKBACK = 256
instr_address = addr
for x in range(MAX_INST_LOOKBACK)
if x != 0:
instr_address = idaapi.prev_head(instr_address, func_entry)
instr = ida_ua.insn_t()
if idaapi.decode_insn(instr, instr_address) == 0:
return -1
# at this point, instruction decoded
if not instr:
continue
if instr.itype != idaapi.ARM_mov:
continue
if instr.Op1.type != idaapi.o_reg or instr.Op2.type != idaapi.o_imm:
continue
if instr.Op1.reg != ARM_REG_0:
continue
return instr.Op2.value
return -1```
this creates an iterator over all instructions
which also allows you to get rid of the extra return -1
def lookup_usage_str_id(self, addr):
MAX_INST_LOOKBACK = 256
instr_address = addr
for _ in range(MAX_INST_LOOKBACK) : (instr_address = idaapi.prev_head(instr_address, func_entry))
instr = ida_ua.insn_t()
if idaapi.decode_insn(instr, instr_address) == 0:
return -1
# at this point, instruction decoded
if not instr:
continue
if instr.itype != idaapi.ARM_mov:
continue
if instr.Op1.type != idaapi.o_reg or instr.Op2.type != idaapi.o_imm:
continue
if instr.Op1.reg != ARM_REG_0:
continue
return instr.Op2.value
return -1
this does exactly that
it executes prev_head after each iteration that didn't end up in return
!d generator
A function which returns a generator iterator. It looks like a normal function except that it contains yield expressions for producing a series of values usable in a for-loop or that can be retrieved one at a time with the next() function.
Usually refers to a generator function, but may refer to a generator iterator in some contexts. In cases where the intended meaning isn’t clear, using the full terms avoids ambiguity.
!e
def example_generator():
yield 1
yield 2
yield 3
for element in example_generator():
print(element)
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 1
002 | 2
003 | 3
!e
def example_generator():
print(0)
yield 1
print(2)
yield 3
print(4)
yield 5
print(6)
for element in example_generator():
print(element)
if element == 3:
break
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 0
002 | 1
003 | 2
004 | 3
break and return from the loop, that consumes the generator, cause the generator to stop
note how print(4) never happens
echo $env:path
@mighty robin @obtuse needle 👋
jeyu
hey
slay @deep forge
Sorry, @deep forge, it looks like it's time to go.
bye @somber heath
Are you leaving?
no, but i think you are
How ominous.
Ah. I believe I see the mixup.
@deep forge, it looks like you're safe, again...for now.
"fine, learn it, just don't get yourself accidentally banned from their issue tracker"
Rust and Python are the ones I'm actively using
C# I used for a single project that lasted 5 years
a mod which is almost at 50K downloads
C I have to know because everything works on top of C
C++, the language, I mostly know
as for standard library -- less so
because web
(I don't use JS on back-end)
before late 2023, Python
since late 2023, Rust
that sounded crazy
I also did some integration/code review stuff on C#
very long time ago, I used to write Lua
lua, the regular one, not luau
luau is the roblox's dialect of lua
which now spreads outside roblox
that spread isn't surprising given that luau has += and lua doesn't
Lua had some reason as to why they don't do compound assignment
@deep forge Lua is made for being embedded
but it can work outside that setting
torch was Lua before they migrated to Python
so it was using binding capabilities coming from the embedded nature of the language, even though the use wasn't really embedded
some game engines are using Lua too
LuaJIT specifically
(as in what is fast)
I'm at the point where I need to lookup what languages even exist to say which ones I know enough to make something useful in
dementia is hitting hard already
before relatively recently, the main use of C++ for me was competitive programming
didn't really do much else with it
to quote that video,
5 games
50 game engines
I don't remember even a single one, I don't do game dev with visuals in Rust
bevy is the one that's mentioned often
some of those are bindings
wanna play @vocal basin https://www.codingame.com/clashofcode/clash/3694977982ce2219d5bf880e313ec38362a45c8?
I'm proud of the fact I actually have code formatted properly lol
// This function does this.
// ### ...
// ## Parameters
// * `app` - A pointer to an `App` struct.
// * `event` - A pointer to an `ui.Event` struct.
fn main() {
hate such problems
If I have
// ...
It'll merge onto the same line as // This function does this..
Very interesting.
took me some time to realise it needs many lines not one
I might've misread something
<@&831776746206265384> Troll in VC.
your solutions are much cooler
my internet connection is so jank
this is why I don't mod VC god
just gonna wait for 4 more minutes ig 😅
try:F=1.2;M=5/6;i=input;i(int(eval(i()+"*"+i())))
except NameError:i("UNKNOWN")
nice
this is 1 character lower than another somewhat different solution I had
I was trying with eval but f'ed up so just submitted whatever I had
what was that?
@whole bear 👋
actually I could've improved what I had
try:F=1.2;M=5/6;i=input;i(int(eval("i()*i()")))
except NameError:i("UNKNOWN")
i wanna learn pygame
even smaller
I prefer arcade to pygame
oh
idk if normal print breaks too
!e
try:F=1.2;M=5/6;print(int(eval("F*100")))
except NameError:i("UNKNOWN")
:white_check_mark: Your 3.12 eval job has completed with return code 0.
120
!e
try:F=1.2;M=5/6;print(int(eval("J*100")))
except NameError:i("UNKNOWN")
:x: Your 3.12 eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "/home/main.py", line 1, in <module>
003 | try:F=1.2;M=5/6;print(int(eval("J*100")))
004 | ^^^^^^^^^^^^^
005 | File "<string>", line 1, in <module>
006 | NameError: name 'J' is not defined
007 |
008 | During handling of the above exception, another exception occurred:
009 |
010 | Traceback (most recent call last):
... (truncated - too many lines)
Full output: https://paste.pythondiscord.com/LUZPALQY2DNLRYIUP6NLRSLM6M
try something
input
.
!e
code
!e
try:F=1.2;M=5/6;print(int(eval("J*100")))
except:print("UNKNOWN")
:white_check_mark: Your 3.12 eval job has completed with return code 0.
UNKNOWN
!pypi sqlalchemy
^ example of ORM
maybe it doesn't work the same way on codingame
:incoming_envelope: :ok_hand: applied timeout to @mighty robin until <t:1717343977:f> (10 minutes) (reason: burst spam - sent 8 messages).
The <@&831776746206265384> have been alerted for review.
@mighty robin read #voice-verification
there is kind of two parts to many ORM:
query builder
object mapping
oh, yeah right ig
!e
try:F=1.2;M=5/6;i=input;i(int(eval("F*100")))
except NameError:i("UNKNOWN")
:x: Your 3.12 eval job has completed with return code 1.
:warning: Note: input is not supported by the bot :warning:
001 | 120Traceback (most recent call last):
002 | File "/home/main.py", line 1, in <module>
003 | try:F=1.2;M=5/6;i=input;i(int(eval("F*100")))
004 | ^^^^^^^^^^^^^^^^^^^^^
005 | EOFError: EOF when reading a line
some ORMs provide access to query building, I think?
this passes because stderr is ignored
and exit code is ignored
and newline isn't tested for
!tvmute 610940166902775828 2w Spamming to reach our voice verification requirements is strictly prohibited. You can still join voice channels without being verified; you just have to get some legitimate server activity in order to get verified.
:incoming_envelope: :ok_hand: applied voice mute to @mighty robin until <t:1718553092:f> (14 days).
whereas extra lines, I think are
so "got something, expected nothing" is an error, afair
(and I instantly forgot that I was about to do that ^, remembering almost an hour later)
hello
<@&831776746206265384> Can I get temporary stream permissions? I have been voice verified for a few years already..
@tawdry belfry as in?
We'd need a mod to be available in vc at the time for supervision, unfortunately
@tawdry belfry you want to reimplement a simpler version of FTP?
if you want to go the unusual route:
https://github.com/zeromq/filemq
if you want to use socket io in Python, I highly suggest switching asyncio-based sockets early on
if you need to just send a message, there is ZeroMQ, Websocket, others
those two are layered on top of TCP
what I'm talking about:
https://docs.python.org/3/library/asyncio-stream.html
@tawdry belfry Live Share
you can share a terminal
Live Share is good for pair programming, not collaboration in general
two people taking turns writing/reading, not two people writing the same thing in parallel
It's just inefficient to do pair programming. Just delegate tasks that don't depend on each other to be done by each programmer, and have one person manage the main branch.
pair programming is very much about not writing at the same time
having reduced writing speed is not an inefficiency
it's the intent
pair programming != two people collaborating on a project
Pair programming is a software development technique in which two programmers work together at one workstation. One, the driver, writes code while the other, the observer or navigator,[1] reviews each line of code as it is typed in. The two programmers switch roles frequently.
This is literally the image from their wikipedia.
depending on each other is the point
AF that's like saying Pair Programming is like working in a team.
no
I've literally never had a situation in any project where I went like "Oh it'd be good if two people were looking at this screen at the same time."
@tawdry belfry stream interface that asyncio provides is a bit easier to work with
I had a lot of such times
you fuckup, someone else notices it in a minute instead of a year
that's not how programming works at all
That's the role of the branch manager when he reviews your commit.
It's the person that reviews the commit before merging it with the main branch.
You're both being unnecessarily mean.
I write my code, my team write their code, and we review each others code when we want to merge.
this is actually important, but for a different reason
That's what your getting from pair programming, isn't it?
You're having someone read the code as you're writing it.
You can just have someone go through the commit when they're done.
smaller delay
well, a week in case of review on merge
for "one writes code, other merges", see ZeroMQ:
their reasoning for it is that it keeps people from burnout
It's not even part of the codebase, it doesn't matter if it's buggy. The branch manager reviews the commit before merging. Also, there's testers that you can run automatically.
That's not objectively true. I can do my work, and then when you make a PR go and review your work, and if correct merge it.
In software engineering, team programming is a project management strategy for coordinating task distribution in computer software development projects, which involves the assignment of two or more computer programmers to work collaboratively on an individual sub-task within a larger programming project. In general, the manner in which this term...
You have literal roles where you design these pipelines. That's the whole point of those roles. I don't want someone sitting next to me reading my code as I do it. It's a waste of their time when they can be writing their code.
what is not objectively true?
It's not true that reviewing a pr takes a week.
I just said that it won't take a year in that case
I didn't say it
from writing to PR
not from PR start to PR end
Ok, then the maintainer has to sit with every developer through the working day to check their code?!
That's just infeasible.
no one said you need to be doing pair programming always
No, I'm offended by people just saying you don't know shit when someone states a logical opinion.
pair programming all the time is ineffective, obviously
people do need time to learn on their own
(and work on their own when there's not much to learn really)
There's pipelines to automate and optimize the CI/CD process. I've never seen anyone say delegate two assets to the same task and have them stare at the screen as the other writes the code.
CI/CD is important but it can't detect all the bugs
You have testers for most bugs, and the rest can get spotted as they're used in different situations.
testers as in?
separate employees for the company to waste money on?
for testing the project in general -- sure
That sounds like 'no baby sitter' = 'no television' 😭
for unit tests and many other types of tests -- those must be written by the programmer themselves most of the time
I don't care if anyone wants to do that, all I'm saying is it's wasteful to have two people sit together to write code at the same time. You can discuss bugs/blocks in meetings. You don't need to sit together and stare at the same screen.
okay so you have heartbleed, the bug
how do testers, CI/CD and whatever else detects it?
There's collaboration, and there's two people sitting next to eachother staring at the same screen.