howdoi icon indicating copy to clipboard operation
howdoi copied to clipboard

Request for Help: Show me queries that don't have a good answer

Open gleitz opened this issue 3 years ago • 11 comments

howdoi needs your help! We're looking to improve the quality of answers returned by the system. If you find a query that doesn't seem to have the right answer, could you please include the query and the response below? We'll use this to build a robust set of heuristics and perhaps an AI model to help you hack better.

Here's an example:

» howdoi parse html regex
inal snuf

Instead, we should probably return the entire answer for this query.

Thanks!

gleitz avatar Apr 08 '21 15:04 gleitz

Started collecting some bad queries and potential solutions at https://docs.google.com/spreadsheets/d/16nzBO6s4S61iScaEgtf6KAoJ5he7f3he5dJ-ElG9ViM/edit?usp=sharing

gleitz avatar Jul 13 '21 17:07 gleitz

We should update this line https://github.com/gleitz/howdoi/blob/master/howdoi/howdoi.py#L353

To be smarter about how we pick the code block or answer. For example if there are multiple pre's then we should return all of them. If there is a code block but it's small we should perhaps return the entire answer, etc.

gleitz avatar Jul 13 '21 17:07 gleitz

The following gives the wrong answer.

$ python -m howdoi run for loop in python
#!/usr/bin/python

while True:
    # some python code that I want 
    # to keep on running

If I change the query slightly (delete the word "run"), I get correct answers.

$ python -m howdoi for loop in python
for k in range(1,c+1,2):
$ python -m howdoi for loop python
for k in range(1,c+1,2):

theairbend3r avatar Oct 04 '21 16:10 theairbend3r

This query howdoi implement binary tree in C++ gives the following output instead of the actual implementation which is different from other languages also mentioned below -

In C++

$ howdoi implement binary tree in C++
root

The above answer returned is not the actual implementation whereas other languages usually return the full implementation even the uncommon languages.

In JavaScript

$ howdoi implement binary tree in javascript
function Node(value) {
    this.value = value;
    // this.left = null;
    // this.right = null;
}

function insertNode(tree, value) {
    var node = tree,
        key;
    while (node.value !== value) {
         key = value < node.value ? 'left' : 'right';
         if (!node) {
             node = new Node(value);
             break;
         }
         node = node;
    }
    return tree;
}

var array = [8, 10, 12, 5, 3, 6],
    tree = array.reduce((t, v) => t ? insertNode(t, v) : new Node(v), null);

console.log(tree);

In Go

$ howdoi implement binary tree in go
func InsertNodeToTree(tree *TreeNode, node *TreeNode) {
    if tree == nil {
        panic("cannot insert into nil root")
    }

    if node.Value > tree.Value {
        if tree.Right == nil {
            tree.Right = node
        } else {
            InsertNodeToTree(tree.Right, node)
        }
    }
    if node.Value < tree.Value {
        if tree.Left == nil {
            tree.Left = node
        } else {
            InsertNodeToTree(tree.Left, node)
        }
    }
}

Also while working on syntax highlighting, I noticed a lot of howdoi queries on C++ do not return an accurate answer. Following are some more examples -

$ howdoi implement linked list in C++
if(head == tail) {

$ howdoi implement stack in C++
cout<<"stack is emphty");

Furthermore, a lot of queries are based on C++ mentioned in this sheet

V2dha avatar Dec 01 '21 14:12 V2dha

$ howdoi -ac check file exists bash --explain
INFO: Version: 2.0.19
INFO: Fetching answers for query: check file exists bash
INFO: Searching google with URL: https://www.google.com/search?q=site:stackoverflow.com%20check%20file%20exists%20bash&hl=en
INFO: Links from stackoverflow.com found on google: 1
INFO: URL: https://stackoverflow.com/questions/638975/how-do-i-tell-if-a-regular-file-does-not-exist-in-bash
INFO: Answers requested: 1, Starting at position: 1
INFO: Total answers returned: 0

The answer to this query is in a code block in the top (accepted) answer of the SO link shown in the INFO: URL: line so its not clear why 0 answers would be returned

justin-f-perez avatar Dec 01 '21 16:12 justin-f-perez

@justin-f-perez would you try passing the -C flag to clear your cache? I do get a result when I try the same search:

» howdoi -ac check file exists bash --explain -C
INFO: Version: 2.0.19
Cache cleared successfully
INFO: Fetching answers for query: check file exists bash
INFO: Searching google with URL: https://www.google.com/search?q=site:stackoverflow.com%20check%20file%20exists%20bash&hl=en
INFO: Links from stackoverflow.com found on google: 1
INFO: URL: https://stackoverflow.com/questions/638975/how-do-i-tell-if-a-regular-file-does-not-exist-in-bash
INFO: Answers requested: 1, Starting at position: 1
INFO: Total answers returned: 1
★  Answer from https://stackoverflow.com/questions/638975/how-do-i-tell-if-a-regular-file-does-not-exist-in-bash ★
The [test](http://man7.org/linux/man-pages/man1/test.1.html) command ([ here) has a "not" logical operator which is the exclamation point (similar to many other languages). Try this:
if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

gleitz avatar Dec 03 '21 04:12 gleitz

@gleitz This seems to be a pretty complex problem. Clearing cache didn't help.

My 'normal' howdoi installation is via pipx install howdoi (where pipx is installed via homebrew), which makes it globally available (installing to ~/.local/bin/howdoi) even if I have a python3-venv/conda-env activated. Additionally, I have two different versions of python installed via homebrew. The "default" is 3.9.9; however, pipx links new packages against python3.10.

I get the same result as you when I install:

  • via pip in a python3-venv on linux
  • via pipx inside of docker (image: python:3.10)
  • via pip inside of a conda environment

I also get "no answer" if I try to pipx run ... as well:

$ pipx run howdoi -ac check file exists bash --explain -C
INFO: Version: 2.0.19
Cache cleared successfully
...
ERROR: Sorry, couldn't find any help with that topic%

so I created a conda environment, pip installed howdoi (which returns an answer as expected) and diffed what was installed:

$ diff =(pipx runpip howdoi list) =(pip list)
5c5
> certifi            2020.6.20
---
< certifi            2021.10.8
7c7
> charset-normalizer 2.0.9
---
< charset-normalizer 2.0.8
23c23
> setuptools         58.0.4
---
< setuptools         59.4.0

Then I littered some print(f"{SOME_VARIABLE=}") around the code until I found where the behavior diverged between both environments- which turns out to be in _get_answer()

    print(f"{page=}")
    html = pq(page)
    print(f'{html=}')

    first_answer = html('.answercell').eq(0) or html('.answer').eq(0)
    print(f'{first_answer=}')

The content of page was identical for both; yet, pyquery (which has an identical version number in both environments) is parsing them differently in the pipx environment. > good vs < bad

< html=[<html>]
---
> html=[<html.html__responsive.>]
< first_answer=[]
---
> first_answer=[<div.answercell.post-layout--right>]

So, I created a new vanilla python3-venv (python3 -m venv tmp-venv && source tmp-venv/bin/activate && pip install ...) and pip installed the frozen requirements from both the pipx and the conda environment. These both got no answer. I tried two more virtual environments from python3.9 and python3.10 installed via homebrew. Same deal.

$ /path/to/brew/bin/python3.10 -m venv ./tmp-venv
$ source tmp-venv/bin/activate
$ pip install howdoi
$ howdoi -ac check file exists bash --explain -C
Error...

I tried getting in there with pdb, but the misbehaving code runs in a multiprocessing pool.

justin-f-perez avatar Dec 06 '21 10:12 justin-f-perez

Wow that's wild. Thanks for the in-depth exploration. The hypothesis is that there is something about pipx that is preventing pages from being parsed correctly with pyquery.

I wonder if you could use this solution to get pdb in a multiprocessing thread:

https://stackoverflow.com/a/23654936/305414

gleitz avatar Dec 07 '21 00:12 gleitz

@gleitz thanks for the suggestion! will try when I have time (finals death-march season...)

I thought it was pipx at first too- then I thought it was python3.10 related. Now I suspect the problem is somehow related to homebrew's distribution of python3. That would explain why python3 -m venv style environments, pipx environments, and conda environments that don't specify a python (defaulting to "system python") all fail.

In other words...

< conda env create -n howdoi  # uses first python3 it finds on $PATH
> conda env create -n howdoi python=3.9 # conda installs its own interpreter
conda activate howdoi
pip install howdoi
howdoi -ac check file exists bash --explain -C
< ERROR
> answer
env style python source works?
conda, python=unspecified homebrew
pipx run homebrew
pipx install homebrew
python3.9 -m venv homebrew
python3.10 -m venv homebrew
docker run python:3.9 apt
python3 -m venv (bare metal linux) apt
conda, python=3.9 conda
conda, python=3.10 conda

justin-f-perez avatar Dec 07 '21 02:12 justin-f-perez

Running howdoi reverse a binary tree in typescript gives this result:

class Demo {
    overload(a) {
        console.log('hi');
    }
    overload() {
        console.log('bye');
    }
    overload(a, b) {
        console.log('wow');
    }
}

const d = new Demo();
d.overload();
d.overload(1);
d.overload(1, 2);

Which first, doesn't use TypeScript, and second, doesn't reverse a binary tree. (Atleast it doesn't look like it, I haven't executed the code.)

On the topic of binary trees and TypeScript, running howdoi implement binary tree in typescript gives an incomplete answer:

interface TreeNode<T> {
    left?: TreeNode<T>;
    right?: TreeNode<T>;
    data: T;
}

(thats it) Actually, now that I think about it, it might not be so incomplete.

Running howdoi use for loop in javascript (with the use!) gives this result:

person[name] = 'Tom'

ghost avatar Mar 13 '22 09:03 ghost

howdoi reverse a binary tree in typescript

Turns out this now gives a (more) correct answer, that is also in Typescript. Kudos to the community for ranking answers and linking to them which raises their search ranking.

gleitz avatar Nov 12 '22 17:11 gleitz