Request for Help: Show me queries that don't have a good answer
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!
Started collecting some bad queries and potential solutions at https://docs.google.com/spreadsheets/d/16nzBO6s4S61iScaEgtf6KAoJ5he7f3he5dJ-ElG9ViM/edit?usp=sharing
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.
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):
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
$ 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 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 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.
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 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 | ✅ |
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'
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.