Giter Site home page Giter Site logo

delete-tweets's Introduction

Hello! 👋 I'm an experienced engineer and tech lead with a strong security background. I love working with product, design, engineering, and legal to help build and ship secure products.

I'm currently leading the security program at Framer, a web-based collaborative prototyping and design tool for teams.

delete-tweets's People

Contributors

adrianteri avatar boyvanamstel avatar cyb3rsalih avatar dependabot-preview[bot] avatar dependabot-support avatar jamestwebber avatar kivikakk avatar koenrh avatar kylestratis avatar lewiscowles1986 avatar vlaship avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

delete-tweets's Issues

ModuleNotFoundError: No module named 'twitter'

I have twitter package installed as the result of conda list | grep twitter results in
python-twitter 3.5 py_0 conda-forge twitter 1.18.0 pypi_0 pypi.
But if I try to import twitter in my jupyter notebook using import twitter it gives an ModuleNotFoundError: No module named 'twitter' error.
What am I doing wrong?

--dry-run doesn't

I haven't looked into why, but it's worth noting that --dry-run doesn't appear to actually dry run right now — the tweets are deleted.

Bad authentication data

I keep getting “Bad authentication data” even though the credentials are right.

The weirdest thing is that when i set to delete tweets from a period of time when there was 0 tweets to delete, it recognizes 0 tweet was deleted. Otherwise i get this error.

Dependabot couldn't find a Dockerfile for this project

Dependabot couldn't find a Dockerfile for this project.

Dependabot requires a Dockerfile to evaluate your project's current Docker dependencies. It had expected to find one at the path: /Dockerfile.

If this isn't a Docker project, or if it is a library, you may wish to disable updates for it from within Dependabot.

Bad Auth data

Exception: [{'code': 215, 'message': 'Bad Authentication data.'}]

ImportError: No module named twitter

Everything seemed to go ok until I tried to delete tweets and got the following error message:

File "deletetweets.py", line 8, in
import twitter
ImportError: No module named twitter

Twitter API credentials not set

OK, so I followed the steps to delete the tweets on my TimeLine. However, upon running the delete tweet python script on my CMD console, I get an error; Twitter API credentials not set. I do believe I exported all my credentials, however, I may have missed a couple of steps? I am not sure. Also, I figured the script might be outdated, following @icommitfelonies butchered tweets code .

The fact is that; I have the tweet.js file, which is about 100MB and I have the twitter app credentials created, but I believe your script advised us to use a certain CSV file, which I doubt works after 2018.

Please, is there a new code? Are there guidelines to follow to help me use this new code? Please help. Thanks

Python os.environ not pulling environment variables for api token credentials

Seen this issue a few times and I double checked/verified creds were inputted right using the export VARIABLE="<token/secret>" and verified they were there with export -p

Yielded the [215] error 'Bad authentication data'. Dug through the python script and replaced the os.environ calls with direct strings of the tokens/secrets and it worked.

System is a Debian GCloud VM Instance
Python 3.7

Exception: The twitter.Api instance must be authenticated.

When trying: delete-tweets --until 2014-12-12 tweet.js
I get the following output..

delete tweet 150703127539093504
Exception: The twitter.Api instance must be authenticated.

delete tweet 150599558748061696
Exception: The twitter.Api instance must be authenticated.

delete tweet 150534176360247296
Exception: The twitter.Api instance must be authenticated.

delete tweet 150415891975254016
Exception: The twitter.Api instance must be authenticated.

delete tweet 150127716870529024
Exception: The twitter.Api instance must be authenticated.

delete tweet 149988523955597312
Exception: The twitter.Api instance must be authenticated.

delete tweet 149914532029005825
Exception: The twitter.Api instance must be authenticated.

delete tweet 149914294027436032
Exception: The twitter.Api instance must be authenticated.

delete tweet 149904635010891776
Exception: The twitter.Api instance must be authenticated.

Number of deleted tweets: 2921

Does this mean that my app request is not approved yet? (if yes, Any idea how long this might take?)

I also asked this question on stackoverflow, if you want to read the discussion there: https://stackoverflow.com/questions/60255564/delete-tweets-twitter?noredirect=1#comment106582168_60255564

Script not working

When I try it I get

root@DietPi:~# delete-tweets --until 2021-01-01 tweet.js
Traceback (most recent call last):
  File "/usr/local/bin/delete-tweets", line 6, in <module>
    from deletetweets.__main__ import main
  File "/usr/local/lib/python2.7/dist-packages/deletetweets/__main__.py", line 7, in <module>
    from deletetweets import deletetweets
ImportError: cannot import name deletetweets

I am using a Pi with DietPi installed, followed the guide to the letter, not sure where I went wrong?

JSON error

I ran into this error. Does tweet.js have to meet any requirement?

$ delete-tweets --until 2019-12-31 tweet.js
Traceback (most recent call last):
  File "/home/er/.local/bin/delete-tweets", line 11, in <module>
    sys.exit(main())
  File "/home/er/.local/lib/python3.6/site-packages/deletetweets/__main__.py", line 55, in main
    args.min_likes, args.min_retweets, args.dry_run)
  File "/home/er/.local/lib/python3.6/site-packages/deletetweets/deletetweets.py", line 69, in delete
    tweets = json.loads(tweetjs_file.read()[25:])
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Add support to delete recent tweets without having to request export from Twitter

Assume the following use case:

  • all tweets older than 4 weeks should be deleted (even from years ago) - the initial purge
  • from now on the script will be run daily to keep tweets at most 4 weeks old

The second part could be automated by running the script as a job (CRON or Windows Task) e.g. once every day. Unfortunately this currently means the archive would have to be requested every day as well.
I propose to add an optional mode to pull the recent tweets from the timeline instead of from tweet.js so that the script execution can be fully automated.

Does this make sense? Is this still within the intended scope of the script?

Key Error

Not sure why I'm getting this. The keys are correct, i even regenerated them and still get this message.
screen shot 2019-01-15 at 2 08 32 am

json.decoder.JSONDecodeError: Extra data: line 1 column 12 (char 11)

Traceback (most recent call last):
  File "/usr/local/bin/delete-tweets", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/dist-packages/deletetweets/__main__.py", line 53, in main
    deletetweets.delete(args.file, args.date, filters, args.spare_ids, args.min_likes, args.min_retweets, args.dry_run)
  File "/usr/local/lib/python3.7/dist-packages/deletetweets/deletetweets.py", line 72, in delete
    tweets = json.loads(tweetjs_file.read()[25:])
  File "/usr/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.7/json/decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 12 (char 11)

Json that is being used
https://sfo2.digitaloceanspaces.com/mbcdn/psty/d3a_tweet-part2.js

Not why I’m getting the error that’s being shown above?

Twitter Archive doesn't load all tweets

Accessing the twitter archive allowed me to delete around 30 tweets more than 3200 tweets, but I still have some left. It doesn't seem like they will show up on the csv file from Twitter. Is there another way to access the JSON ID of those earlier tweets?

Bad Auth data

I have set my tokens and even manually entered in the deletetweet.py file and I still have the error:

Exception: [{'code': 215, 'message': 'Bad Authentication data.'}]

python3

Fancy a patch for python3 and systems that python doesn't default to "utf8" encoding?

Otherwise the following errors are generated

Python2/3 print

$ python deletetweets.py -d 2013-10-01
  File "deletetweets.py", line 30
    print "Deleting tweet #{0} ({1})".format(tweet_id, tweet_date)
                                    ^
SyntaxError: invalid syntax

UTF-8 windows bug

$ python deletetweets.py -d 2015-12-31
Traceback (most recent call last):
  File "deletetweets.py", line 63, in <module>
    main()
  File "deletetweets.py", line 59, in main
    delete(api, args.date, args.restrict)
  File "deletetweets.py", line 18, in delete
    for row in csv.DictReader(file):
  File "C:\Program Files\Python36\lib\csv.py", line 111, in __next__
    self.fieldnames
  File "C:\Program Files\Python36\lib\csv.py", line 98, in fieldnames
    self._fieldnames = next(self.reader)
  File "C:\Program Files\Python36\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 2268: character maps to <undefined>

Has anyone got suspended before?

So i want to try this app. But I'm afraid my Twitter account will be suspended. There is no information about destroy tweet limit, it doesnt like post update tweet and get tweet.

Has anyone got suspended before? Or has anyone try to delete more than tens of thousands of tweets in a short period of time?

Tweets aren't being deleted when requested

First of all, thank you for your work. I've used several times in the last months, but today I ran through an issue where I tell python to run delete-tweets, but it doesn't work. There is no tweets deleted.

I already set my variables (on cmd, Windows, with the set command) and have the tweet.js on the root folder. My code looks like this:

C:\folder>set TWITTER_CONSUMER_KEY="xxxxxx"

C:\folder>set TWITTER_CONSUMER_SECRET="xxxxxx"

C:\folder>set TWITTER_ACCESS_TOKEN="xxxxxx"

C:\folder>set TWITTER_ACCESS_TOKEN_SECRET="xxxxxx"

C:\folder>python delete-tweets --until 2020-10-10 tweet.js --spare-min-likes 10 --spare-min-retweets 5

C:\folder>

As you can see, no action is done when I ask it to delete tweets. What can I possibly be doing wrong?

Twitter API credentials not set.

Hi koenrh,

Running from a command line (not BASH), I keep getting "Twitter API credentials not set." even though I've set them where specified in two places. I'm not sure if it's something I'm doing or if others are experiencing similar. Thank you.

Delete replies deletes threaded conversation too

When the script is told to delete replies, it deletes replies of the user to their own tweets. These are truly not replies but threaded tweets even thought technically they are classified as replies. There should be an option to spare these replies from being deleted.

Check whether environment variables are picked up on Windows (WSL)

Hello,
I'm using Bash (on Windows with the Linux subsystem), everything should be working but I get the same error. I checked my ENV variables and all of them are there :/

Edit: Tried to set the env variables directly on Windows and it worked BUT I get this error
"Exception: [{'code': 215, 'message': 'Bad Authentication data.'}]"

I double checked the credentials and they are correct (even created a new app ...)

Edit2: I replaced the os.env part of your code directly with my tokens and it works just fine

#27 (comment)

Environment variables set in Bash in WSL do not appear to be picked up (correctly).

No more tweets.csv file

Trying to make this work, but Twitter didn't provide the tweets.csv file. Did they change the export structure?
They only provide .js files, one of them tweet.js, where all the tweets are.
Hovewer this seems to have different json structure, as I am getting error:

  File "deletetweets.py", line 20, in delete
    tweet_id = int(row["tweet_id"])
KeyError: 'tweet_id'

Perhaps correction will be necessary (in which case I can do it).

About variables

It's not clear for me, where paste :

TWITTER_CONSUMER_KEY="[your consumer key]"
TWITTER_CONSUMER_SECRET="[your consumer secret]"
TWITTER_ACCESS_TOKEN="[your access token]"
TWITTER_ACCESS_TOKEN_SECRET="[your access token secret]"

Best,

S.

Bad Auth Data

Hello, thanks for this.
I keep getting this error

delete tweet 946339619297202176
Exception: [{'code': 215, 'message': 'Bad Authentication data.'}]

Adding keyword search

I am trying to add a keyword search to this fantastic script, this is what I got this far. Do you have any suggestions on how to fix this?

#!/usr/bin/env python

import argparse
import io
import os
import sys
import time
import json

import twitter
from dateutil.parser import parse

__author__ = "Koen Rouwhorst"
__version__ = "1.0.0"


class TweetDestroyer(object):
    def __init__(self, twitter_api):
        self.twitter_api = twitter_api

    def destroy(self, tweet_id):
        try:
            print("delete tweet %s" % tweet_id)
            self.twitter_api.DestroyStatus(tweet_id)
            # NOTE: A poor man's solution to honor Twitter's rate limits.
            time.sleep(0.5)
        except twitter.TwitterError as err:
            print("Exception: %s\n" % err.message)


class TweetReader(object):
    def __init__(self, reader, keyword=None, date=None, restrict=None, spare=[], min_likes=0, min_retweets=0):
        self.reader = reader
        if date is not None:
            self.date = parse(date, ignoretz=True).date()
        self.restrict = restrict
        self.spare = spare
        self.min_likes = min_likes
        self.min_retweets = min_retweets
	self.keyword = keyword


    def read(self):
        for row in self.reader:
            if row.get("created_at", "") != "":
                tweet_date = parse(row["created_at"], ignoretz=True).date()
                if self.date != "" and \
                        self.date is not None and \
                        tweet_date >= self.date:
                    continue

            if (self.restrict == "retweet" and
                    not row.get("full_text").startswith("RT @")) or \
                    (self.restrict == "reply" and
                     row.get("in_reply_to_user_id_str") == ""):
                continue

            if row.get("id_str") in self.spare:
                continue

            if (self.min_likes > 0 and int(row.get("favorite_count")) >= self.min_likes) or \
                    (self.min_retweets > 0 and int(row.get("retweet_count")) >= self.min_retweets):
                continue

            if self.keyword is not None:
	        tweet_text = row.get("full_text").encode("utf-8")
	        if (self.keyword in tweet_text.split()):
		   continue	

            yield row


def delete(tweetjs_path, k, date, r, s, min_l, min_r):
    with io.open(tweetjs_path, mode="r", encoding="utf-8") as tweetjs_file:
        count = 0

        api = twitter.Api(consumer_key=os.environ["TWITTER_CONSUMER_KEY"],
                          consumer_secret=os.environ["TWITTER_CONSUMER_SECRET"],
                          access_token_key=os.environ["TWITTER_ACCESS_TOKEN"],
                          access_token_secret=os.environ["TWITTER_ACCESS_TOKEN_SECRET"])
        destroyer = TweetDestroyer(api)

        tweets = json.loads(tweetjs_file.read()[25:])
        for row in TweetReader(tweets, k, date, r, s, min_l, min_r).read():
             destroyer.destroy(row["id_str"])
             count += 1

        print("Number of deleted tweets: %s\n" % count)

def main():
    parser = argparse.ArgumentParser(description="Delete old tweets.")
    parser.add_argument("-d", dest="date", required=True,
                        help="Delete tweets until this date")
    parser.add_argument("-r", dest="restrict", choices=["reply", "retweet"],
                        help="Restrict to either replies or retweets")
    parser.add_argument("file", help="Path to the tweet.js file",
                        type=str)
    parser.add_argument("--spare-ids", dest="spare_ids", help="A list of tweet ids to spare",
                        type=str, nargs="+", default=[])
    parser.add_argument("--spare-min-likes", dest="min_likes",
                        help="Spare tweets with more than the provided likes", type=int)
    parser.add_argument("--spare-min-retweets", dest="min_retweets",
                        help="Spare tweets with more than the provided retweets", type=int)
    parser.add_argument("--keyword", dest="keyword",
                        help="Keyword in tweets to delete")

    args = parser.parse_args()

    if not ("TWITTER_CONSUMER_KEY" in os.environ and
            "TWITTER_CONSUMER_SECRET" in os.environ and
            "TWITTER_ACCESS_TOKEN" in os.environ and
            "TWITTER_ACCESS_TOKEN_SECRET" in os.environ):
        sys.stderr.write("Twitter API credentials not set.")
        exit(1)

    delete(args.file, args.keyword, args.date, args.restrict, args.spare_ids, args.min_likes, args.min_retweets)


if __name__ == "__main__":
    main()

Option to delete latest 3200 tweets without twitter archive

I would like to propose adding a new feature. As far as I understand when I run delete-tweets its remove only tweets using archive. Its good for remove large number of tweets, but when I want to delete tweets periodically I need generate every time new twitter archive with latest tweets. I found other tools but without "--spare-ids" functionality.

It would be good add new possibilities:

  • start without archive file
  • fetch tweets via API
  • remove tweets with --spare-ids functionality (or something like --spare-keyword)

Possibly incorrect test assertions for min_likes and min_retweets

Hi there! I was working on a PR to address Issue 49.

However, I noticed some confusing discrepancies between the README and the test assertions, and wanted to clarify first before submitting PRs.

min_likes expectations:

expected = [{"id_str": "21"}, {"id_str": "22"}]

Shouldn't the expected value be [{"id_str": "21"}] ?

According to the docs, it seems like the TweetReader should exclude any tweets with at least one or more retweet.

If you take a look at the actual TweetReader list in that test case by dropping in a breakpoint.

actual = list(TweetReader(FakeReader(tweets), min_likes=1).read())
(Pdb) actual
=> [{'id_str': '21', 'favorite_count': 0}]

min_retweets expectations:
Should this line

expected = [{"id_str": "21"}, {"id_str": "22"}]

be expected = [{'id_str': '21', 'retweet_count': 0}]?
Just like the above example, inspecting the actual list in the test returns: => [{'id_str': '21', 'retweet_count': 0}]

Problems with 'twitter.Api' and 'module' object not callable

Hello there.

First, using Linux and Python 3.7 here. Then, after install delete-tweets the first error was:

delete-tweets tweet.js 23:31 Traceback (most recent call last): File "/home/rodolfo/.local/bin/delete-tweets", line 8, in <module> sys.exit(main()) File "/home/rodolfo/.local/lib/python3.7/site-packages/deletetweets/__main__.py", line 53, in main deletetweets.delete(args.file, args.until_date, filters, args.spare_ids, args.min_likes, args.min_retweets, args.dry_run) File "/home/rodolfo/.local/lib/python3.7/site-packages/deletetweets/deletetweets.py", line 64, in delete api = twitter.Api(consumer_key=os.environ["TWITTER_CONSUMER_KEY"],
Then, changing it manually to "twitter.api" i received the next error:

delete-tweets tweet.js 23:31 Traceback (most recent call last): File "/home/rodolfo/.local/bin/delete-tweets", line 8, in <module> sys.exit(main()) File "/home/rodolfo/.local/lib/python3.7/site-packages/deletetweets/__main__.py", line 53, in main deletetweets.delete(args.file, args.until_date, filters, args.spare_ids, args.min_likes, args.min_retweets, args.dry_run) File "/home/rodolfo/.local/lib/python3.7/site-packages/deletetweets/deletetweets.py", line 64, in delete api = twitter.Api(consumer_key=os.environ["TWITTER_CONSUMER_KEY"],

Best regards.

KeyError: 'id_str'

When I run delete-tweets --until 2017-12-01 tweet.js, I get the following error:

Traceback (most recent call last): File "/usr/local/bin/delete-tweets", line 11, in <module> sys.exit(main()) File "/usr/local/lib/python3.7/site-packages/deletetweets/__main__.py", line 53, in main deletetweets.delete(args.file, args.until_date, filters, args.spare_ids, args.min_likes, args.min_retweets, args.dry_run) File "/usr/local/lib/python3.7/site-packages/deletetweets/deletetweets.py", line 72, in delete destroyer.destroy(row["id_str"]) KeyError: 'id_str'

Any idea how to fix this issue?

Cannot find Tweet.js on a Mac

I keep getting this error when I try to run delete-tweets --until 2019-01-01 tweet.js

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/bin/delete-tweets", line 8, in <module>
    sys.exit(main())
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/deletetweets/__main__.py", line 53, in main
    deletetweets.delete(args.file, args.until_date, filters, args.spare_ids, args.min_likes, args.min_retweets, args.dry_run)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/deletetweets/deletetweets.py", line 61, in delete
    with io.open(tweetjs_path, mode="r", encoding="utf-8") as tweetjs_file:
FileNotFoundError: [Errno 2] No such file or directory: 'tweet.js'

I have the very current version of Python installed, and Pip installed under Python 3. I also have tweet.js in all(delete-tweets and deletetweets) folders.

TypeError: '>' not supported between instances of 'NoneType' and 'int'

# python deletetweets.py -d 2019-09-14 ../TWITTER2/tweet.js 
Traceback (most recent call last):
  File "deletetweets.py", line 112, in <module>
    main()
  File "deletetweets.py", line 108, in main
    delete(args.file, args.date, args.restrict, args.spare_ids, args.min_likes, args.min_retweets)
  File "deletetweets.py", line 77, in delete
    for row in TweetReader(tweets, date, r, s, min_l, min_r).read():
  File "deletetweets.py", line 59, in read
    if (self.min_likes > 0 and int(row.get("favorite_count")) >= self.min_likes) or \
TypeError: '>' not supported between instances of 'NoneType' and 'int'

No tweets.csv

In reference to #5 and #16 (hipsters say comments on closed issues aren't read):

Location South Africa. No option to export tweets.csv, only tweets.js.

Structure of archive seems to have changed

I have run the script in my computer. I want to delete all the tweets prior to march 14th 2018 that have less than 500 likes. I executed the script like this:

delete-tweets --until 2018-03-14 tweet.js --spare-min-likes 500

I had about 150k tweets in my account and when the script was finished i checked and i still had ~100k tweets in my account. I thought that it was unlikely that i had posted 100k tweets in the last two years so i searched in my tweets and i found that there still were tweets from several years ago in my account. So i took one of the id's and searched for it in the tweet.js file and could not find it.
I found that there is another file named "tweet-part1.js" and i found the id on that file. I am not sure if this only happens with people that tweet a lot like i seem to do but i think this is something that should be taken into account.

Could not authenticate you

Everything is set as described but when deleting tweets I'm getting the message

"code": 32, "message": "Could not authenticate you."

ImportError: cannot import name deletetweets

whenever I try to execute delete-tweets it raises the following error:

Traceback (most recent call last):
  File "env/bin/delete-tweets", line 5, in <module>
    from deletetweets.__main__ import main
  File "/Users/carlos.vega/Documents/deletetweets/twitter-2019-12-08/env/lib/python2.7/site-packages/deletetweets/__main__.py", line 7, in <module>
    from deletetweets import deletetweets
ImportError: cannot import name deletetweets

Either from a virtualenv or system wide.

One precision in directions

Hi!
"Unpack the archive, and move tweet.js to the same directory as this script."
This is not clear. What directory?
The directory where delete-tweets gets installed by Pip? (Which would be "/usr/local/bin/delete-tweets")
Or the directory we're running the script from (assuming the shell is always somehow "in" a directory")?
Or… what? Where? :)

Thanks for clarifying!

Twitter rate limits

Hello!
Everything I see in the current Twitter documentation indicates a rate limit of 300 requests/3 hours (per application): https://blog.twitter.com/developer/en_us/topics/tools/2018/new-developer-requirements-to-protect-our-platform.html

"- Tweets & Retweets (combined): 300 per 3 hours"
I noticed that there's a comment about a "poor man's solution" to rate-limiting with a time.sleep(.5). Has the rate limit been changed since then, or is deleting a special case?

Thank you very much!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.