@lyse@lyse.isobeef.org /Me throws his keyboard off to the side, grabs his camera just in case and runs upstairs screaming āYeah! Science B_ !ā
For some reason, I was using calc all this time. I mean, itās good, but I need to do base conversions (dec, hex, bin) very often and you have to type base(2) or base(16) in calc to do that. Thatās exhausting after a while.
So I now replaced calc with a little Python script which always prints the results in dec/hex/bin, grouped in bytes (if the result is an integer). Thatās what I need. Itās basically just a loop around Pythonās exec().
$ mcalc
> 123
123 0x[7b] 0b[01111011]
> 1234
1234 0x[04 d2] 0b[00000100 11010010]
> 0x7C00 + 0x3F + 512
32319 0x[7e 3f] 0b[01111110 00111111]
> a = 10; b = 0x2b; c = 0b1100101
10 0x[0a] 0b[00001010]
> a + b + 3 * c
356 0x[01 64] 0b[00000001 01100100]
> 2**32 - 1
4294967295 0x[ff ff ff ff] 0b[11111111 11111111 11111111 11111111]
> 4 * atan(1)
3.141592653589793
> cos(pi)
-1.0
all of the software sucks, but i have a solution! weāll write even more software! get more people involved, make it the Ideal Career, then we can write AL̵LĢ“ O̵F THĢØE ̧CĶODEĢ·S. mountains of shitty garbage that kind-of does the thing. software will still suck, but TĶHEĢN oh then we can write compilers that let us run the old shitty code inside of our mountain of new shitty code. now all of the code is in a giant pile and weāre using it to control space ships that definitely never crash. the more code the better! we can represent NaN easily in undefined systems! developers arenāt particularly bright, so the language is simple and easy for them to understand. we know this, thatās why it was made this way. theĶ” mounĶ¢tain Ķ m̵usĶt Ķ nȩverĢ¢ Ģ“waĢ”veĢ“r̵. the more code the better. so instead of writing the code manually we cĢ“oĶmpileĢØ tĶorĢøtĢuĶred soĢ·uĶls ĶiĶnĶtoĶ Ķnice Ķ¢bĶlĢ·oxeĢ”ls ĢøofĶ Ģøt̶anĢ”gĶlĶed ĶnĢ¢euĶraĢ”lĶ ĢneĢ¢tĶwĶorksĶ.Ģø wĢØe dĶ onātĶ know how i̵t Ģ·wĶorkĢ”s, Ģ“but Ģ·tĢ“he modelĢ¢ ̶isĢ 5Ģ0GiB Ķs̶o ĶiĶt sĶeĶrveĶs Ģ“tḩeĢ purposĶe. WEĢ MĶ USĢ“T BĶ¢UĢ¢ILD ĶTĶHE MOĶUN̶TĢØA̵IN.
I wrote about making Glendaās Joy Division cover (with updated colors and a link to source): http://a.9srv.net/b/2024-11-23
Termux same thing @doesnm uses and it worked š Media
@doesnm@doesnm.p.psf.lt No itās all good⦠Iāve just rebuilt it from master and it doesnāt look like anything is broken:
~/GitRepos> git clone https://github.com/plomlompom/htwtxt.git
Cloning into 'htwtxt'...
remote: Enumerating objects: 411, done.
remote: Total 411 (delta 0), reused 0 (delta 0), pack-reused 411 (from 1)
Receiving objects: 100% (411/411), 87.89 KiB | 430.00 KiB/s, done.
Resolving deltas: 100% (238/238), done.
~/GitRepos> cd htwtxt
master ~/GitRepos/htwtxt> go mod init htwtxt
go: creating new go.mod: module htwtxt
go: to add module requirements and sums:
go mod tidy
master ~/GitRepos/htwtxt> go mod tidy
go: finding module for package github.com/gorilla/mux
go: finding module for package golang.org/x/crypto/bcrypt
go: finding module for package gopkg.in/gomail.v2
go: finding module for package golang.org/x/crypto/ssh/terminal
go: found github.com/gorilla/mux in github.com/gorilla/mux v1.8.1
go: found golang.org/x/crypto/bcrypt in golang.org/x/crypto v0.29.0
go: found golang.org/x/crypto/ssh/terminal in golang.org/x/crypto v0.29.0
go: found gopkg.in/gomail.v2 in gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
go: finding module for package gopkg.in/alexcesaro/quotedprintable.v3
go: found gopkg.in/alexcesaro/quotedprintable.v3 in gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc
master ~/GitRepos/htwtxt> go build
master ~/GitRepos/htwtxt> ll
.rw-r--r-- aelaraji aelaraji 330 B Fri Nov 22 20:25:52 2024 ī§ go.mod
.rw-r--r-- aelaraji aelaraji 1.1 KB Fri Nov 22 20:25:52 2024 ī§ go.sum
.rw-r--r-- aelaraji aelaraji 8.9 KB Fri Nov 22 20:25:06 2024 ī§ handlers.go
.rwxr-xr-x aelaraji aelaraji 12 MB Fri Nov 22 20:26:18 2024 ļ htwtxt <-------- There's the binary ;)
.rw-r--r-- aelaraji aelaraji 4.2 KB Fri Nov 22 20:25:06 2024 ī§ io.go
.rw-r--r-- aelaraji aelaraji 34 KB Fri Nov 22 20:25:06 2024 ī LICENSE
.rw-r--r-- aelaraji aelaraji 8.5 KB Fri Nov 22 20:25:06 2024 ī§ main.go
.rw-r--r-- aelaraji aelaraji 5.5 KB Fri Nov 22 20:25:06 2024 ī README.md
drwxr-xr-x aelaraji aelaraji 4.0 KB Fri Nov 22 20:25:06 2024 ļ templates
New post (mostly follow-up on the previous with a few new points) on the twtxt v2 discussion. http://a.9srv.net/b/2024-10-08
I believe Iād missed an f:
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
if args.edit:
edit_twt_file(app)
elif args.fetch:
- with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+ with DirectoryLock(expanduser(f'~/tmp/jenny-{getuser()}.run')):
retrieve_all(app)
elif args.last_seen:
print('Feeds last seen at (times are local time), oldest first:')
@doesnm@doesnm.p.psf.lt Iāve just given it a try on android/termux and got it to work, I canāt promise it wonāt break something else (because i definitely donāt know what Iām doing) but hereās what I broke š :
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
if args.edit:
edit_twt_file(app)
elif args.fetch:
- with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+ with DirectoryLock(expanduser('~/tmp/jenny-{getuser()}.run')):
retrieve_all(app)
elif args.last_seen:
print('Feeds last seen at (times are local time), oldest first:')
and of course make sure you mkdir ~/tmp
This is only first draft quality, but I made some notes on the #twtxt v2 proposal. http://a.9srv.net/b/2024-09-25
Sorry but i dont undestand b. New feed author? But why?
@movq@www.uninformativ.de @falsifian@www.falsifian.org @prologic@twtxt.net Maybe I donāt know what Iām talking about and Youāve probably already read this: Everything you need to know about the āRight to be forgottenā coming straight out of the EUās GDPR Website itself. It outlines the specific circumstances under which the right to be forgotten applies as well as reasons that trump the oneās right to erasure ā¦etc.
Iām no lawyer, but my uneducated guess would be that:
A) twts are already publicly available/public knowledge and such⦠just donāt process childrenās personal data and MAYBE youāre good? Since thereās this:
⦠an organizationās right to process someoneās data might override their right to be forgotten. Here are the reasons cited in the GDPR that trump the right to erasure:
- The data is being used to exercise the right of freedom of expression and information.
- The data is being used to perform a task that is being carried out in the public interest or when exercising an organizationās official authority.
- The data represents important information that serves the public interest, scientific research, historical research, or statistical purposes and where erasure of the data would likely to impair or halt progress towards the achievement that was the goal of the processing.
B) What I love about the TWTXT sphere is itās Human/Humane element! No deceptive algorithms, no Corpo B.S ā¦etc. Just Humans. So maybe ⦠If we thought about it in this way, it wouldnāt heart to be even nicer to others/offering strangers an even safer space.
I could already imagine a couple of extreme cases where, somewhere, in this peaceful world oneās exercise of freedom of speech could get them in Real trouble (if not danger) if found out, it wouldnāt necessarily have to involve something to do with Law or legal authorities. So, If someone asks, and maybe fearing fearing for⦠letās just say āTheir well beingā, would it heart if a pod just purged their content if itās serving it publicly (maybe relay the info to other pods) and call it a day? It doesnāt have to be about some law/convention somewhere ⦠𤷠I know! Too extreme, but Iāve seen news of people whoād gone to jail or got their lives ruined for as little as a silly joke. And it doesnāt even have to be about any of this.
P.S: Maybe make X tool check out robots.txt? Or maybe make long-term archives Opt-in? Opt-out?
P.P.S: Already Way too many MAYBEās in a single twt! So Iāll just shut up. š
One distinct disadvantage of (replyto:ā¦) over (edit:#): (replyto:ā¦) relies on clients always processing the entire feed ā otherwise they wouldnāt even notice when a twt gets updated. a) This is more expensive, b) you cannot edit twts once they get rotated into an archived feed, because there is nothing signalling clients that they have to re-fetch that archived feed.
I guess neither matters that much in practice. Itās still a disadvantage.
HTTPS is supposed to do [verification] anyway.
TLS provides verification that nobody is tampering with or snooping on your connection to a server. It doesnāt, for example, verify that a file downloaded from server A is from the same entity as the one from server B.
I was confused by this response for a while, but now I think I understand what youāre getting at. You are pointing out that with signed feeds, I can verify the authenticity of a feed without accessing the original server, whereas with HTTPS I canāt verify a feed unless I download it myself from the origin server. Is that right?
I.e. if the HTTPS origin server is online and I donāt mind taking the time and bandwidth to contact it, then perhaps signed feeds offer no advantage, but if the origin server might not be online, or I want to download a big archive of lots of feeds at once without contacting each server individually, then I need signed feeds.
feed locations [being] URLs gives some flexibility
It does give flexibility, but perhaps we should have made them URIs instead for even more flexibility. Then, you could use a tag URI,
urn:uuid:*, or a regular old URL if you wanted to. The spec seems to indicate that theurltag should be a working URL that clients can use to find a copy of the feed, optionally at multiple locations. Iām not very familiar with IP{F,N}S but if it ensures you own an identifier forever and that identifier points to a current copy of your feed, it could be a great way to fix it on an individual basis without breaking any specs :)
Iām also not very familiar with IPFS or IPNS.
I havenāt been following the other twts about signatures carefully. I just hope whatever you smart people come up with will be backwards-compatible so it still works if Iām too lazy to change how I publish my feed :-)
@prologic@twtxt.net wellā¦
how would that work exactly?
To my limited knowledge, Keyoxide is an open source project offering different tools for verifying oneās online persona(s). Thatās done by either A) creating an Ariande Profile using the web interface, a CLI. or B) Just using your GPG key. Either way, you add in Identity claims to your different profiles, links and whatnot, and finally advertise your profile ⦠Then there is a second set of Mobile/Web clients and CLI your correspondents can use to check your identity claims. I think of them like the front-ends of GPG Keyservers (which keyoxide leverages for verification when you opt for the GPG Key method), where you verify profiles using links, Key IDs and Fingerprintsā¦
Who maintains cox site? Is it centralized or decentralized can be relied upon?
- Maintainers? Definitely not me, but hereās their Git stuff and OpenCollective page ā¦
- Both ASP and Keyoxide Webtools can be self-hosted. I donāt see a central authority here⦠+ As mentioned on their FAQ page the whole process can be done manually, so you donāt have to relay on any one/thing if you donāt want to, the whole thing is just another tool for convenience (with a bit of eye candy).
Does that mean then that every user is required to have a cox side profile?
Nop. But it looks like a nice option to prove that Iām the same person to whom that may concern if I ever change my Twtxt URL, host/join a yarn pod or if I reach out on other platforms to someone Iāve met in her. Otherwise Iām just happy exchanging GPG keys or confirm the change IRL at a coffee shop or something. š
# follow_notify = gemini://foo/bar to your feedās metadata, so that clients who follow you can ping that URL every now and then? How would you even notice that, do you regularly read your gemini logs? š¤
@movq@www.uninformativ.de @prologic@twtxt.net Hey! I may have found a silly trick to announce my following to people hosting their feeds on the Gemini space using the requested URI itself instead of relaying on the USER Agent š. Iāve copied my current feed over to my (to be) Gemlog for testing. And if I do a jenny -D "gemini://gem.aelaraji.com/twtxt.txt?follower=aelaraji@https://aelaraji.com/twtxt.txt" and this happens:
A) As a follower, I get the feed as usual.
B) As the feed owner, I get this in logs:
hostname:1965 - āgemini://gem.aelaraji.com/twtxt.txt?follower=aelaraji@https://aelaraji.com/twtxt.txtā 20 ātext/plain;lang=en-USā
You could do the same for Gopher feeds but only if you want to announce yourself by throwing in an error in their logs, then youāll need a second request to fetch the feed. jenny -D "gopher://gopher.aelaraji.com/twtxt.txt&follower=aelaraji@https:/aelaraji.com/twtxt.txt" gave me this :
gopher.aelaraji.com:70 - [09/Sep/2024:22:08:54 +0000] āGET 0/twtxt.txt&follower=aelaraji@https:/aelaraji.com/twtxt.txt HTTP/1.0ā 404 0 āā āUnknown gopher clientā
NB: the follower=... string wonāt appear in gopher logs after a ? but if I replace it with a + or a & and it works. There will be a missing / after the https:. Probably a client thing.
@mckinley@twtxt.net To answer some of your questions:
Are SSH signatures standardized and are there robust software libraries that can handle them? Weāll need a library in at least Python and Go to provide verified feed support with the currently used clients.
We already have this. Ed25519 libraries exist for all major languages. Aside from using ssh-keygen -Y sign and ssh-keygen -Y verify, you can also use the salty CLI itself (https://git.mills.io/prologic/salty), and Iām sure there are other command-line tools that could be used too.
If we all implemented this, every twt hash would suddenly change and every conversation thread weāve ever had would at least lose its opening post.
Yes. This would happen, so weād have to make a decision around this, either a) a cut-off point or b) some way to progressively transition.
@prologic@twtxt.net Iāve just went in a case b) on @abucci@anthony.buc.ci ās pod, if I click on their nickname I get a Log-in page. And if I click on anyone elseās I a profile page. Is that normal?
yarnd that's been around for awhile and is still present in the current version I'm running that lets a person hit a constructed URL like
Iām happy with the current implementation though, because the only reason you should be hitting the external profile endpoint at all is a) youāre logged in and happen to click on someoneās profile that is external to the pod or b) youāre anonymous and just clicking through the frontpage (see a)
@bender@twtxt.net What multiplexer do you use? I usually use Tmux and have my prefix mapped to C-a on my local machine and the default C-b on the remote ones so they donāt conflict if it helps.
M a y b e p u t s p a c e s b e t w e e n t h e l e t t e r s t o t h w a r t t h e c r a w l e r s l i k e t h i s s o t h e y j u s t s e e i n d i v i d u a l l e t t e r s
Solar Powered Raspberry Pi 4 Model B - Tutorial https://core-electronics.com.au/guides/solar-powered-pi/
@bender@twtxt.net Oh, That sounds delicious! BāSaha![1]
Iām Glad youāve had quite the productive! All I remember of mine is three chapters of an old novel at the coffee shop aaand ⦠Now Iām here, in front of a computer. Everything in between is just Blank š
[1] Bāsaha: Moroccan word for āWith health!ā (a literal translation) usually used as an equivalent for the French expression āBon AppĆ©tit!ā but also used as āCongratulation!ā
Been clearing out my pod a bit and blocking unwanted domains that are basically either a) just noise and/or b) are just 1-way (whose authors never reply or are otherwise unaware of the larger ecosystem)
Let me know if yāall have any other candidates youād like me to add to the blocked domain list?
Pub Trivia
ā Read more
@adi@twtxt.net No, thinking much bigger than that at the moment: http://a.9srv.net/b/us-osqi
So Youtube rea really cracking down on Ad-blockers. The new popup is a warning saying you can watch 3 videos before you can watch no more. Not sure for how long. I guess my options are a) wait for the ad-blockers to catch-up b) pay for Youtube c) Stop using Youtube.
I think Iām going with c) Stop using Youtube.
I just caught a bit flip in a tmpfs. The 42 MiB file only existed for about 3 minutes before the error was first detected by the FLAC decoder. Very unlikely.
$ xxd -b ../08.\ New\ World\ Rising.flac >old
$ xxd -b 08.\ New\ World\ Rising.flac >new
$ diff old new
2959577c2959577
< 010ef510: 11110011 01001010 11111010 10011111 11110011 00111011 .J...;
---
> 010ef510: 11110011 11001010 11111010 10011111 11110011 00111011 .....;
Factorial Numbers
ā Read more
Pinellas County - Long run: 10.63 miles, 00:09:59 average pace, 01:46:03 duration
woke up a bit groggy, but definitely excited to go run. the temps were b/w 70F-73F with a dew point to match which is fabulous. such a great run and kept a conservative pace for it leaving me feeling strong at the end. wanted to keep going but i know i should ease back in to the longer distances
#running
@lyse@lyse.isobeef.org oh wow nice, I got it running with no trouble:
|
|
| .
| | |
| | |
| | |
|__________ | |
/ | _,..----. | / ,Y-o..
.| ,-'' | / .' / ' .
|| [ --.....- | | | `.
|| |".........__ | | \ |
b | ' | | \ |
| | | `. _,'
| | ' `'''
, , . .
\ .'| ,-'\V d---. |...
\. ,'| / |/ | / |
` ...,' ,' `..,Y / / |
_/ | | |
,' |
-._______/
I donāt really like the term āgatekeepingā, especially when itās used to describe the general concept of a barrier to entry. The term āgatekeepingā implies to me a āgatekeeperāāa person A who is trying to control if person B can interact with person C. It implies active discrimination, perhaps even bigotry, when in reality the barrier might be a passive issue such as scarcity or inherent complexity. āGatekeepingā seems an intentionally- and needlessly-charged term.
Iāve seen BlueSky referred to as BS (as in Blue Sky, but you knowā¦), which seems apt.
CEO is a cryptocurrency fool, as is Jack Dorsey, so I donāt expect much from it. Then again Iām old and refuse to join any new hotness so take my curmudgeonly opinions with a grain of salt.
I read somewhere or another that the ādecentralizationā is only going to be there so that they can push content moderation onto users. They will happily welcome Nazis and fascists, leaving it up to end users to block those instances.
I wonder how they plan to handle the 4chan-level stuff, since that will surely come.
Lymphocytes
ā Read more
Etymonline
ā Read more
I have found the issue with this very subtle bug.. the cache was returning a slice that would be mutated. The mutation involved appending an item and then sorting. because the returned slice is just a pointer+length the sort would modify the same memory.
CACHE Returned slice
original: [A B C D] [A B C D]
add: [A B C D] E [A B C D E]
sort: [E A B C] D [A B C D E]
fix found here:
https://git.mills.io/yarnsocial/yarn/pulls/1072
I use IP over Alternating Current at home. The only issue is the bridges forget device MACs sometimes and I get weird states where I can ping a deviceA and the the internet from deviceB. But deviceA can only ping device B even though they are on the same subnet and default gateway.
The problem I have with the vast majority of social movements, left or right, is that they often lead to projection instead of introspection. Instead of person A trying to decide how person B can treat person C better, person A should try to decide how person A can treat person C better.
About two years late, but I finally finished setting up an iOS Shortcut so I can post to my blog via ssh. http://a.9srv.net/b/
Bayesā Theorem
ā Read more
the āyeet jeffy b into spaceā petition is going really well. sign now if you havenāt! https://www.change.org/p/the-proletariat-do-not-allow-jeff-bezos-to-return-to-earth?utm_content=FuckOff&recruiter=852121435&recruited_by_id=8453d7e9-a325-47cd-ac4f-5d30eee874c6&utm_source=FuckOff&utm_medium=FuckOff&utm_campaign=FuckOff
we need like 3-5x more space organizations lifting stuff and developing tech for long-term space travel. jeffy b and the muskrat donāt cut it. are we really going to let imperials take the first serious steps into space?
lextwt branch. There's a noticeable ~2x increase in CPU usage across the board since I deployed this at ~16.30pm (AEST).
@prologic@twtxt.net That is strange.. i wonder if there is another change that is causing it. Benchmarks are thinking the other way :|
BenchmarkAll/retwt-16 1 4940172200 ns/op 587319376 B/op 2587159 allocs/op
BenchmarkAll/lextwt-16 1 775764020 ns/op 9223088 B/op 197557 allocs/op
BenchmarkParse/retwt-16 1 591158277 ns/op 67539096 B/op 230841 allocs/op
BenchmarkParse/lextwt-16 1 716961837 ns/op 5450448 B/op 130290 allocs/op
BenchmarkOutput/retwt-html-16 1 8358103017 ns/op 918709168 B/op 4692292 allocs/op
BenchmarkOutput/lextwt-html-16 1 822033267 ns/op 14280112 B/op 261795 allocs/op
BenchmarkOutput/retwt-markdown-16 1 8114225415 ns/op 929928384 B/op 4693004 allocs/op
BenchmarkOutput/lextwt-markdown-16 1 806554306 ns/op 14332608 B/op 270905 allocs/op
BenchmarkOutput/retwt-text-16 1 8098215897 ns/op 923862192 B/op 4684739 allocs/op
BenchmarkOutput/lextwt-text-16 1 745064673 ns/op 12689784 B/op 252476 allocs/op
BenchmarkOutput/retwt-literal-16 1 4068799822 ns/op 409517880 B/op 2372471 allocs/op
BenchmarkOutput/lextwt-literal-16 1 754793627 ns/op 9834520 B/op 214931 allocs/op
;add(p,p);cswap(p,q,b);}}sv scalarbase(gf p[4],const u8*s){gf q[4];set25519(q[0],X);set25519(q[1],Y);set25519(q[2],gf1);M(q[3],X,Y);
p[1],h,g);M(p[2],g,f);M(p[3],e,h);}sv cswap(gf p[4],gf q[4],u8 b){int i;FOR(i,4)sel25519(p[i],q[i],b);}sv pack(u8*r,gf p[4]){gf tx,ty,zi;
+Ch(a[4],a[5],a[6])+K[i]+w[i%16];b[7]=t+Sigma0(a[0])+Maj(a[0],a[1],a[2]);b[3]+=t;FOR(j,8)a[(j+1)%8]=b[j];if(i%16==15)FOR(j,16)w[j]+=w[
2014-04-27T16:21:09 (j+9)%16]+sigma0(w[(j+1)%16])+sigma1(w[(j+14)%16]);}FOR(i,8){a[i]+=z[i];z[i]=a[i];}m+=128;n-=128;}FOR(i,8)ts64(x+8*i,z[i]);return n;}static
1);FOR(i,16){t=c&(p[i]^q[i]);p[i]^=t;q[i]^=t;}}sv pack25519(u8*o,const gf n){int i,j,b;gf m,t;FOR(i,16)t[i]=n[i];car25519(t);car25519(t);
]=iv[i];crypto_hashblocks(h,m,n);m+=n;n&=127;m-=n;FOR(i,256)x[i]=0;FOR(i,n)x[i]=m[i];x[n]=128;n=256-128*(n<112);x[n-9]=b>>61;ts64(x+n-8,b<<3
;b=(m[15]>>16)&1;m[14]&=0xffff;sel25519(t,m,1-b);}FOR(i,16){o[2*i]=t[i]Ćæo[2*i+1]=t[i]>>8;}}static int neq25519(const gf a,const gf b){
,k,sigma);FOR(i,64)c[i]=(m?m[i]:0)^x[i];u=1;for(i=8;i<16;++i){u+=(u32)z[i];z[i]=u;u>>=8;}b-=64;c+=64;if(m)m+=64;}if(b){crypto_core_salsa20(x
);crypto_hashblocks(h,x,n);FOR(i,64)out[i]=h[i];return 0;}sv add(gf p[4],gf q[4]){gf a,b,c,d,t,e,f,g,h;Z(a,p[1],p[0]);Z(t,q[1],q[0]);M(a,a,t