Anagramer. Find words in dictionary file C++/Qt.

Below sample of code to find word containing the same letters + one that is not the same but create new word:

tor -> sort -> sport

The code can get dictionary and word that should be found:

#include <iostream>
#include <QApplication>
#include <QStringList>
#include <QFile>
#include <QDebug>

using namespace std;

// oure game of words that matches pattern
QString findWord(QStringList &list, QString myWord)
{
    bool pass;
    foreach (QString word, list)
    {
        pass = true;
        int i = 0;
        while(i < myWord.size())
        {
            if(!word.contains(myWord.at(i++)))
            {
                //             qDebug() <<    word <<word.at(i-1);
                pass = false;
                break;
            }
        }
// word should has only one letter that can be other than we think
        if(pass && myWord.size() +1 == word.size())
            return word;
    } // if we not found we return empty string
    return "";
}

struct OtherWay{
    OtherWay(QStringList list, QStringList finds, QString alternative)
        : list(list), finds(finds), alternative(alternative){
        //        qDebug()  << "Alternative: " << list << finds << alternative;


    }
    QStringList list;
    QStringList finds;
    QString alternative;

};


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    QStringList args = a.arguments();

    // start word for finding solution
    QString found;
    QString file;
    if(args.size() > 1)
        found = args.at(1);
    if(args.size() > 2)
        file = args.at(2);
 
    QStringList list = {"ail", "tennis", "fails", "desk", "stay","plain", "table", "engine", "sail"};


    // read the file with the words
    if(!file.isEmpty())
    {
        QFile inputFile(file);
        if(inputFile.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            // clear default list
            list.clear();
            QTextStream in(&inputFile);
            while (!in.atEnd())
                list.append(in.readLine());
            inputFile.close();
        }

    }

// list of finds that match
    QStringList finds;

    QString tmp;
    // append word that we started
    finds.append(found);

    QList <QStringList> alternativeList;

    QList <OtherWay> otherWays;
    do
    {
        do
        {
            // search for the word
            tmp = found;
            found = findWord(list, found);
            // remove that we found. That protect as from infinite loops
            list.removeOne(found);

            if(!findWord(list,tmp).isEmpty())
            {
                OtherWay way(list,finds, findWord(list,tmp));
                way.finds.append(findWord(list,tmp));
                otherWays.append(way);
            }

            if(!found.isEmpty())
                finds.append(found);
        }while(!found.isEmpty());

        if(otherWays.isEmpty())
            break;

        alternativeList.append(finds);

        list = otherWays.first().list;
        found = otherWays.first().alternative;
        finds = otherWays.first().finds;
        otherWays.removeFirst();

    }while(otherWays.size() >= 0);

    if(finds.isEmpty())
    {
        qDebug() << "No solutions!";
        return 0;
    }

    alternativeList.append(finds);


// And finly we find from all alternatives list the longest that we want to print
    int id = 0;
    int max = 0;
    for(int i =0; i < alternativeList.size(); i++)
        if(max < alternativeList.at(i).size())
        {
            id = i;
            max = alternativeList.at(i).size();
        }
    qDebug() << "The longest list: " << alternativeList.at(id);

    return 0;
}

Twardy niedojrzały czerwony banan.

Dziś postanowiłem spróbować czerwonego Banana (jakkolwiek dwuznacznie to zabrzmi). Banany okazały się jednak posiadać twardą skórkę, a w środku być suche. Tak wiec postanowiłem je ugotować i dalej były jak papier w smaku. Trudno oceniać smak gdy w internecie wszyscy zachwalają miąższ z bananów rozpływający się w ustach. Jeżeli banany czerwone faktycznie są tak słodkie to moje musiały być bardzo niedojrzałe i ze złej serii :/ a to peszek.. Jednak jak wyczytałem to cena za kg wynosi 20zł, a ja kupiłem 600g za 3zł więc dużo nie straciłem. Smak papieru jednak został.
Poniżej relacja:

Oprogramowanie przyckisków Canon Lide 100 na Linuxie

Aby debugować scanbd używamy polecenia:

sudo scanbd -d7 -f -c /etc/scanbd/scanbd.conf

Output:

 scanbd: foreground
scanbd: config-file: /etc/scanbd/scanbd.conf
scanbd: reading config file /etc/scanbd/scanbd.conf
scanbd: debug on: level: 7
scanbd: dropping privs to uid saned
scanbd: dropping privs to gid scanner
scanbd: group scanner has member:
scanbd: saned
scanbd: drop privileges to gid: 109
scanbd: Running as effective gid 109
scanbd: drop privileges to uid: 108
scanbd: Running as effective uid 108
scanbd: dbus_init
scanbd: dbus match type='signal',interface='org.freedesktop.Hal.Manager'
scanbd: SANE_CONFIG_DIR not set
scanbd: sane version 1.0
scanbd: Scanning for local-only devices
^Xscanbd: start_sane_threads
scanbd: start dbus thread
scanbd: Not Primary Owner (2)
scanbd: timeout: 500 ms
scanbd: Iteration on dbus call

Przykładowa konfiguracja:

global {
       
        debug   = true
        debug-level = 2
        user    = saned
        group   = scanner
        saned   = "/usr/sbin/saned"

       
        timeout = 500
        pidfile = "/var/run/scanbd.pid"
       
        environment {
                device = "SCANBD_DEVICE"
                action = "SCANBD_ACTION"
        }
        function function_knob {
                filter = "^message.*"
                desc   = "The value of the function knob / wheel / selector"
                env    = "SCANBD_FUNCTION"
        }
        function function_mode {
                filter = "^mode.*"
                desc   = "Color mode"
                env    = "SCANBD_FUNCTION_MODE"
        }
 
        action scan {
                filter = "^scan.*"
                numerical-trigger {
                        from-value = 1
                        to-value   = 0
                }
                desc   = "Scan to file"
                script = "/etc/scanbd/copy.sh"
        }
        action email {
                filter = "^email$"
                string-trigger {
                        from-value  = ""        
                        to-value    = "^email.*"
                }
                desc   = "Scan to email"
                script = "/etc/scanbd/mail.sh"
        }
        action copy {
                filter = "^copy$"
                string-trigger {
                        from-value  = ""
                        to-value    = "^copy.*"
                }
                desc   = "Copy to printer"
                script = "/etc/scanbd/copy.sh"
        }
        action preview {
                filter = "^preview$"
                numerical-trigger {
                        from-value = 1
                        to-value   = 0
                }
                desc   = "Preview"
                script = "/etc/scanbd/scan.sh"
        }
        action globaltest {
                filter = "^message.*"
                desc   = "Test (print all env vars)"
                script = "/etc/scanbd/pdf.sh"
        }
        action globaltest {
                filter = "^pdf.*"
                desc   = "Test (print all env vars)"
                script = "/etc/scanbd/pdf.sh"
        }
}

include(scanner.d/canon.conf)

Zwróć uwagę na ostatnie linijki, które powinne zaierać Twój skaner.

W plikach mamy nazwy script np:
/etc/scanbd/pdf.sh

przykładowy plik:

#!/bin/sh
TMPFILE="/tmp/image.tiff"
LOCKFILE="/tmp/copy.lock"

echo "pdf tworzę" >> /var/log/syslog

/usr/bin/scanimage --mode lineart -B10M --resolution 600 | pnmtops -imageheight 11 -imagewidth 8.5 | ps2pdf - /home/szymon/skaner/output.pdf | /usr/bin/mail -s "PDF" -a /home/szymon/skaner/output.pdf szymon@artmetic.pl
 
pamiętajmy o nadaniu uprawnień plikom:
 
chmod +x /etc/scanbd/pdf.sh

Linux błąd filtru i pytania o hasło drukarki – naprawa.

Dziś po upgradzie do Ubuntu 16.04 moja drukarka odmówiła posłuszeństwa, a co gorsza w panelu z drukarkami jestem ciągle atakowany o podanie hasła więc postanowiłem po wielu nieudanych próbach podawania prawidłowego hasła jednak odpalić ją z roota. Jednak to nie był koniec kłopotów bo wyświetlał się ciągle komunikat o brakującym filtrze do drukarki. A więc rozwiązałem to tak:

sudo system-config-printer

następnie usunąłem i dodałem. Drukarka wystartowała ale od razu przeszedłem do kolejki wydruku bo trochę zaległych dokumentów tam wpadło 🙂

Jak zaoszczędzić sobie kilka minut życia kosztem Facebooka.

Jeżeli spędzasz godziny na przeglądaniu Facebooka, ale jednak chciałbyś się rozstać z tym toksycznym związkiem pochłaniającym Ci wiele czasu, może warto pobrać rozszerzenie do przeglądarki, które zasłoni ogólną oś czasu.

Link do rozszerzenia:
https://chrome.google.com/webstore/detail/kill-news-feed/hjobfcedfgohjkaieocljfcppjbkglfd/related