valid/invalid propositional logic

Question: I was looking into the below problem found at this site and that question is whether the given propositional logic is valid or not.

I got few doubts

why the You don't write a paper,however you get an extra credit. sentence has been split into two propositional sentences (2)~Q & (3)P and not ~QΛP ?
There is an explanation given for the solution which I understood. Now, does that explanation can be summed up saying I wasn't able to apply any propositional laws to the sentences to derive the conclusion and hence it is invalid? I mean is that how you generally solve the valid/invalid question? by trying to apply the laws to the sentences and see if it gives you the conclusion?
and if possible can someone explain about converse and inverse error in detail when it comes to prove the validity?
Answer:
why the You don't write a paper,however you get an extra credit. sentence has been split into two propositional sentences (2)~Q & (3)P and not ~QΛP ?

Because assuming $ A \land B $ is equivalent to assuming $ A $ and assuming $ B $, it's in almost any set of rules of inferences, hard to imagine that rule of inference not being present.  The author just didn't make this step explicit because it's not important.

There is an explanation given for the solution which I understood. Now, does that explanation can be summed up saying I wasn't able to apply any propositional laws to the sentences to derive the conclusion and hence it is invalid? I mean is that how you generally solve the valid/invalid question? by trying to apply the laws to the sentences and see if it gives you the conclusion?

The validity of a proof and the validity of it's conclusion are 2 different things.  The validity of a proof depends on every step being correct; the final statement being true is not sufficient for a proof to be correct.
A conclusion is invalid if it's negation is consistent with your assumptions.  In the above example, the negation of the conclusion is that you didn't solve the test questions.  Does that contract any assumptions?  No, you could have gotten extra credit for being the teacher's special friend.  No one said that the only way to get extra credit was the 2 possibilities listed.

and if possible can someone explain about converse and inverse error in detail when it comes to prove the validity?

Modus ponens is the statement that, if you assume $A \implies B$ and $A$, then you can conclude $B$.
The above proof starts with the following 3 assumptions.
(1) $(Q \land R) \implies P$
(2) $\lnot Q$
(3) $P$
The proof then tries to apply modus ponens to (1) and (3).  However that would only work if (1) was $(Q \land R) \leftarrow P$.  Since (1) isn't a reverse implication, the application of modus ponens is incorrect.
This is a common error to make in English.  If you said "You will get extra credit if you write a paper or if you solve the test questions", how many students do you think would assume that those are the only way? If your mother said "if you don't eat your vegetables, then you can't have dinner", wouldn't you assume that you can have dinner if you eat your vegetables?  This is logically incorrect, and it's the error the author is trying to present.
Comment: Thanks for the answer. So, basically I negate the conclusion and see if the assumptions still hold? If they do, it is invalid.
Comment: @rps Negate the conclusion and see if it contradicts the assumptions.  Or as the other poster said, see if it is "possible" for the conclusion to be false when the assumptions are true.
Comment: Also I dont understand, why its not $(R\rightarrow P)\vee(Q\to P)$, what difference it will make from $(R\vee Q)\to P$. It will be "You will get extra credit if you solve test problem or you will get extra credit, if you write a paper." But isnt it the same? Can you please clarify? I understand by truth table [$(R\rightarrow P)\vee(Q\to P)$](http://goo.gl/xxLMTJ) and [$(R\vee Q)\to P$](http://goo.gl/9dFe2u) are different, but I dont understand why when considering verbal interpretation, they dont feel different.
Comment: $(R \lor Q) \implies P$ is the same as $(R \implies P) \land (Q \implies P)$.  In common english that is : "If it is raining or if it cold then I will wear a coat" is the same as "If it is raining then I will wear a coat, and if it is cold then I will wear a coat."
Answer: "why the You don't write a paper,however you get an extra credit. sentence has been split into two propositional sentences (2)~Q & (3)P and not ~QΛP ?"
I don't know the author's motivation, but it doesn't really affect the problem.
"There is an explanation given for the solution which I understood. Now, does that explanation can be summed up saying I wasn't able to apply any propositional laws to the sentences to derive the conclusion and hence it is invalid?"
Not really.  You could have an incomplete set of laws and not come as able to derive the conclusion.  Also, you might not know how to apply the laws to derive the conclusion.  For example, I'm currently working on a propositional calculus proof which will have over 300 lines.  If taken as an argument like this one (which it can in some sense), plenty of people might not know how to apply the laws to get to the conclusion.  However, the argument still holds as valid.
"I mean is that how you generally solve the valid/invalid question?"
In general you show an argument invalid by showing that all the premises can come as true, but the conclusion can also come as false.  To show an argument valid you either produce a formal proof, or you make a sufficiently rigorous argument such that we can know that a formal proof could get written.
"by trying to apply the laws to the sentences and see if it gives you the conclusion?"
That often works, because people find such arguments sufficiently rigorous such that they know (or at least believe they know) that a formal proof could get written.
"and if possible can someone explain about converse and inverse error in detail when it comes to prove the validity?"
The converse error referenced refers to the fact that from the consequent of a conditional as true, as well as the conditional holding as true, you can't conclude the antecedent of the conditional true also.  That is,
(p $\rightarrow$ q)
q

p
is not a valid argument, where the parts above the line indicate the premises of the argument, and the part below the line indicates the conclusion of the argument.   Suppose p false, and q true.  Then (p $\rightarrow$ q) holds as true also.  So, all the premises hold as true, but the conclusion can qualify as false.
The inverse error has the following form:
(p $\rightarrow$ q)
$\lnot$p

$\lnot$q
First off, I'll remark that if $\rightarrow$ was the biconditional in the first premise instead, this would NOT qualify as an error.  But, given that it comes as the material conditional or implication as defined by the referenced site, then suppose q true, and p false.  Both premises consequently qualify as true, but the conclusion does not, and consequently the argument ends up invalid.
Comment: Thank you. The converse and inverse error explanation is splendid.

valid/invalid propositional logic


Trying to prove that a function converges at a point $x_0$ iff for every sequence $(a_n)_{n=0}^{\infty}$ with $a_n \to x_0$ also $f(a_n) \to L$

Question: I am trying to prove this theorem from Analysis I by Tao.

Proposition 9.3.9.  Let $X$ be a subset of $\mathbb{R}$, let $f : X → R$  be a function, let $E$ be a subset of $X$, let $x_0$ be an adherent point of $E$, and let $L$ be a real number. Then the following two statements are logically equivalent:
(a) $f$ converges to $L$ at $x_0$ in $E$. (i.e $\forall \varepsilon > 0 \exists \delta > 0 s.t \forall x \in E $ and $|x_{0}-x|\leq \delta , |f(x)-L|\leq \varepsilon$)
(b) For every sequence $(a_{n})_{n=0}^{\infty}$ which consists entirely of elements of $E$ and converges to $x_0$, the sequence $(f(a_{n}))_{n=0}^{\infty}$ converges to $L$.

I have (I think) been able to assume (a) and show that (b) follows. Let $(a_n)_{n=0}^{\infty}$ be a sequence converging to $L$.
Let $\varepsilon > 0$, and then I want to find an $N \in \mathbb{N}$ such that for every $n \geq N$
$$
|f(a_n) - L| < \varepsilon.
$$
From the assumption in part (a) there must exist $\delta >0$ such that
$$
|a_n - x_0| < \delta \implies |f(a_n) - L| < \varepsilon
$$
so if I  can find $N \geq 1$ such that for all $n \geq N$ it is the case that $|a_n - x_0| < \delta$ then this direction is proven. By the fact that $a_n$ converges to $L$ for all $\varepsilon > 0$ (and thus also $\varepsilon = \delta$) this $N$ exists.
I am stuck on proving the other direction, assume (b) and attempt to prove (a).
Let $\varepsilon > 0$, and $\delta > 0$ (to be restricted later) and then $x \in E$ such that $|x - x_0| < \delta$.
Then I thought that I could use the fact that $x_0$ is an adherance point of $E$ to construct a sequence $(a_n)_{n=0}^{\infty}$. A very naïve guess is that because for every $\varepsilon > 0$ there exists a $y \in E$ such that $|y - x_0| < \varepsilon$, I could define the sequence $(a_n)_{n=0}^{\infty}$ such that $a_0$ is just the $x$ in question. Then let $a_1$ be such that $|a_1 - x_0| < \frac{\delta}{2}$, $a_2$ such that $|a_2 - x_0| < \frac{\delta}{3}$ and so on. Clearly this sequence converges to $x_0$, and therefore $(f(a_n))_{n=0}^{\infty}$ converges to $L$, by the assumption of (a).
However, in trying to exploit the fact that $(f(a_n))_{n=0}^{\infty}$ converges to $0$, I got a bit stuck because there are no guarantees that for a given $\varepsilon$, $f(a_0)$ is $\varepsilon$-close to zero (as the sequence must just be eventually $\varepsilon$-close).
I tried to think about what kind of sequence would be ideal - one which contains all the points in $E$ such that $|x - x_0| < \delta$ and converges to $L$, ideally (but I don't think that's possible as $E$ is not necessarily countable).
Sadly I'm kind of stuck here. Any hints/direction would be much appreciated. I think this should not be a very difficult proof and that I'm going about it the wrong way.
I thought maybe I should try to prove by contrapositive (but I have also seen advice not to do this as it is much easier to mistakes this way).
Comment: This looks like a duplicate question, e.g. https://math.stackexchange.com/q/4226198/ and https://math.stackexchange.com/q/1992204/.
Answer: (b) implies (a) is usually proved by contrapositive.
If (a) does not hold, then there exists some $\varepsilon>0$ such that for every $\delta>0$ there exists some $x\in E$ for which $|x-x_0|<\delta$ but
$|f(x)-L)|\geq\varepsilon$. In particular, for every $n$ there exists some $x_n\in E$ such that $|x_n-x_0|<\frac{1}{n}$ but $|f(x_n)-L|\geq\varepsilon$. Therefore there exists a sequence $x_n\in E$ such that $x_n\to x_0$ as $n\to\infty$ but $f(x_n)$ does not converge to $L$.


Como excluir elementos dois array numpy relacionados?

Question: Meu x e meu y pra plotar são:
x0_n125n25matriz= [ 3472.222  3501.157  3530.092  3559.028  3587.963  3616.898  3645.833
  3674.768  3732.639  3761.574  3819.444  3848.379  3877.315  3906.25
  3935.185  3964.12   3993.055  4021.991  4050.926  4079.861  4108.796
  4137.731  4166.667  4195.602  4224.537  4253.472  1938.657  1967.593
  1996.528  2025.463  2054.398  2083.333  2112.268  2141.204  2170.139
  2199.074  2228.009  2459.491  2488.426  2517.361  2546.296  2575.231
  2604.167  2633.102  2662.037  2690.972  2719.907  2777.778  2806.713
  2835.648  2864.583  2893.518  2922.454  2951.389  2980.324  3009.259
  3038.194  3067.13   3125.     3153.935  3182.87   3211.805  3240.741
  3269.676  3298.611  3327.546  3356.481  3385.417  3414.352  3443.287]

y15_n0matriz= [-0.16542411 -0.16646451 -0.15804609 -0.16922809 -0.16509723 -0.17315663
 -1.         -0.16794772 -0.18579247 -0.1910353  -1.         -0.17504794
 -0.17359474 -0.1910353  -0.23110434 -0.21745199 -0.20903377 -0.20411454
 -0.14195609 -0.12418465 -0.02185758 -0.06863125 -0.05559483 -1.
 -0.00618082  0.31784786 -0.03661292 -0.0307183  -0.05644441 -0.08442226
 -0.06980404 -0.10472111 -0.0879587  -0.12047211 -0.1447231  -0.13637791
 -0.17421431 -0.2750271  -0.28981587 -0.29746496 -0.29663548 -0.29411292
 -0.26879031 -1.         -1.         -1.         -1.         -0.26504059
 -0.25901137 -1.         -1.         -1.         -1.         -1.
 -0.23680369 -0.22844707 -0.22335351 -0.21784316 -0.18085159 -0.16489683
 -0.16492188 -0.16724017 -0.16639032 -0.16230818 -0.16707027 -0.16008367
 -0.15638411 -0.17402684 -0.19244248 -0.18580143]

Do y, eu preciso excluir esses -1 da matriz e excluir tbm na matriz x os valores correspondentes à esse índice do -1 em y, pra não dar erro de dimensão pra plotar . Fiz assim:
x0_n125n25valores=[]
for i in x0_n125n25:
    if i!=0:
        x0_n125n25valores.append(i)

x0_n125n25matriz=np.asarray(x0_n125n25valores)
print(x0_n125n25matriz)
print(x0_n125n25matriz.shape)

y15_n0valores = []
for i in y15_n0:
    if i>=-1 and i<1:
        y15_n0valores.append(i)

y15_n0matriz=np.asarray(y15_n0valores)

y15_n0matrizteste=[]                       ############### ERRO NESSA PARTE
for i in range(0,len(y15_n0matriz)):
    if y15_n0matriz[i]>-1.00000000e+00:
        y15_n0matrizteste.append(y15_n0matriz[i])
    if y15_n0matriz[i]==-1.00000000e+00:
        x0_n125n25matriznovo= np.delete(x0_n125n25matriz,i)
y15_n0matriznovo2 = np.asarray(y15_n0matrizteste)
print(y15_n0matriznovo2)
print(y15_n0matriznovo2.shape)

No print vi que excluí os -1 corretamente da matriz y mas não excluiu os valores correspondentes em x. Alguém tem alguma ideia do pq? Tentei de outro jeito mas tbm não deu:
for i in range(0,len(y15_n0matriz)):
    if y15_n0matriz[i]==-1.00000000e+00:
        y15_n0matriznovo = np.delete(y15_n0matriz,i)
        x0_n125n25matriznovo= np.delete(x0_n125n25matriz,i)

Desse jeito aí não excluiu ponto nenhum. Não sei pq, help!
Answer: Antes de mais nada: "arrays" de numpy são diferentes de "listas" de Python - não dá para alterar o tamanho delas de forma simples: não funciona del array[i] para apagar o elemento de índice "i" de uma array. Como listas são parte da linguagem, e é importante entender o algoritmo pra isso, em vez de só a "mágica" do numpy, abordo esse modo primeiro.
Uma boa ideia em programação é que coisas simples sejam simples - então - mesmo que você precise em algum momento usar esses nomes de variáveis complicados, fica ruim de ficar colocando em "if" e "for" o nome "x0_n125n25valores".
Felizmente, o conceito de funções em programação ajuda justamente com isso - dentro de uma função usamos nomes genéricos - daí você chama a função com suas variáveis de nome complicado. (eu também sugeriria não usar nomes complicados pra começar -se precisa marcar as séries de dados com "n12n25" pra saber que é isso mesmo, vale a pena colocar tudo dentro de um dicionário - mas só se ficar mais fácil pra quem for usar o código ler).
VOltando ao problema principal:
quero percorrer duas sequências, e onde houver um "-1" na segunda sequência, apagar o elemento de lá, e o elemento correspondente na sequencia principal.
Em Python, o for sempre percorre os elementos de uma sequência - e podemos usar a chamada enumerate, para além do elemento, termos também o índice. ALém disso, em qualquer linguagem, se você for alterar o comprimento de uma array enquanto está iterando sobre ela, vai ter problemas - então um pattern interessante é fazer uma iteração anotando os índices dos elementos a apagar,e uma segunda interação apagando aqueles índices:

def remove_elementos(referencia, espelho, valor=-1):
    remover = []
    for indice, elemento in enumerate(referencia):
        if elemento == valor:
            remover.append(indice)
    for indice in reversed(remover):
        del referencia[indice]
        del espelho[indice]

    return referencia, espelho

E aí , é só chamar essas funções com suas listas contendo dados - elas serão alteradas inplace, e você nem precisa se preocupar em atribuir o valor de retorno.
Depois que você tenha entendido esse algoritmo, aí sim podemos passar a:
Filtrar usando o numpy
Já com o numpy, temos acesso a várias ferramentas que não fazem parte do "núcleo" do Python - principalemnte a capacidade de aplicar operações a cada item de um array, baseado no conteúdo de outro array, ou um escalar.
Por exemplo, para filtrar eleentos de um array, podemos passar uma outra sequencia como índice de um array (em vez de passar um índice numérico) - se a sequência passada tiver valores "True" e "False", apenas os elementos que correspondem a "True" são retornados - é importante visualizar isso:
In [78]: a = np.array([0,1,2,3,4,5])

In [79]: a
Out[79]: array([0, 1, 2, 3, 4, 5])

In [80]: b = [True, False, True, True, True, True]

In [81]: a[b]
Out[81]: array([0, 2, 3, 4, 5])

Observe como a saída de a[b] excluiu o elemento na posição "1" - que é onde estava o "False" na minha sequência b (b no caso é uma lista -tanto listas quanto arrays do numpy são "sequências" e funcionam).
Daí juntamos isso com a capacidade do numpy de, ao fazer qualquer operação de uma array com um escalar, ele gera um outro array com o resultado da operação. E que a "operação" no caso, pode ser uma comparação (==):
In [83]: x = np.array([0, 1, 2, 3, 4, 5])

In [84]: y = np.array([0, 1, -1, 3, 4, -1])

In [85]: filtro = y == -1

In [86]: filtro
Out[86]: array([False, False,  True, False, False,  True])

In [87]: filtro = y != -1

In [88]: filtro
Out[88]: array([ True,  True, False,  True,  True, False])

Pronto - sabendo essas duas coisas, você consegue filtrar os elementos dos seus dados originais. Só lembrar que a operaçao de filtro (o penúltimo exemplo, acima), gera um novo array, não é feito "inplace" - e guardar o resultado disso na variável de volta:

filtro = y15_n0matriz != -1
y15_n0matriz = y15_n0matriz[filtro]
x0_n125n25matriz = x0_n125n25matriz[filtro]

Pronto!


for loop php shows "Array"

Question: so i want my php shows list of my database with for loop, when i use it happens like this:

here its my coding for it, i know its not good and vulnerable but i just want to know hor loop works in php
<?php
    include "db.php";

    $id_pemesanan = 'DDN E/40202003201907323';
    $Barang = $_POST['Barang'];
    $Jumlah = $_POST['Jumlah'];

    $queryResult = $connect->query("SELECT Barang FROM Odr_Msk_Detail WHERE id_pemesanan = '".$id_pemesanan."'");

    $result=array();

    while($fetchData=$queryResult->fetch_assoc()){
        $result[]=$fetchData;
    }
    $jumlah = count($result);

    for ($x = 0;$x <= $jumlah;$x++){
        echo $result[$x];
        echo "
";
    }
?>

Comment: `echo $result[$x];` => `echo $result[$x]['Barang'];` -- you need to access the column, not just the row.
Comment: Alternatively, you can replace `$result[]=$fetchData;` with `$result[]=$fetchData['Barang'];` and keep your loop as-is. I would use the first approach in my comment above.
Answer: You will receive that, because you try to echo an array and not a string.
To output everything you could do following, because it is not neccessary to fetch all results and keep them into memory.
while($fetchData = $queryResult->fetch_assoc())
{
    echo join('
', $fetchData);
}

for loop php shows "Array"


ASP.NET reading data from DB

Question: new problem out there. While reading data from database and when it runs out of records, it simply says "Invalid attempt to read when no data is present", so the question is how to prevent that?
Here's my code:
{
    Label3.Text = Request.QueryString["Username"];

}

SqlConnection con = new SqlConnection("Data Source=JEVGENIJ-PC;Initial Catalog=ViaFitness;Integrated Security=True");
static SqlDataReader dr;
SqlCommand cmd;

protected void Button1_Click(object sender, EventArgs e)
{

    con.Open();

    SqlCommand cmd = new SqlCommand("select * from Summary where UserName='"+Label3.Text+ "'", con);

    dr = cmd.ExecuteReader();
    dr.Read();
    Label3.Text = dr[2].ToString();
    Label1.Text = dr[1].ToString();
    Label2.Text = dr[0].ToString();

}
 protected void Button2_Click(object sender, EventArgs e)
{
    dr.Read();
    Label3.Text = dr[2].ToString();
    Label1.Text = dr[1].ToString();
    Label2.Text = dr[0].ToString();
    con.Close();
}

}
Answer: call dr.read before every fetch.  check if it is true , which means data is present
MSDN SqlDataReader.Read Method - Advances the SqlDataReader to the next record.
SqlDataReader reader = command.ExecuteReader();

// Call Read before accessing data.
while (reader.Read())
{
        ReadSingleRow((IDataRecord)reader);
}

// Call Close when done reading.
reader.Close();

Answer: You should make sure you have data in your reader:
protected void Button1_Click(object sender, EventArgs e)
{

    con.Open();

    SqlCommand cmd = new SqlCommand("select * from Summary where UserName='"+Label3.Text+ "'", con);

    dr = cmd.ExecuteReader();
    if (dr.Read())
    {
        Label3.Text = dr[2].ToString();
        Label1.Text = dr[1].ToString();
        Label2.Text = dr[0].ToString();
    }

}
 protected void Button2_Click(object sender, EventArgs e)
{
    if (dr.Read())
    {
        Label3.Text = dr[2].ToString();
        Label1.Text = dr[1].ToString();
        Label2.Text = dr[0].ToString();
    }
    con.Close();
}

Check out the MSDN-page for more info: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx
Answer: Datareader Read() method returns bool value. If it returns true, it succsesfully read next record, if it returns false - it is not read record because there is no more.
So you should test result of Read method and then try to access to its values.
Answer: Read() jumps to the next record. Is there nothing you cant' acces this. Try this for only one record
If(dr.Read()) {
    Label3.Text = dr[2].ToString();
    Label1.Text = dr[1].ToString();
    Label2.Text = dr[0].ToString();
}

or this for all
While(dr.Read())) {
    ' do something
}

ASP.NET reading data from DB


On a simple combination between Thābit ibn Qurra theorem and Wilson-Lagrange

Question: I believe that this first claim will be well known in the literature about amicable numbers because it is easy to deduce
Claim 1. The primes $p,q$ and $r$ in Thābit ibn Qurra theorem satisfy that have the form, respectively, $p$, $2p+1$ and $2p^2+4p+1$.
There are simple consequences of this Claim 1 (for example one can write each of one of the amicable numbers (see the form in previous Wikipedia article, same section) $N:=2^npq$ and $M:=2^n r$ in a amicable pair in terms only of $p$ and $2^n$, or state a closed-form also in terms of $p$ and $n$ for the difference $M-N$) and I tried combine previous claim with Wilson-Lagrange theorem to show the following
Claim 2. Let $p$ the prime in Thābit ibn Qurra theorem, then Wilson-Lagrange theorem implies that there exist postive integers $c,c'$ and $c''$ satisfying
$$c'(2p+1)-1=2p(2p-1)(2p-2)\cdots(p+1)p(cp-1)$$
$$\quad\quad\quad c''(2p^2+4p+1)-1=(2p^2+4p)(2p^2+4p-1)\cdots(2p+1)(c'(2p+1)-1)$$

Question. I would like to know if my claims were rights, especially (only is required a proof of) Claim 2. As remark, to deduce Claim 2, I've combined with Claim 1 and three applications of Wilson-Lagrange theorem. Then, can you provide me your calculations to do a comparison with mine? Many thanks.
Comment: If in comments you want criticize my approach (the form of the primes in the algorithm+Wilson-Lagrange theorem), improve it or state new claims as a companion of your answer feel free to do it.
Answer: The claims are right and easy to check ...
Claim 1
$$p = 3\cdot2^{n − 1} − 1\\
q = 3\cdot2^n − 1=2\cdot(3\cdot2^{n-1}-1)+1=2\cdot p+1\\
r = 9\cdot2^{2n − 1} − 1=2\cdot9\cdot2^{2n − 2} − 1=2\cdot (3\cdot2^{n-1})^2-1=2\cdot (p+1)^2-1$$
Claim 2 from Wilson's theorem
$$(p-1)!\equiv -1 \pmod{p} \Leftrightarrow \color{#C00}{(p-1)!=c\cdot p-1} \\
(2p)!\equiv -1 \pmod{2p+1}  \Leftrightarrow \color{#C0C}{(2p)!=c'\cdot(2p+1)-1}\\
(2p^2+4p)!\equiv -1 \pmod{2p^2+4p+1}$$
or
$$(2p)(2p-1)...(p+1)p\color{#C00}{(p-1)!}\equiv -1 \pmod{2p+1}\\
(2p^2+4p)(2p^2+4p-1)...(2p+2)(2p+1)\color{#C0C}{(2p)!}\equiv -1 \pmod{2p^2+4p+1}$$
or
$$(2p)...p\color{#C00}{(c\cdot p-1)}\equiv -1 \pmod{2p+1}\\
(2p^2+4p)...(2p+1)\color{#C0C}{(c'\cdot(2p+1)-1)}\equiv -1 \pmod{2p^2+4p+1}
$$
Comment: Many thanks then perfect. Your calculations seems much more clean and understandable than mine. Many thanks also for your effort to do your proof  nice.


Non-monomial ideal with monomial radical

Question: I'm given the ideal $I = \langle x+y,x^2y^2 \rangle$ as an example of an ideal whose radical $\sqrt{I}  = \langle x,y \rangle$ is monomial even $I $ is not monomial itself.
I'm trying to fill in the details of this example.

How can I prove that $I$ is not monomial?
How can I prove that $\sqrt{I}  = \langle x,y \rangle$?
Comment: 1) If $I$ is monomial then $x+y\in I\implies x,y\in I$; 2) The radical of an ideal is the intersection of its minimal prime ideals. If $I\subseteq P$ then $(x,y)\subseteq P$, hence $P=(x,y)$.
Answer: 1: You need to prove $x\notin I$.
2: you need both $x+y$, $x^2y^2\in\left<x,y\right>$ (easy) and also
$x^n\in I$ and $y^n\in I$ for some $n$.
Answer: There are a few important things that weren't stated in the helpful answers.
The key to solve this exercise is to find a minimal Groebner basis of the ideal with the help of Buchberger algorithm. Then, we know that the membership problem into an ideal can be solved by dividing the polynomial by the Groebner basis.
The minimal Groebner basis I computed was $\{x+y,y^4\}$. From here it is easy to see that $x \notin I$  (as @LordSharktheUnknown pointed out in his answer). But in fact, if the ideal was monomial then $x,y \in I$ should be in the ideal as @user26857 pointed out. This can be reasoned from a minimal basis formed by monomials (one writes $x+y = \sum c_k x^{(a_k,b_k)}$ and deduces that the right hand side should only contain $x,y$ as summands because minimality forbids any summand to be expressed in term of the rest of the sum).
Finally, one can check what power of $x,y$ is in the ideal (as @LordSharktheUnkown pointed out, but with the help of Groebner basis). In my case is $x^4,y^4 \in I$. I think that this could help to solve others questions such as this one.
For the computations I used sage, in particular function sage.rings.polynomial.toy_buchberger.spol(f, g) for knowing what I was doing.
Comment: "*For the radical, i didn't quite see the method you proposed*": $x^2y^2\in P\implies x^2\in P\text{ or }y^2\in P\implies x\in P\text{ or }y\in P$. Since $x+y\in P$ in both cases you get $x,y\in P$.
Comment: If $x\in(x+y,x^2y^2)$ then $x=(x+y)f+x^2y^2g$. For $y=-x$ we get $x=x^4g(x,-x)$, a contradiction.
Comment: Both suggestions you got were non-computational. If you decided to use a computer package then do it for all you asked, in particular for computing the radical.
Comment: @user26857 ok! that makes your point clear. thank you!


Why is it called a Perfect Fifth?

Question: What is the origin of the term perfect fifth and how does it relate to the length of a string and, specifically, the length of a guitar string.
I crudely measured my guitar string and found that the "perfect fifth" fret is about 1/4th the length of the entire string.  At 1/2 length we hear from the octave up (fret 12).
Thanks
Comment: or http://music.stackexchange.com/questions/28870/what-is-a-perfect-fifth
Comment: what and why are two different questions. For example, I understand what it is, but I don't understand why it's called this - where do - or did fifths come into the picture? Of course, it's a 5th note from another... As such, the accepted answer is wrong.
Answer: Perfect fifths is a frequency ration of 1.5 (2:3), as compared the temperate 5th which is a frequency ration of 2^(7/12) = 1.4983. (Two to the power of 7 12th).
The perfect fifth happens exactly at one third of a string length. All harmonics of the string are related to integer fractions of the string length, which is the same as integer multiples of the fundamental frequency (open string). Temperate tuning splits the octave in 12 equal parts.
This is related to the difference of temperate tuning and harmonic tuning
Comment: This does not answer the question of "why is it called that"
Comment: Note: "tempered", not "temperate".
Comment: 5th refers to the 5th note (tone) from another. (More accurately, 7 semi-tones). So each note has a different 5th. There are also diminished 5ths. See http://music.stackexchange.com/questions/28870/what-is-a-perfect-fifth

Why is it called a Perfect Fifth?


Enemies aren't moving in my tower defense game in Unity 3D C#

Question: I have recently started using Unity and decided to follow Brackey's Tower Defense Game tutorials on Youtube. After following part 2, (https://www.youtube.com/watch?v=aFxucZQ_5E4&list=PLPV2KyIb3jR4u5jX8za5iU1cqnQPmbzG0&index=2) the enemy does not move. The strange thing is that there are no errors that show in the Unity console. I only have 2 scripts, which are shown below.
Waypoints script:
using UnityEngine;

public class Waypoints : MonoBehaviour {

   public static Transform[] points;

   void Awake ()
   {
        points = new Transform[transform.childCount];
            for (int i = 0; i < points.Length; i++)
        {
            points[i] = transform.GetChild(i);
        }
   }

}

Enemy script:
using UnityEngine;

public class Enemy : MonoBehaviour {

    public float speed = 10f;

    private Transform target;
    private int wavepointindex = 0;

    void Start ()
    {
            target = Waypoints.points[0];
    }

    void update ()
    {
        Vector3 dir = target.position - transform.position;
        transform.Translate(dir.normalized * speed * Time.deltaTime, Space.World);

        if (Vector3.Distance(transform.position, target.position) <= 0.4f)
        {
            GetNextWaypoint();
        }
    }

    void GetNextWaypoint()
    {
        if (wavepointindex >= Waypoints.points.Length - 1)
        {
            Destroy(gameObject);
            return;
        }
        wavepointindex++;
        target = Waypoints.points[wavepointindex];
    }

}

I have made sure that the Waypoints script is only in the parent called 'Waypoints' which contains all of the Waypoints.
My Enemy script is added to the enemy in my scene.
I have checked with the Youtube tutorial multiple times to make sure the code is the same.
The Waypoints script is running before the Enemy script. I have made sure of this by going to Edit > Project Settings > Script Execution Order.
The enemy just stays still. Nothing seems to work, please help me. Thanks.
Answer: I think this is because your update() function is lowercase.
Try write it like this:
void Update(){
}


How to generate the public key from Polkadot Address from Substrate Side

Question: I'm generating a Public key from PolkadotJS as follows
    const keyring = new Keyring({ type: "sr25519" });
    const account = keyring.addFromUri("//Bob", { name: "Bob default" });

    // encoded public key
    let public_key = keyring.encodeAddress(account.publicKey, 42);
    console.log(public_key);

I am adding the type of public_key as "public_key": "Vec<u8>",
I am reading the public key from Substrate Node as follows
// pk_raw is a Vec<u8> array
let pk =  str::from_utf8(pk_raw.as_ref()).unwrap()
// the above returns `5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty`

I need to generate the public key from this value. I tried with the followings
ed25519::Public::try_from(&*pk_raw).unwrap();
// above throws error since the data length is not equals to 32

fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
        if data.len() == 32 {
            let mut inner = [0u8; 32];
            inner.copy_from_slice(data);
            Ok(Public(inner))
        } else {
            Err(())
        }
    }

Is there a way to generate the public key using 5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty from Substrate Rust Side?
Answer: You can use something like this:
use sp_core::crypto::Ss58Codec;

ed25519::Public::from_ss58check("5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty").expect("Valid address")

Comment: Have you imported the trait?

https://github.com/paritytech/substrate/blob/master/primitives/core/src/ed25519.rs#L150-L157 here it is called as well.
Comment: This throws the following error let e = ed25519::Public::from_ss58check("5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty").
      |                                          ^^^^^^^^^^^^^^ function or associated item not found in
 sp_core::ed25519::Public It cannot find `from_ss58check`


Is there any working Cordova Push Notification?

Question: Is there any working Cordova Push Notification plugin?
This one has been disabled:
https://github.com/phonegap/phonegap-plugin-push

Thank you
Trying this now:
https://github.com/fechanique/cordova-plugin-fcm

Answer: Trying this now :
https://github.com/fechanique/cordova-plugin-fcm

Hope it works :)
Comment: Okay so did it work?
Comment: i'm getting "FCMPlugin is not defined" error.
I'm going to try @Muhammad Faizan Uddin solution using cordovaPushV5
Comment: @GauravOjha the plugin works :)
Comment: Thank you! I'm going to try it in my project as well!
Answer: If you don't mind a paid solution - Pushwoosh should also help.
There is a free version too for unlimited push notifications. This could be integrated with cordova, if you want
Link: https://www.pushwoosh.com/
Documentation for integration: http://docs.pushwoosh.com/docs/cordova-phonegap
Comment: thanks @HawkEye, i'll consider it. :)
Answer: Maybe you can try this one, an old one but it simply works: https://github.com/appfeel/cordova-push-notifications


Flutter send signature image to GCP bucket but file is not usable

Question: I am trying to send a signature from flutter to a GCP Storage bucket.
Currently, I can send a file to the bucket but it's not openable.
Here is what I am using to get base64 format which I supposed is the intended format to send files.
final data = await _signaturePadKey.currentState!
    .toImage(pixelRatio: 3.0);
final image = await data.toByteData(
    format: ui.ImageByteFormat.png);
// To send
final base64String =
    base64.encode(image!.buffer.asUint8List());

setState(() => {_signatureFile = base64String});

Then I am sending my request as :
Future postOKTrackingSignature(String signature, String projectID) async {
  await refreshSTSToken(projectID);
  String token = await getSTSToken();

  // Headers

  var headersData = {
    "Authorization": "Bearer $token",
    "Content-Type": "image/png"
  };

  // URL building

  var resourcePart =
      "XXX";

  var paramsData = {
    'uploadType': 'multipart',
    'name': "${resourcePart}signature.png",
  };

  var baseURI = 'https://storage.googleapis.com/upload/storage/v1/b/';
  String bucketName = "XXX";
  var query = paramsData.entries.map((p) => '${p.key}=${p.value}').join('&');

  // Body

  var bodyData = signature;

  final response = await http.post(
      Uri.parse("$baseURI$bucketName/o?$resourcePart$query"),
      headers: headersData,
      body: bodyData);

  switch (response.statusCode) {
    case 200:
      print("$baseURI$bucketName/o?$resourcePart$query");
      return {"statusCode": response.statusCode};
    default:
      print("$baseURI$bucketName/o?$resourcePart$query");
      return {"statusCode": response.statusCode, "error": response.body};
  }
}

Sadly, I the file got upload but is not usable when I want to get preview, or even download it and try to open it. But while I change the extension to .txt, take the string to : https://base64.guru/converter/decode/file it show me my image a png.
I also tried this :
  var dataPrepation = base64.normalize(signature);
  var bodyData = "data:image/png;base64,$dataPrepation";

String example :
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

Answer: Consider Firebase Storage instead of base64; this stackoverflow topic compares the two and outlines the benefits of each.
In light of this, I strongly advise you to continue working on your project utilizing Firebase Storage.
Now, to Upload a file to Cloud Storage, you first create a reference to the full path of the file, including the file name.
// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

// Create a reference to "mountains.jpg"
final mountainsRef = storageRef.child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
final mountainImagesRef = storageRef.child("images/mountains.jpg");

// While the file names are the same, the references point to different files
assert(mountainsRef.name == mountainImagesRef.name);
assert(mountainsRef.fullPath != mountainImagesRef.fullPath);

Additionally, I would suggest you review the guide for Firebase Cloud Storage in Flutter written by Dane Mackier.
Comment: Hi @Weac, about your two questions in your comments, as far as I can see in the documentation shared and in the guide, you are correct in both scenarios; but if you have any issue with that, share once again the problem and we will help you.

Also, it is good to know that you already found the solution for your question. Please let me know if my answer posted was helpful.

As a suggestion, please share the solution as an answer, so it could help the community that faces a similar situation.
Comment: Hi, thank you for the advice, the solution already exist and I have to plug into it.
I thought I should have used this : https://cloud.google.com/storage/docs/json_api/v1 and havn't got the idea of firebase SDK. If i'm right I can use it to store in google bucket?
Comment: In my case : https://firebase.google.com/docs/storage/flutter/upload-files#upload_files
It would  be uplaod from a String, it could be ok ?


How to add GET-paramter causing Varnish serving uncached page

Question: I want to add a paramter to some URL that allows me to server a page uncache. So something like https://example.org/foo/baa?uncached should be server by the application servers where as https://example.org/foo/baa might be servered by directly from varnish's cache.
To do so I tried to add
if (req.url ~ "^/\?uncached") {
    set req.http.X-VC-Cacheable = "NO:On user request";
    return(pass);
}

to my vcl_recv. But somehow this did not work (caching behavior is not toggled). Is this the right approach? What did I wrong?
Answer: I think it should be:
if (req.url ~ "\?uncached") {
    set req.http.X-VC-Cacheable = "NO:On user request";
    return(pass);
}

Answer: The issue in my case was faulty RegEx:
if (req.url ~ "^/\?uncached") {

Is only working for URL without any local part. Whereas:
if (req.url ~ "\?uncached") {
    set req.http.X-VC-Cacheable = "NO:On user request";
    return(pass);
}

workds for every URL where uncached is the first parameter.


Angular HTTP subscribe não retorna response

Question: Eu criei um service para bater em minha API e retornar todos os pedidos de acordo com certo tipo params.
Quando eu tento atribuir o retorno ao meu component, ele não me retorna uma array de resultados, me retorna um subscriber.
Service
 baseUrl = 'http://localhost:3001';
 constructor(private http: HttpClient) { }
 getPedidos = (tipo: Pedidos): Observable<any> => this.http.get(`${baseUrl}/pedidos?tipo=${tipo}`);

Component ts
ngOnInit() {
    this.pratosPrincipais = this.getPedidos(1);
  }

  private getPedidos = (tipo) =>
  this.pedidoService.getPedidos(tipo)
  .subscribe(pedido => pedido)

Ao atribuir a variável, é esse o valor atribuído:

Logo após isso, eu passo o valor via Input para outro componente.
<app-expansion-panel title="Prato Principal" [data]=pratosPrincipais></app-expansion-panel>

Componente expansion panel ts
@Input() data;

tentei dar subscribe em data, mas apresenta erro que não é uma função.
Testei a api e esta funcionando normalmente.
O que estou esquecendo?
Answer: Obervables são como uma stream de dados que emitem eventos, portanto pra obter os dados destes eventos é preciso inscrever-se na stream, o objeto retornado dessa stream é um subscriber (que é o objeto que está sendo associado ao pratosPrincipais).
No seu caso o código está inscrito mas quando a stream emite next (que é quando a requisição retorna) sua função que escuta ao next não altera nada seu escopo local, no caso seu código precisa associar o valor no escopo fora da stream:
ngOnInit() {
  this.pedidoService.getPedidos(1)
    .subscribe(pedido => this.pratosPrincipais = pedido)
}

Para deixar mais claro, o Subscriber é o ponto no qual o encanamento da stream enviará os dados, é preciso de uma ação sempre que algo for recebido naquele encanamento.
Sim, observables são complicadas no início mas na prática é mais fácil, veja os exemplos da api :)
Comment: o erro final é no seu bind [data]="pratosPrincipais"
Comment: eu tentei da forma que me disse, mas me retornou [object object]
Comment: não é essa a response?
Comment: deveria me retornar um array de objetos
Comment: o array de objetos é o [object Object], deve ser descontruído dentro da função subscribe antes de associar aos pratosPrincipais
Answer: Sabemos que o método HttpClient.get() serve para buscar dados de um servidor, mesmo que pareça redundante é uma informação relevante.
O método assíncrono envia uma solicitação HTTP e retorna um Observable que emite os dados solicitados quando a resposta é recebida.
O método get() contem dois argumentos: a URL e um objeto de opções, porém em sua solicitação tem apenas a URL, passe o segundo parâmetro para sua API para que possa receber a resposta desejada utilizando: {observe: 'response'}.
Ou seja:
getPedidos = (tipo: Pedidos): Observable<any> => this.http.get(`${baseUrl}/pedidos?tipo=${tipo}`, {observe: 'response'});

Desta forma o observe especifica qual tipo de resposta deseja obter.
Você poderá encontrar mais informações a respeito dos tipos de retornos no site oficial do Angular: https://angular.io/guide/http#requesting-data-from-a-server
Answer: Nesse caso a sua variável pedido aparentar ser outro Obervable....
Você poderia fazer da seguinte forma:
ngOnInit() {
    this.getPedidos(1);
  }

  private getPedidos = (tipo) =>
  this.pedidoService.getPedidos(tipo)
  .subscribe(pedido => this.pratosPrincipais = pedido);

Ou outra opção seria converter para Promise e passar a utilizar o async/await
 async ngOnInit() {
   this.pratosPrincipais = await this.getPedidos(1);
  }

  private getPedidos = (tipo) =>
  this.pedidoService.getPedidos(tipo)
  .toPromise()

Comment: Ele me retorna "undefined" se eu fizer dessa forma.
Comment: private getPedidos = (tipo) =>
  this.pedidoService.getPedidos(tipo)
  .subscribe(pedido => this.pratosPrincipais = pedido);

ainda que faça dessa forma?
Comment: Mesmo dessa forma, tentei até retornar todo o meu resultado da api e nada


Why does Rules event 'After updating existing content' not result in 'Create a new comment'?

Question: I've used Create a new entity for the Rules event After updating existing content, but nothing happens.
Is it a bug?
Update:
Here is an export of my rule:
{ "rules_update_order" : {
    "LABEL" : "Update Order",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_update" : [] },
    "DO" : [
      { "entity_create" : {
          "USING" : {
            "type" : "comment",
            "param_subject" : "Something",
            "param_node" : [ "node" ],
            "param_author" : [ "node:author" ],
            "param_comment_body" : { "value" : { "value" : "Something", "format" : "filtered_html" } }
          },
          "PROVIDE" : { "entity_created" : { "entity_created" : "Created entity" } }
        }
      }
    ]
  }
}

It is a very simple rule. And I have a lot of rules which are easily fired apart from this one.
Some more Debugging information (contained in my Rules Logging):
0 ms Rule Update Order fires.
0.873 ms Evaluating the action entity_create.
33.717 ms Unable to create entity comment": Invalid data value given.
          Be sure it matches the required data type and format.
36.05 ms Unable to evaluate action entity_create.
36.099 ms Rule Update Order has fired.

Comment: This is the third comment + rules question from you today.. Do you have rules debugging enabled? If not, enable it and check the log. Then add that to this question.
Comment: There seems to be a unwritable error that happens with comments so it would be beneficial to know if that's the problem.
Comment: OK, I'll check.
Answer: Part 1: Understanding the problem
It takes a little time/effort to get used (and become experienced) in using the Rules module.
My experience is that it is rare to find a bug in the Rules module. Most of the cases where I experience something in Rules that deviates from what I expected, I can find out what "my" problem is by using debug-facilities available for the Rules module.
So within the Rules settings, experiment a bit with the debugging facilities that come with the Rules module. At least have a look at the "Rules Evaluation Log" (to check that the Rules logic being executed, actually matches what you expect that logic to be).
Depending on what the result of that type of debugging is, you may also want to (temporary) enable the Devel module, so that you can (temporary) add a Rules Action like "Display a value".
For more suggestions about Rules debugging, refer to  "How can I display the value of a variable inside a condition?"
Part 2: Examples of creating comments after updating existing content
Sorry to say, but I disagree with this comment that was posted below this answer:

It seems that it cannot work in this way and it is not possible to create a comment with this event.

Have a look at these answers, which are about questions that are variations of the question here:

How to create a Rule to create a new entity of type Comment and a body with tokens?
How to add a comment form in VBO to add the same comment to mutiple nodes?

Part 3: Experiment with other text formats
Even though your question doesn't provide any details about the text formats you are using, IMO it could well be that your actual issue is caused by the Text format that you're using for the comment body: your rule shows you're using filtered_html, but you should definitely give it a try to experiment with other text formats, such as plain_text.
PS: this answer is about D7 ...
Comment: I can't do anything with comments when the rules are related to After saving a new content or After updating existing content. It simply doesn't work.
Comment: Hm, that extra comment about "a lot of rules" may be part of what is causing your problem. To somehow avoid any other (concurrent) rules actions, you may want to (temporary) disable those rules that might be related to it. Keep in mind: **debugging an issue = removing all possible causes, one by one ... until you find the one that is what you were looking for ...**
Comment: It seems that it cannot work in this way and it is not possible to create a comment with this event.


Só consigo dar output a um registo da database. Como é que dou output a todos os registos que tenho na base de dados?

Question: public ActionResult Index()
{
    PAPEntities db = new PAPEntities();
    MoviesData movie = db.MoviesData.SingleOrDefault(x => x.MovieID == 1);

    List<MovieViewModels> MovieVM = new List<MovieViewModels>
    {
        new MovieViewModels
        {
            MovieID = movie.MovieID,
            MovieName = movie.MovieName,
            MovieDescription = movie.MovieDescription,
            MoviePrice = movie.MoviePrice,
            MovieCategory = movie.MovieCategory,
            MovieYear = movie.MovieYear
        }
    };

    return View(MovieVM);
}

Código da view
@foreach (var item in Model)
{

    @item.MovieName
    @item.MovieCategory
    @item.MovieYear
    @item.MoviePrice

}

Comment: Pô, o código tá especificando pra obter só um registro!
Comment: Quando estiver programando, procure pesquisar e entender o que faz cada linha do seu código
Comment: A sério? O que tenho de mudar para obter todos os registros?
Answer: O método SingleOrDefault serve justamente para obter apenas um registro de acordo com o predicado passado por parâmetro.
Você precisa remover a chamada para este método.
MoviesData[] movies = db.MoviesData.ToArray();

O ToArray serve para realizar a consulta no banco e enumerar tudo em memória. Isso poderia ser postergado, mas o método Select não permite criar uma instância de alguma classe que não seja um modelo do EF — no caso de LINQ To Entities, pra deixar claro.
E depois fazer o mapeamento para cada item
movies.Select(m => new MovieViewModels
{
    MovieID = movie.MovieID,
    MovieName = movie.MovieName,
    MovieDescription = movie.MovieDescription,
    MoviePrice = movie.MoviePrice,
    MovieCategory = movie.MovieCategory,
    MovieYear = movie.MovieYear
});


Proving Borel set

Question: How to prove that set $\{(x;y): 0\leq x \leq1, 0\leq y \leq 1, x+y\leq 1\}$ belongs to Borel $\sigma$-algebra  $\mathcal{B}(\mathbb{R}^2)$ ?
I tried to depict given conditions on coordinate plate and I got a triangle. I know  that to prove it we need to get rectangle. So how should I do it?
Comment: What is your definition of elements of $\mathcal B(\mathbb R^2)$, i.e. Borel sets in $\mathbb R^2$?
Comment: yes, it is a Borel set in $ \mathbb{R}^2$
Answer: In general if $X$ is a topological space equipped with topology $\tau$ then it induces the $\sigma$-algebra generated by $\tau$ (i.e. the smallest $\sigma$-algebra that contains $\tau$ as a subcollection).
This is the so-called Borel $\sigma$-algebra on $X$ and is often denoted as $\mathcal B(X)$.
Since $\mathcal B(X)$ contains all open sets and is closed under complements it also contains all closed sets.
If $\mathbb R^2$ is equipped with its common topology then the set mentioned in your question is evidently a closed subset of $\mathbb R^2$  hence is an element of $\mathcal B(\mathbb R^2)$.

P.S.
In your question you mention "rectangles" and this indicates that you are interpreting $\mathcal B(\mathbb R^2)$ as $\mathcal B(\mathbb R)\times\mathcal B(\mathbb R)$.
Fortunately there is a theorem that states that: $\mathcal B(\mathbb R^2)=\mathcal B(\mathbb R)\times\mathcal B(\mathbb R)$.
It is based on the fact that the common topology on $\mathbb R^2$ coincides with the product topology on $\mathbb R\times\mathbb R$ where $\mathbb R$ is equipped with its common topology.
See here for a proof.

Proving Borel set


In CouchDB shows, what does 'this' refer to?

Question: I'm trying to understand CouchDB and couchapp, and as I'm going through I'm seeing a dearth of the use of 'this' in any given context.  I understand that show objects get the document and the request, and are allowed to operate on them with lists and views.   These operations are all Javascript objects.  But CouchApp also seems to store, as strings, all sorts of things: README files, Mustache templates, and so on.  It must have access to them somehow.  Does the this operator in the context of a show provide access to the design document root in some way, giving one access to objects by some means other than the require syntax?
In Javascript, this has to be defined somehow in every context, specifically "There is a this value associated with every active execution context. The this value depends on the caller and the type of code being executed and is determined when control enters the execution context. The this value associated with an execution context is immutable" (ECMA-262 Spec, 3rd edition, section 10.1.7).  What does it mean in the context of an executing CouchDB design doc show function?  A view or list function?
Answer: The this variable, in all cases (_list, _show, _update) is the design document itself.
(Strictly speaking, it refers to a JavaScript object representation of the design document that contains the list/show/view function you are operating out of.)
Comment: +1. I hope you don't mind, but I edited your answer to be definitive and more confident (since it is in fact totally correct).
Comment: You will also see a lot of code where the first line of such functions is `var ddoc = this;`. Later, they will say `ddoc.views.foo` or `ddoc.templates.bar` because it feels natural.
Comment: Ah, okay.  It's still hard to find good examples of CouchDB design docs that aren't laden with a megaton of couchapp or kanso framework extras.  That's where ddoc comes from.  Thanks much!


Qutting a cocoa app after closing a window

Question: I have a small osx cocoa app that brings up an IKPictureTaker at start up, I would like for my application to quit after this picture taker is closed.  I read that I need to add this code to my NSWindowController class but I have no idea how to access this class (it shows up no where in my class list in XCode):`
-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
    return YES;
}

Answer: You need to create a custom object that implements the NSApplicationDelegate protocol and implement the applicationShouldTerminateAfterLastWindowClosed method there.
If you already have an application delegate (you more than likely do), just add it there.
Answer: You have to add this method to your application delegate, whatever object that is.


Por que meu display - flex não está funcionando?

Question: o código HTML é este aqui- Queria colocar um display flex apenas no "forms2" para os inputs ficarem em row. Oque devo fazer?

Prontuário: <input type="text">

Nome: <input type="text">

CPF: <input type="text">

ENDEREÇO: <input type="text">

*CSS
.forms2{
display: flex;
}
Comment: Importante você [edit] sua pergunta e explicar de maneira objetiva e pontual a dificuldade encontrada, acompanhada de um [mcve] do problema e tentativa de solução. Para aproveitar melhor o site, entender e evitar fechamentos e negativações vale a pena ler  [O que é o Stack Overflow](https://pt.meta.stackoverflow.com/q/7256/70) e o [Guia de sobrevivência (resumido) do Stack Overflow em Português](https://pt.meta.stackoverflow.com/q/8089/70).
Answer: Primeiro você precisa arrumar a estrutura html, você tem um monte de divs fechando sem abertura nas LIs. Depois você precisa aplicar o estilo na ul e não na div.

Nome: <input type="text" />

CPF: <input type="text" />

ENDEREÇO: <input type="text" />

E agora aplicar o estilo
.forms2 {
        display: flex;
        flex-direction: row;
    }

Comment: Muito Obrigado!
Comment: @Thiernodia se funcionou seria interessante marcar a resposta como correta (:


Código não lê o ELSE

Question: Fala pessoal, sou iniciante no Android e gostaria que voces me tirassem uma dúvida.
Estou fazendo um app para que o usuário complete todos os EditText's para que o programa possa realizar os devidos cálculos e portanto expor o resultado na Activity seguinte, que seria chamada. Depois do cod verificar os EditText's, ele deveria entrar no ELSE para poder abrir a nova janela, porém isso não ocorre. As mensagens de alertas das verificações são mostradas normalmente, mas a parte de ir pra outra tela não o é.
Voces sabem o que pode ser?
A seguir o código, ele é um pouco grande mas não é difícil e eu imagino que muitos de voces não irão ve-lo por completo, mas vamos lá:
<code>  public void onClick (View View) {

    // RESISTENCIA DO CONCRETO

    if (txt_resistencia_concreto.getText().toString().equals("")) {   // O que faltava era o toString()

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a resistência do concreto");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //MASSA ESPECIFICA DO CIMENTO

    } else if (txt_massa_especifica_cimento.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a massa específica do cimento");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ADITIVO MINERAL - VERIFICAÇÃO 1

        //TODOS OS CAMPOS VAZIOS
    } else if (txt_massa_especifica_aditivo_mineral1.getText().toString().equals("") && txt_teor_aditivo_mineral1.getText().toString().equals("") && txt_massa_especifica_aditivo_mineral2.getText().toString().equals("") && txt_teor_aditivo_mineral2.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha ao menos um aditivo mineral.");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ADITIVO MINERAL - VERIFICAÇÃO 2

        //MASSA ESPECIFICA DO ADITIVO MINERAL 1 VAZIA E TEOR PREENCHIDO
    } else if (txt_massa_especifica_aditivo_mineral1.getText().toString().equals("") && (txt_teor_aditivo_mineral1.length() != 0)) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de aditivo mineral 1.");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ADITIVO MINERAL - VERIFICAÇÃO 3

        //MASSA ESPECIFICA DO ADITIVO MINERAL 1 PREENCHIDA E TEOR VAZIO
    } else if (txt_massa_especifica_aditivo_mineral1.length() != 0 && (txt_teor_aditivo_mineral1.getText().toString().equals(""))) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor a ser utilizado do aditivo mineral 1.");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ADITIVO MINERAL - VERIFICAÇÃO 4

        //MASSA ESPECIFICA DO ADITIVO MINERAL 2 VAZIA E TEOR PREENCHIDO
    } else if (txt_massa_especifica_aditivo_mineral2.getText().toString().equals("") && (txt_teor_aditivo_mineral2.length() != 0)) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de aditivo mineral 2.");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ADITIVO MINERAL - VERIFICAÇÃO 5

        //MASSA ESPECIFICA DO ADITIVO MINERAL 2 PREENCHIDA E TEOR VAZIO
    } else if (txt_massa_especifica_aditivo_mineral2.length() != 0 && (txt_teor_aditivo_mineral2.getText().toString().equals(""))) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a massa específica do aditivo mineral 1.");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //MASSA ESPECIFICA SSS DA BRITA

    } else if (txt_massa_especifica_sss_brita.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a massa especifica sss da brita");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //TEOR AGUA NA BRITA

    } else if (txt_teor_agua_brita.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de água que consta na brita");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ABSORCAO AGUA NA BRITA

    } else if (txt_absorcao_agua_brita.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a absorção de água da brita");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //MASSA ESPECIFICA SSS NA AREIA

    } else if (txt_massa_especifica_sss_areia.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a massa especifica SSS da areia");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //TEOR ÁGUA NA AREIA

    } else if (txt_teor_agua_areia.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de água que consta na areia");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //ABSORCAO AGUA NA AREIA

    } else if (txt_absorcao_agua_areia.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a absorção de água da areia");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //MASSA ESPECIFICA ADITIVO

    } else if (txt_massa_especifica_aditivo_quimico.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha a massa especifica do aditivo quimico");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //PONTO SATURACAO ADITIVO

    } else if (txt_ponto_Saturacao.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o ponto de saturação do aditivo quimico");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //TEOR DE SOLIDOS

    } else if (txt_teor_solidos.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de sólidos do aditivo químico");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //AR INCORPORADO

    } else if (txt_ar_incorporado.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de ar incorporado no concreto");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //---------------------------------------------------------------------------------------------------------------------

        //SE O MÉTODO DE AITCIN FOI SELECIONADO, VERIFICA SE A RESISTENCIA ESTÁ DENTRO DOS LIMITES

    } else if (check_aitcin.isChecked()) {

        double converte_resistencia = Double.parseDouble(txt_resistencia_concreto.getText().toString());

        if (converte_resistencia < 40 || converte_resistencia > 160) {

            //Cria o gerador do AlertDialog
            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            //define o titulo

            builder.setTitle("Resistência do Concreto");

            //define a mensagem
            builder.setMessage("O método de Aitcin é limitado para resistencias entre 40 e 160 MPA.");

            //define um botão como positivo
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

            AlertDialog alert = builder.create();
            alert.show();

        }

        //SE O MÉTODO DE MEHTA FOI SELECIONADO, VERIFICA SE A RESISTENCIA ESTÁ DENTRO DOS LIMITES

    } else if (check_mehta.isChecked()) {

        double converte_resistencia = Double.parseDouble(txt_resistencia_concreto.getText().toString());

        if (converte_resistencia < 60 || converte_resistencia > 120) {

            //Cria o gerador do AlertDialog
            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            //define o titulo

            builder.setTitle("Resistência do Concreto");

            //define a mensagem
            builder.setMessage("O método de Mehta - Aitcin é limitado para resistencias entre 60 e 120 MPA. ");

            //define um botão como positivo
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

            AlertDialog alert = builder.create();
            alert.show();

        }

        //TEOR DE ADITIVO QUIMICO

    } else if (check_mehta.isChecked() && txt_teor_aditivo.getText().toString().equals("")) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Campos em branco");

        //define a mensagem
        builder.setMessage("Preencha o teor de aditivo químico");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

        //SE METODO DE AITCIN FOI SELECIONADO,

    } else {

       Intent it = new Intent (this, Resultado_Aitcin.class);

        startActivity(it);

    }

}
</code>
Comment: Ana, se o `Intent` deve ser sempre criado, (citado em: "Depois do cod verificar os EditText's, ele deveria entrar no ELSE"), então o else não deveria existir, seria só colocar o que está dentro do else no final do método. Pois quando uma dessas condições do `if` ou ìf else` são verdadeiras, as demais não não nem verificadas. Acho que é esse o problema
Comment: Bem, fiz exatamente o que voce sugeriu e o app simplesmente fecha. Ainda, está desconsiderando que o usuário vai insistir no erro.
Answer: <code> public void onClick (View View) {

// RESISTENCIA DO CONCRETO

    if (txt_resistencia_concreto.getText().toString().equals("")) // O que faltava era o toString()
        showError("Campos em branco", "Preencha a resistência do concreto");

    else if (txt_massa_especifica_cimento.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a massa específica do cimento");

    else if (txt_massa_especifica_aditivo_mineral1.getText().toString().equals("") && txt_teor_aditivo_mineral1.getText().toString().equals("") && txt_massa_especifica_aditivo_mineral2.getText().toString().equals("") && txt_teor_aditivo_mineral2.getText().toString().equals(""))
        showError("Campos em branco", "Preencha ao menos um aditivo mineral.");

    else if (txt_massa_especifica_aditivo_mineral1.getText().toString().equals("") && (txt_teor_aditivo_mineral1.length() != 0))
        showError("Campos em branco", "Preencha o teor de aditivo mineral 1.");

    else if (txt_massa_especifica_aditivo_mineral1.length() != 0 && (txt_teor_aditivo_mineral1.getText().toString().equals("")))
        showError("Campos em branco", "Preencha o teor de aditivo mineral 2.");

    else if (txt_massa_especifica_aditivo_mineral2.getText().toString().equals("") && (txt_teor_aditivo_mineral2.length() != 0))
        showError("Campos em branco", "Preencha o teor de aditivo mineral 2.");

    else if (txt_massa_especifica_aditivo_mineral2.length() != 0 && (txt_teor_aditivo_mineral2.getText().toString().equals("")))
        showError("Campos em branco", "Preencha a massa específica do aditivo mineral 1.");

    else if (txt_massa_especifica_sss_brita.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a massa especifica sss da brita");

    else if (txt_teor_agua_brita.getText().toString().equals(""))
        showError("Campos em branco", "Preencha o teor de água que consta na brita");

    else if (txt_absorcao_agua_brita.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a absorção de água da brita");

    else if (txt_massa_especifica_sss_areia.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a massa especifica SSS da areia");

    else if (txt_teor_agua_areia.getText().toString().equals(""))
        showError("Campos em branco", "Preencha o teor de água que consta na areia");

    else if (txt_absorcao_agua_areia.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a absorção de água da areia");

    else if (txt_massa_especifica_aditivo_quimico.getText().toString().equals(""))
        showError("Campos em branco", "Preencha a massa especifica do aditivo quimico");

    else if (txt_ponto_Saturacao.getText().toString().equals(""))
        showError("Campos em branco", "Preencha o ponto de saturação do aditivo quimico");

    else if (txt_teor_solidos.getText().toString().equals(""))
        showError("Campos em branco", "Preencha o teor de sólidos de aditivos quimicos");

    else if (txt_ar_incorporado.getText().toString().equals(""))
        showError("Campos em branco", "Preencha o teor de ar incorporado no concreto");

    else {
        if (check_aitcin.isChecked()) {
            double converte_resistencia =  Double.parseDouble(txt_resistencia_concreto.getText().toString());
            if (converte_resistencia < 40 || converte_resistencia > 160) {

            }
        } else if (check_mehta.isChecked()) {
            double converte_resistencia =  Double.parseDouble(txt_resistencia_concreto.getText().toString());
            if (converte_resistencia < 60 || converte_resistencia > 120) {

            }
        }
       startActivity(new Intent(this, Resultado_Aitcin.class));
    }

}

private void showError(String title, String err){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle(title);
    builder.setMessage(err);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
        }
    });

    AlertDialog alert = builder.create();
    alert.show();
}
</code>
Refiz o seu código e acredito que o problema tenha sido resolvido, também removi algumas coisas desnecessárias e que poderiam ser reutilizadas. O código parece-me mais limpo.
Pelo o que vi, o problema parecia estar nesse trecho de código:
<code>else if (check_mehta.isChecked()) {

    double converte_resistencia = Double.parseDouble(txt_resistencia_concreto.getText().toString());

    if (converte_resistencia < 60 || converte_resistencia > 120) {

        //Cria o gerador do AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //define o titulo

        builder.setTitle("Resistência do Concreto");

        //define a mensagem
        builder.setMessage("O método de Mehta - Aitcin é limitado para resistencias entre 60 e 120 MPA. ");

        //define um botão como positivo
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });

        AlertDialog alert = builder.create();
        alert.show();

    }

    //TEOR DE ADITIVO QUIMICO

} else if (check_mehta.isChecked() && txt_teor_aditivo.getText().toString().equals("")) {

    //Cria o gerador do AlertDialog
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    //define o titulo

    builder.setTitle("Campos em branco");

    //define a mensagem
    builder.setMessage("Preencha o teor de aditivo químico");

    //define um botão como positivo
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
        }
    });

    AlertDialog alert = builder.create();
    alert.show();

    //SE METODO DE AITCIN FOI SELECIONADO,

} else {

   Intent it = new Intent (this, Resultado_Aitcin.class);

    startActivity(it);

}
</code>
Veja que no seu código acima você criou uma condição para que SE um dos seus <code>checkbox</code> estiverem sido marcados, ele re-analisa a condição e verifica se um valor em específico foi inserido. Eu movi essa verificação para o <code>else</code>, pois só vai entrar no <code>else</code> se todas as <code>EditText</code> forem preenchidas, ou seja, não precisa verificar se há alguma em branco novamente, oque foi feito por você, e então, se nada estiver em branco, executa uma ação, mas isso não foi feito, por isso não chega no <code>ELSE</code>.
Comment: Cara!!!! Muito obrigada!!!!! Funcionou!!!!! Muito obrigada de verdade!!!!! Eu já estava neurótica com isso!!!
Comment: Bom ter ajudado! :)

Código não lê o ELSE