Wikipedia:Reference desk/Archives/Computing/2019 May 17

From Wikipedia, the free encyclopedia
Computing desk
< May 16 << Apr | May | Jun >> May 18 >
Welcome to the Wikipedia Computing Reference Desk Archives
The page you are currently viewing is a transcluded archive page. While you can leave answers for any questions shown below, please ask new questions on one of the current reference desk pages.


May 17[edit]

Information management[edit]

I am working on a project (academic; non-profit) and have identified about 30 people who might be interested in it. I don't know most of them personally but I know their email addresses and have good reason to think that they might be keen to be involved. I have these details on a google spreadsheet but I've not contacted anyone yet. I want to write a semi-personalised email to each one of them, asking if they're interested. They might say yes, or no, or offer advice, or ignore the email, or ask for further information, or suggest I write to a colleague instead. Or maybe some other unforeseen response that might involve back-and-forth email exchanges. Quite often I won't be able to respond immediately for one reason or another, and in this case the problem is that I will forget to reply.

I want a system that records the various communications, and maybe do things like list every person who has not replied within a week, or every person that has said "yes".

What zero-cost software exists to help me manage this? This must be a common situation but I don't know how to describe it. I'd like to see what actions there are on me at any time. Maybe someone will email me and I'll want to see all previous correspondence with that person. Is project management software good here? Emacs org-mode? Does gmail have some facilities here? Robinh (talk) 03:19, 17 May 2019 (UTC)[reply]

What's "zero cost"? To buy, or to learn? Almost certainly, something that you already know would be more useful to you than something you adopt from fresh (even if free).
Personally I do this with MediaWiki. I run a couple of MediaWikis just for organising business and domestic stuff. Draft WP articles too. It's easy to install and you already know how to edit it. Other options would be Excel, a decent email client with good tagging, or just a text editor, lists and regular expressions.
The game changes if you want to share that information amongst a group of people. Then you might look at Trello, which is web-hosted. Andy Dingley (talk) 16:34, 17 May 2019 (UTC)[reply]
Also consider Dokuwiki which supports groups well. The syntax is a little different from MediaWiki, but the great thing is that it avoids the overhead of having to run a database system – all storage is in plain text files. Martin of Sheffield (talk) 08:38, 18 May 2019 (UTC)[reply]
Thanks for this. "Zero cost" means no cost to purchase, a steep learning curve is no problem. Everything I want to do is for my own reference to keep myself organised, so there is no issue with sharing information. I do like the idea of a personal mediawiki though. thanks, Robinh (talk) 03:48, 18 May 2019 (UTC)[reply]
(OP, somewhat confused...someone suggested I look at customer relationship management but the edit seems to have disappeared). Anyway, the phrase I needed was exactly that: customer relationship management. Thanks! Now I can google "open source CRM software" and see what's out there. The software I can see looks somewhat OTT for my use-case, but that's good to know. Knowing that little phrase makes all the difference. Thanks, really. Robinh (talk) 05:23, 18 May 2019 (UTC)[reply]

Questions about twitter and facebook[edit]

1. How can I check to see if I have messages from people on my twitter account? I hardly use twitter by the way. 2. On facebook when I see the chat thing that has contacts for some weird reason it shows when people were on facebook a few minutes ago and not current people logged into the chat. Please help 204.239.8.205 (talk) 03:25, 17 May 2019 (UTC)[reply]

What words Atbash plus Caesar to eachother?[edit]

This was originally posted at WP:RDL, but it didn't seem related to natural or "normal" constructed languages, and it's definitely computing, so I decided to move it here. Nyttend (talk) 22:03, 17 May 2019 (UTC)[reply]

I saw this in "Azby-Shiftwords". Like "loopwords" on wikipedia, I want a list of words that Atbash plus Caesar to eachother.

A cipher would be: first you Atbash cipher a word, then you Caesar cipher it.

The shift of 5 for example would be plain - abcdefghijklmnopqrstuvwxyz coded - edcbazyxwvutsrqponmlkjihgf

A program would be like the program for Caesar cipher pairs(https://github.com/duckythescientist/CaesarPairs/blob/master/CaesarPairs.py) modified for Atbash. My modification of it didn't work:

  1. !/usr/bin/env python

'rots.py -- find caesar shift pairs in american-english' 'uses dictionary found in /usr/share/dict'

def getpairs():

   pairs = []
   try:
       f = open("/usr/share/dict/american-english", "r")
   except IOError, e:
       print "*** file open error: ", e
   else: 
       strs = f.readlines()
       raw = [x[:-1] for x in strs]
       raw2 = [x.replace("'s", "") for x in raw]
       raw3 = [x for x in raw2 if len(x)>2]
       vocab = set([x.lower() for x in raw3])  
       
       for word in vocab:
           for shift in range(0, 26):
               atbash = "".join([chr(97 + (27 - (ord(x) - 96) % 26)) for x in word])
               caesar = "".join([chr(97 + ((ord(x) - 97 + shift) % 26)) for x in word])
               if caesar in vocab:
                   print word, caesar, shift
                   pairs += tuple([word, caesar, shift])
   return len(pairs)/3

if __name__ == "__main__":

   print getpairs(), "pairs found"
   print "note, each pair has a reverse shift as well"

Can you post a list of pairs or a working program to do this?

I had to look up Atbash but it is pretty simple. The basic idea is to use a fast lookup table (Python dictionary or set) to store all the unenciphered words from your wordlist, then run through the wordlist, encrypt each word, and see if the encrypted version appears in the lookup table. I'm assuming your goal is to learn Python rather than just get the resulting wordlist. So I'd say you are basically on the right track. But you compute the atbash and caesar encryptions separately (using the word as input to both) and then do nothing with the atbash. You want to use the atbash output as the caesar input instead. The main other suggestion I'd make is split the program into separate functions (read and clean the wordlist, do the atbash cipher, do the caesar cipher) so they can be studied separately. That makes the program more modular and easier to understand. 173.228.123.207 (talk) 03:35, 18 May 2019 (UTC)[reply]

I'll be away thru the weekend so will post my version below. It's not polished or anything but just followed what seemed like a natural breakdown of the problem. I avoided using too many slick python-isms like generator comprehensions so it's less concise than it could be, and various optimizations are possible like using byte arrays for the words. It's python 2 and doesn't attempt to do anything sane with unicode.

Code
import string
wordfile = '/tmp/words'

def get_wordset(wordfile):
    ws = set()
    with open(wordfile) as f:
        for line in f:
            word = clean_word(line)
            if len(word) > 2:
                ws.add(word)
    return ws

def clean_word(line):
    w = line.strip().lower()
    if w.endswith("'s"):
        return w[:-2]
    return w

def atbash(letter):             # letter must be ascii lowercase
    return chr(ord('a') + ord('z') - ord(letter))

def caesar(letter, shift):      # letter must be ascii lowercase
    return chr(ord('a') + (ord(letter) - ord('a') + shift) % 26)

# encrypt word using both the caesar and atbash ciphers
def encrypt(word, shift):
    result = []
    for char in word:           
        # chars might be non-letters, so only encrypt the letters
        if char in string.lowercase:
            d = caesar(atbash(char), shift)
        else:
            d = char
        result.append(d)
    return ''.join(result)

def main():
    wordset = get_wordset(wordfile)
    n_pairs = 0
    print len(wordset),'words'
    for word in wordset:
        for shift in range(14):
            if encrypt(word, shift) in wordset:
                print word,shift,encrypt(word, shift)
                n_pairs += 1
    return n_pairs

if __name__ == '__main__':
    print main(),'pairs found'

173.228.123.207 (talk) 06:25, 18 May 2019 (UTC)[reply]

This helps, but you need to change "14" to "26" since each shift reverses itself and the pairs for let's say 14 are different from 12, and change "/tmp/words" to "/usr/share/dict/american-english"

Pairs

Here are the longest pairs for each shift: 0 - grog-tilt, girt-trig(reversal pair!), hold-slow, and many more 1 - hasp-tail, jail-rasp, haji-tars, and many more 2 - jinny-stood 3 - dunne-zippy, arias-cluck, acrux-calif 4 - avid-diva(reversal pair again!), opal-pods 5 - barman-denser 6 - ribs-oxen, been-ebbs, colt-drum, and many more 7 - cairn-Egypt 8 - potts-stoop, putts-snoop, chide-fazed 9 - butter-hopper, duffer-fodder, pewter-temper, and many more 10 - speer-ruffs 11 - sachs-skids, scads-sikhs, swags-sokes 12 - pulse-wrath, plasm-waltz, adult-liras 13 - ditto-jetty 14 - etna-Juan 15 - collar-Maddox 16 - ally-peer, kelp-flea, apex-pals, and many more 17 - bikes-pigmy, hills-jiffy 18 - carve-prawn, Drano-oared, franz-mared, and many more 19 - aloof-sheen 20 - bathe-stamp, belau-spitz 21 - chat-snub, back-tusk, dusk-rack, and many more 22 - corned-theirs, divers-snared, doreen-sherri 23 - kiddie-mottos 24 - exit-tape 25 - grunt-shelf, genoa-sulky, gully-senna

A bigger dictionary yields these: 0 - brigs-yirth, girth-trigs, grogs-tilth 1 - banana-zanana 2 - same as before 3 - booboo-booboo 4 - loppy-spoof 5 - same as before 6 - bimbos-extern 7 - same as before 8 - duende-endued 9 - pewterer-temperer 10 - same as before 11 - roctas-twirks 12 - furfur-grugru, penile-whydah 13 - telembi-tibiale 14 - fatwa-inurn 15 - same as before 16 - clover-nebuly 17 - ridgils-zinkify 18 - same as before 19 - same as before 20 - same as before 21 - farms-pudic 22 - coheirs-thorned 23 - hilloed-pollist 24 - fidge-spurt 25 - same as before

Some make sense such as kale-blah, ally-peer, and ice-age. Some are opposites, like tips-junk and dirge-farce.