Why is a vector used while defining priority queue of structures?

Question: I know that we can define a priority queue of structures in the following way -
std::priority_queue<somestructure, vector<somestructure>, compare> pq;

Where compare is the structure which contains the compare function. I want to ask why we need to use vector as the second argument in this declaration. How is a vector related to a priority queue while defining the above priority queue?
Comment: Did you check out the [class documentation](https://en.cppreference.com/w/cpp/container/priority_queue)?
Comment: A `std::priority_queue` isn't a container itself, it's a container *adapter*. It *uses* a container internally to store the queue. By default it uses `std::deque`, but any container satisfying the requirements will work, like for example `std::vector`.
Comment: @Someprogrammerdude: Make this an answer please...
Comment: @Someprogrammerdude, the default underlying container for `std::priority_queue` is `std::vector` not `std::deque` according to https://en.cppreference.com/w/cpp/container/priority_queue.
Comment: @Karmo It *used* to be `std::deque`, I don't know in which standard it was changed.
Answer: std::priority_queue is what we call a container adapter. As you know in C++ we got containers like std::vector, std:array or std::deque. All those are there to directly save stuff of type T into them, with different pros and cons.
std::stack for example is a container adapter, which can be used on top of std:deque. The only thing this adapter does is to take away the functionality of std::deque to insert at the end, or take from the end. By this the user is forced to use the std::deque only like a stack.
Something similiar is true for std::priority_queue, it forces you to only insert into the underlying container, a std::vector for example, in an order. By this you get some nice properties of how to find elements in this container. In this special case, by taking more effort into how to insert new elements in the underlying container, and taking away the freedom to randomly insert an element anywhere you like. So you got O(log(n)) complexity for the insert instead of O(1) (instead of inserting at the end for example). But by that you have a complexity of only O(1) to find the largest element, instead of O(n).
There is nothing special about std::vector in this case, you could use any container that satisfy the needs of this container adaptor, you could also use std::deque or your own container or to quote:

The type of the underlying container to use to store the elements.
  The container must satisfy the requirements of SequenceContainer, and
  its iterators must satisfy the requirements of
  LegacyRandomAccessIterator. Additionally, it must provide the
  following functions with the usual semantics: front() push_back()
  pop_back() The standard containers std::vector and std::deque satisfy
  these requirements.
Comment: Awesome answer.
Comment: I would note that there are other considerations on whether to use a backing `std::vector` or `std:deque` container.

The priority queue uses the `pop_back` method of the backing container to remove items from its `pop` method. The `pop_back` differs for `std::vector` (doesn't change capacity) vs for `std::deque`.
Comment: std::deque won't change it capacity because of pop_back either or to quote C++20: void pop_back();
Effects: An erase operation that erases the last element of a deque invalidates only the past-the-end iterator and all iterators and references to the erased elements. An erase operation that erases the first element of a deque but not the last element invalidates only iterators and references to the erased elements. ... [Note: pop_front and pop_back are erase operations. —end note]
Comment: @Superlokkus how does that mean it won't change its capacity? Deque is a doubly linked list, thus it makes sense for any insertion/deletion from the container no iterators except erased elements are invalidated. But that does not mean the capacity has to stay the same.
Comment: @Quest `std::deque`is NOT a doubly linked list. `std::list` usally is a doubly linked list. While `std::deque` is more like `std::vector` but a bit more flexible, or to quote cpp reference: "Typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping". Also `std::deque` has some invalidation and complexity guarantees when popping at its ends, so its very likely that as in the `std::vector` case, it won't change its capacity.


Automated deployment of unity3d builds to lots of android devices

Question: I have a lot of Android devices that all want to run the same unity app, but the refresh cycle is long to test on all of them... I have to manually update each one when a minor change is made.  Currently I'm manually downloading an apk (via http) on each device.
Is there a way to deploy a unity app to lots of Android devices?  I have seen reference to this being possible in Android Studio, but I don't see a way to push from Unity to Android Studio for deployment, and it's not as elegant as I would like because I will need to have about 50 devices plugged in to USB.  Something over the network would be way better.
I know this can be done with (expensive) enterprise deployment systems, but it's a little impractical when I'm making a change every few minutes.
Is there a way to do this without Android Studio?  My build system is OSX, but any other operating system is available.  Something like a Jenkins deployment would be pretty awesome.
Anyone have an idea?  I was thinking that the app itself could check via http for updates, and it could update itself.  It's a bit to code, but maybe is do-able.  In that case, you have to manually install the app once per device, but after that it would detect if an update is available.
Answer: Once you deploy your app to the Google Play Store via your Google Developer Console you can set up automatic updates on your devices. Every time you deploy new apk your devices will get the newest version automatically.
You can of course deploy development version so only your test users can download it.


When the identity component of an abstract subgroup is a Lie subgroup

Question: If $G$ is a Lie group and $H$ is an abstract subgroup of $G$ such that the identity component $H^0$ is a Lie subgroup of $G$. Is $H$ a Lie subgroup of $G$?
Answer: In general, no. Take, for instance, $G=(\mathbb R^2,+)$ and $H=\mathbb R\times\mathbb Q$. Then $H^0=\mathbb R\times\{0\}$, which is a $1$-dimensional Lie group, but $H$ is not a Lie subgroup of $G$.


Babylon Sisters intro . Harmony?

Question: in the Babylon sister intro,
What is going on with the F#/E- A7b5-Ebmin7 ? ( my sheet music says Ebmajsus4 )
Just wanted advice on how to label
The chord functions.
I've circled the part in blue on the attached photo .
I cant tell what key I'm in.
On the sheet music it says Ebsus4 but I think it's EbMaj ! Are we in Ebminor right now ?
Thanks for helping if you can!
The A7b5 resolution to "Eb" works so well and I don't know why !
Are any of these Tritone subs? I don't think so but not sure why this section sounds so satisfying using such apparently distant cadences. Plus I'm thinking the sheet music is wrong on the EBsus4 - it sounds like Ebmin7
I wish someone with a jazz backroad would analyze this entire tune harmonically - I couldn't find anything online .
1: https://i.stack.imgur.com/iOOiO.jpg
Answer: Wow, where to start? Well first, let me say that this is a very complex song from a harmonic standpoint. That being said, don't look for a heck of a lot of long term tonality or traditional harmonic function in this or any later Steely Dan song. Just satisfy yourself with the interesting and unusual chord movements and voice leading produced by those great chord progressions. However, if you look you will find many snippets of harmonic function in these types of songs
Regarding the chart, it is absurd to put this in 6 flats. This song is so chromatic that it makes no sense to use a key signature. This creates enharmonic horror in places like the E5 (Ab, Cb, Eb ?) and A7#11 (Db ?) bars to name a few. It also makes it harder to read, keeping track of all those flats when so many bars have naturals or sharps. It should be in an open key signature, all accidentals added as needed.
Now, getting to your question, the E triads sound like they might be G#m triads with a B on top to me. There is only one note difference between the two but then it would contain the maj7. F#/E gives you an Emaj7#11 flavor, especially when prefaced by the E (or G#m) triad. That enforces thinking of these bars as Emaj7#11.
Let's skip the A7 and go to the Eb chords. These chords are really Ebm11 chords in my book. The Gb's on beats 1 and 4 sound like a part of the entire 2 bars. Even though those Gb notes do not sound for the entire two bars, they linger in your ear until the chord changes.
That gives us Emaj7#11 to Ebm11. This is a bII to Im. The bII is a Neopolitan chord that is often used in Flamenco music and many pop tunes.
Now for the A7#11, it is not a substitute dominant because then the dominant chord would be Eb which is our target chord. This seems like a chord that has no real function, maybe they just liked the movement and the sound. I do see a micro function in there though. If you tonicize the E chord, then it is a IV7 chord. It doesn't resolve but does have interesting movement to the next chord. The IV7 is widely used in jazz, pop and blues.
These chords are actually similar to the chorus of the song, except that the chorus starts on the Im instead of the bII and is a half step down, Dm11-Ebmaj7#11. They also don't use the passing Ab7#11 chord on the chorus.
Some might not agree with my take but analysis is after the fact and can be somewhat subjective at times. Also, I'm pretty sure Donald Fagen and Walter Becker were not sitting around writing Roman numerals on a piece of paper when they wrote this :)
Comment: Perfect . Thank you so much !
Comment: The A7#11 chords bear a passing resemblance to common-tone diminished 7th chords in my eyes, especially their resolution.
Comment: @Dekkadeci I do see your point. It only has two notes of an Eb diminished chord though, A and Eb and the voicing doesn't have a diminished sound to it with that big ol' R-5 in it!
Comment: Drop the key signature !

Babylon Sisters intro . Harmony?


Como fazer estimativas de tempo de desenvolvimento?

Question: Estou começando a tentar usar o Kanban na prática. No caso, eu trabaho sozinho, então estou tentando buscar essa resposta em um contexto no qual não há equipe disponível, muito menos processos mais formais encontrados em empresas maiores.
Ao utilizar metodologias ágeis é comum tentar fazer estimativas. Uma técnica que recentemente conheci é utilizar pomodoros e a sequencia de Fibonacci. Com essa técnica estimamos o tempo em pomodoros: um pomodoro se refere a 25 minutos de trabalho e 5 minutos de descanso. Para estimar uma tarefa usamos os números da sequência de Fibonacci. Uma tarefa pode ser estimada em 1, 2, 3, 5, 8, 13, 21... pomodoros e assim por diante.
O problema que eu vejo é: nesse caso temos uma unidade de tempo específica para usar e temos uma sequência de "números permitidos" para essa unidade de tempo a nossa disposição.
De qualquer forma, é necessário ainda olhar para cada tarefa e dizer: essa tarefa requer X unidades de tempo.
Isso parece ser realmente muito complicado por vários fatores:

Certas vezes pode se tratar de algo que nunca fizemos antes e não temos ideia de quanto tempo aquilo demora,
As vezes achamos que algo é fácil e rápido e no fim não era tão simples quanto pensávamos
Podem ocorrer imprevistos e fazer demorar mais. Isso se não aparecer uma complicação tão grande no meio do caminho que acabe "emperrando" o desenvolvimento

Esses são só alguns fatores que eu pensei que complicam isso. Para mim, que estou começando agora com as metodologias ágeis em prática mesmo, eu realmente não consigo ter a menor ideia de como atribuir X unidades de tempo para cada tarefa.
Na teoria parece simples, na prática não é tão simples assim. Dessa forma, como fazer estimativas de forma correta ao utilizar metodologias ágeis? Como contornar essas complicações que eu citei? Qual é a "métrica" usada para atribuir um certo número de unidades de tempo a uma tarefa?
Comment: Dica *metafórica* pra vida: você vai precisar de **uma régua** e de **uma equipe**. A régua será utilizada pra medir, claro. Não importa a régua que utilizar ou o sistema de medidas dela (metros, jardas, etc), **use sempre a mesma régua** (senão suas estimativas jamais serão úteis). O time será utilizado para construir, claro, mas também para definir a produtividade. Certos times vão levar mais tempo, outros menos tempo, para produzir **1 unidade de tamanho** da sua régua. Normal. Saiba disso. Como? **Chute, erre, armazene e refine**. Na próxima vez a estimativa vai ser mais acertada.
Comment: super interessante o levantamento, mas veja : Estimativa, é algo inexato, para situações onde vão ocorrer fatores imprevisíveis, vc levantou pontos que reforçam esta afirmação, ex:"algo que nunca fizemos antes e não temos ideia de quanto tempo aquilo demora"... Acredito que as métricas derivam de eventos já realizados... Esse é só um ponto que observei. O Kanban, ao meu ver, não interfere diretamente em suas questões, porém algo que poderia auxiliar seria o  https://pt.wikipedia.org/wiki/Ciclo_PDCA , mas vamos aguardar outras sugestões, muito me interessa a solução para as questões
Comment: Cara, onde você viu essa locuragem de associar pomodoro com fibonacci?? Se fibonacci em estimativa fosse multiplicador de um tempo exato, não seria muito mais fácil simplesmente apontar o tempo exato em horas? Pomodoro, por sua vez, é uma técnica para manter o foco e não tem nada a ver com estimativas. E Kanban, por sua vez, é um método para gestão de mudanças em processos, não um método de desenvolvimento de software, muito menos trabalhando sozinho. Resposta para você que trabalha sozinho: não desperdice muita energia fazendo estimativas - use esta energia para fazer software.
Comment: @Leonardo Entendi. Mas não é o caso de aplicá-las conjuntamente não. São coisas bem distintas. A idéia de usar sequência fibonacci é justamente não vincular a estimativa a um tempo exato, mas sim ao grau de complexidade da tarefa/requisito, e sem ignorar que algo complexo nem sempre demora mais do que algo simples. Grosseiramente falando, é mais uma, dentre tantas, técnicas de "chutar uma estimativa". Parece haver bastante gente interessada e a pergunta não foi fechada. Vou tentar dar uma resposta útil. (Mais tarde).
Comment: Eu tenho usado APF (Análise de ponto de função). É um pouco complexo para entender pois tem que sair da cabeça o desenvolvimento em si, mas temos conseguido estimar com uma taxa minima de erro. https://pt.wikipedia.org/wiki/An%C3%A1lise_de_pontos_de_fun%C3%A7%C3%A3o
Comment: o maior problema de desenvolver software é estimar, vivo na pele esse dilema todo dia +1 pela curiosidade.
Comment: @Caffé, eu vi em um curso sobre metodologias ágeis. Mas na verdade pode ser que o jeito que eu escrevi na pergunta que ficou estranho. Eu não supus uma conexão direta. O que eu vi foi que fibonacci é usado para dizer os valores possíveis de unidades de tempo. Já pomodoro eu vi que é uma técnica para manter o foco, mas ele fornece "unidades de tempo", medir o tempo em pomodoros. Mas não que as duas coisas estejam associadas. O que eu entendi é que da pra aplicar as duas coisas de forma conjunta, medindo o tempo em pomodoros e não em horas.
Comment: Leonardo, seu questionamento é muito bom. Não sou "expert" no assunto, mas tenho muito interesse. Como você está iniciando e não tem uma equipe ainda isso tende a ser mais complicado, mas a minha dica é estimar quanto você levaria para implementar um formulário simples. Digamos que este formulário (testado, validado) equivala a 3 em sua escala (não vamos pensar em horas agora, certo?), então a cada nova funcionalidade que tenhas que estimar tente pensar assim "isso equivale a quantos formulários simples?". É isso que aplico, e por sinal aprendi com outras pessoas. Futuramente caso você tenha u
Comment: Olá Leonardo, eu poderia postar aqui, mas acho que fica ruim de ler, quando tem bastante teoria. Uma das técnicas utilizadas é Pontos por Função, dê uma pesquisada é bem simples e se aproxima muito do esperado. Basicamente você vai encontrar as funções do software e analisar a quantidade de campos na tabela, as interfaces etc...
Answer: Como fazer estimativas ?
De acordo com diversos especialista,há duas maneiras de se estimar um desenvolvimento de um projeto software,eis as duas :

1-) Por Analogia – As estimativas de tamanho do projeto atual são baseadas em estimativas já desenvolvidas em projetos similares ou as chamadas bases históricas de outros projetos ou;
2- ) desenvolvendo as técnica de medições das características do produto e usando uma metodologia e algoritmo para converter a medição em uma estimativa de tamanho.

Metodologias básicas
Bom no seu caso,lhe aconselho a dar uma olhada neste artigo e neste artigo para saber melhor como projetar suas próprias estimativas em base dos seus trabalhos e quanto tempo você demora para fazer uma certa tarefa.
Um método interessante seria você usar em base o Planning Poker,que já foi citado,que é um jogo de consenso usado principalmente para estimar o esforço ou tamanho relativo as metas de desenvolvimento de um software.Te aconselho a dar uma olhada aqui para saber mais sobre o assunto e também a dar uma olhada aqui para poder criar online seu próprio Planning Poker.
O que também pode lhe ajudar a fazer certas estimativas de tempo de desenvolvimento é criar um Diagrama de Gantt.

O diagrama de Gantt é um gráfico usado para ilustrar o avanço das diferentes etapas de um projeto. Os intervalos de tempo representando o início e fim de cada fase aparecem como barras coloridas sobre o eixo horizontal do gráfico.

Exemplo de Diagrama de Gantt :

Metodologias complexas
Existem várias metodologias para se criar estimativas de tempo de desenvolvimento de software,as quais são :
COCOMO ( Constructive Cost Model) [COCOMOII]

Modelo desenvolvido para estimar o esforço de desenvolvimento, prazos e tamanho da equipe para projetos de software. Utiliza equações desenvolvidas por Boehm (BARRY,1981) para prever o número de programadores-mês e o tempo de desenvolvimento; podem ser calculados usando medidas de linhas de código ou Pontos de Função. Devem ser realizados ajustes nas equações a fim de representar as influências sobre os atributos , hardware e software durante o ciclo de vida do projeto. Uma desvantagem desta técnica é que os coeficientes da métrica (a,b,c,d) não são aplicáveis a tamanho ou seja a produtividade é diferente, o que torna difícil realizar comparações.

Linhas de Código – (LOC)

A técnica de mensuração por linhas de código é uma das mais antigas medidas de tamanho de projeto de desenvolvimento de software. Ela consiste na contagem da quantidade de número de linhas de código de um programa de software. Além de ser muito simples é também muito fácil automatizar sua implementação , mas, apresenta algumas desvantagens dentre as quais citamos: a dependência da linguagem de software e do desenvolvedor (PRESSMAN,1995); ausência de padrão de contagem e o fato de somente poder ser aplicada na fase de codificação.

Metricas de Hasltead

É um conjunto de métricas proposto por Maurice Halstead
(HASLTEAD,1977). O princípio desse método está na análise e quantificação de operando e operadores e no conceito de que a partir do conhecimento das medidas, consegue-se quantificar os vocábulos e a extensão do algoritmo do estudo.

Puttnam´s Slim Model (PUTMAN,1978)

É um modelo de estimativa que busca medir esforço e prazo através da dinâmica de múltiplas variáveis que pressupõe distribuição de
esforços específicos ao longo da existência de um projeto de software. Relaciona o número de linhas de código ao tempo e esforço de desenvolvimento. Uma desvantagem da técnica é sua vinculação a linguagem usada e a exigência de certo tempo para obter-se valores reais para os parâmetros da fórmula.

Delphi

É uma técnica que se resume à consulta de especialistas de determinada área, em determinada linguagem e/ou determinado assunto para que, usando sua experiência e entendimento do projeto proposto, façam estimativas devidas. Devem ser feitas várias estimativas do mesmo projeto, pois é comum que elas carreguem influências e tendências dos especialistas. É um método empírico, baseado em experiências profissionais que podem ser subjetivas.(Boehm,1981)

PSP – Personal Software Process – (HUMPHREY,1995)

É uma técnica derivada do SEI-CMM (Software Engineering Institute – Capability Matutiry Model) que foi
desenvolvida com a função de capacitar , melhorar e otimizar o processo individual de trabalho. A técnica divide-se em sete etapas, sendo que nas etapas PSP0, PSP0.1 e PSP1
estima-se o tamanho e o tempo necessário para o desenvolvimento do produto.

PCU – Pontos por Caso de Uso

Foram criados por Gustav Karner em 1993 como uma adaptação específica dos Pontos de Função para medir o tamanho de projetos de software orientados a objeto. Explora o modelo e descrição do caso de uso, substituindo algumas características técnicas proposta pelos Pontos de Função. É um método simples e de fácil utilização mas ainda esta em fase de pesquisas e não existem regras de contagem padronizadas. Têm se estudado a aplicação em conjunto da PCU e APF tentando explorar a relação entre elas existente.(EDMÉIA,2004)

Análise por Pontos de Função (ALBRECHT,1983)

Busca medir a complexidade do produto pela quantificação de funcionalidade expressa pela visão que o usuário tem do mesmo. O modelo mede o que é o sistema , o seu tamanho funcional e não como este será, além de medir a relação do sistema com usuários e outro sistemas. È independente da tecnologia usada e mede uma aplicação pelas funções desempenhadas para/e por solicitação do usuário final.; podendo também ser usada em estimativas.

Conclusão
A estimativa de tamanho de um projeto de software é uma atividade crítica pois tem um impacto tanto na solução técnica apresentada como no gerenciamento do projeto de software devendo ser efetuada não somente no início do projeto mas durante o ciclo de vida do projeto. As técnicas apresentadas acima são apenas algumas dentre as muitas existentes, sendo que cada uma abrange uma determinada área; não existe uma métrica que completa o estudo por si só, desta forma, recomenda-se que seja utilizada a técnica mais adequada para medir projeto de software ou a utilização de mais de uma técnica em conjunto. Dentre as técnicas descritas, a mais popular atualmente é a técnica de Análise por Pontos de Função. Esta técnica é respaldada pelo IFPUG (International Function Point Users Group), que é responsável, entre outros, pela elaboração e divulgação de um manual de práticas de contagem (CPM – Counting Practices Manual), além de manter um programa de certificação de profissionais especializados em aplicar a técnica APF. A Análise de Pontos de Função (APF) é uma das métricas de estimativa de tamanho mais sedimentadas no mercado e que proporciona resultados cada vez mais precisos à medida que artefatos da fase de análise e projeto são gerados.
Bibliografias

COCOMO – Constructive Cost Model. Disponível em: http://sunset.usc.edu/research/COCOMOII/
DEMARCO, TOM. Controle de Projetos de Software. 9.ed. Rio de Janeiro: Editora Campus, 1991.
VAZQUEZ, Carlos Eduardo, SIMÕES, Guilherme Siqueira, ALBERT, Renato Machado – ANÁLISE DE PONTOS DE FUNÇÃO, Medição, Estimativas e Gerenciamento de Projetos de Software, 13.ed. São Paulo: Editora Érica, 2013.
MACORATTI, José Carlos – Estimativas de tamanho de software e APF. Disponível em: : http://www.macoratti.net/net_est1.htm
Comment: Embora esta resposta contenha basicamente texto copiado de outros sites, eu acho que este é um assunto importante. Favor observar que 3 dos 8 métodos listados **não são de estimativa** mas sim de medição do tamanho do software, a ser feita **depois que o software já existe** e não antes. Das outras, algumas não contém sequer a mais superficial explicação, e uma delas (a Delphi) é um método de adivinhação e não de medição. Favor notar também que o Gráfico de Gantt não tem nada a ver com estimativa de software, ele serve para monitorar os desvios entre previsto e executado de tarefas encadeadas.
Comment: @Caffé Sim,suas observações são interessantes mesmo,mas eu sei que o Diagrama de Gantt não tem a ver com estimativa,mas ele pode também ajudar a organizar tarefas em depois saber como estimar mais ou menos quanto tempo poderá demorar para terminar uma certa tarefa e consequentemente pode servir para ajudar a criar estimativas de tempo de um software.
Answer: Existem basicamente dois métodos de se fazer estimativa de custo de desenvolvimento de software:
a) Adivinhar quanto vai custar.
b) Medir quanto vai custar.
Todos os métodos de estimativa são derivados destas duas maneiras básicas aí.
Os adeptos do método a estão sempre tentando aprimorar suas técnicas de adivinhação e os adeptos do método b estão sempre tentando aprimorar suas técnicas de medição.
a) Estimativa por medição
É o jeito mais antigo e tradicional de se estimar software.
Umas das técnicas mais populares deste método é a contagem de pontos por função, que funciona mais ou menos assim:

Levanta-se os requisitos
Desenha-se os casos de uso com base nos requisitos
Detalha-se os casos de uso nas funções que o compõem (há um range de tipos de função previamente estabelecido)
Soma-se os pontos de todas as funções (cada tipo de função tem uma quantidade de pontos previamente estabelecida)
Multiplica-se o total de pontos por uma unidade de valor (tempo, dinheiro...)
Aplica-se uma gordura.

Pode haver mais fatores influenciando a previsão de custo ou de preço do projeto (custo de gerência, risco, valor agregado, etc.), mas estes outros fatores estarão presentes conforme a natureza e ambiente do projeto e independentemente do método de estimativa escolhido.
O valor de cada ponto de função é uma decisão gerencial que se baseia em experiências prévias (próprias ou de mercado) e em outros interesses de marketing.
Este é um método incrivelmente eficaz.
É difícil errar a estimativa porque a medição é feita sobre documentos muito detalhados de tudo que será implementado. Cada função é um recurso de software bem elementar, como uma das letras do CRUD, se o objeto é uma entidade ou um relacionamento, etc. E é fácil acertar o tamanho do esforço para fazer uma implementação tão pequena.
O problema é que contar tudo que será feito exige que você saiba de antemão tudo que será feito. Ou seja, você tem que fazer um bom investimento em entendimento e detalhamento do escopo ainda antes de começar a fazer software.
Em projetos deste tipo, é natural esta fase demorar meses e custar o trabalho de vários consultores, comerciais e técnicos, que geralmente são os mais experientes da organização (os mais caros) pois a premissa é que esta fase seja concluída com muita qualidade.
É normal que este esforço tenha outras relevâncias no projeto além da estimativa, como por exemplo confiar na abrangente documentação produzida nesta fase para garantir que será desenvolvido o software certo, contar com a documentação como um suporte para manutenções futuras, ou receber uma assinatura do cliente nesta documentação (um contrato) e se blindar contra mudanças para garantir a margem ou o prazo.
Estas outras relevâncias da documentação trazem mais alguns contras a este método: você tem que desenhar todo o sistema antes de aprender todo o necessário sobre ele, pois o aprendizado, tando do cliente quanto do time, acontece durante a implementação do projeto e depois que o cliente começa a enxergar o software que é entregue.
Se você dificulta as mudanças, o cliente pode estar perdendo oportunidade de obter mais valor deste projeto. E se você se abre às mudanças, você está jogando fora o investimento que fez lá no começo quando tentou prever tudo que seria feito e todo o custo.
b) Estimativa por adivinhação
Este é o método preferido dos processos Ágeis, já que eles valorizam mais o software funcionando, cedo, do que documentação abrangente; mais colaboração com o cliente do que a negociação de contratos; são abertos à mudança e inclusive a encorajam; acreditam que a melhor arquitetura e design emergem em vez de serem previamente definidos; etc.
Como a idéia aqui é justamente permitir a mudança, não faz sentido investir muito em fechar um escopo, então geralmente constrói-se uma visão macro do projeto e uma estimativa aproximada, que só pode ser adivinhada já que não há o que medir pois ainda não se sabe exatamente o que será feito.
Existem vários métodos de adivinhação. Para definir um custo geral do projeto antes de começa-lo, é comum definir as capacidades ou features, que são os mega requisitos do projeto, adivinhar quanto vai custar cada uma e somar.
"Adivinhar" é um termo correto pois é admitido pelo projeto que o futuro é incerto, é admitido que não há ainda conhecimento profundo sobre cada feature ou capacidade para ter certeza de todo o trabalho que será necessário, e não há intenção de se adquirir adiantamente este conhecimento - dá-se preferência por começar a entregar software cedo e aprender com isso.
Todas as estimativas são baseadas em experiências prévias, e são difíceis de acertar com precisão pois são feita sobre um conhecimento macro e não detalhado do trabalho que será empregado.
Ainda assim em tese você pode entregar as capacidades previstas dentro do orçamento pois enquanto partes do software são feitas e apresentadas para o cliente, o aprendizado aumenta e permite deixar de executar trabalho que antes parecia necessário.
O contrário também pode acontecer e você identificar que errou muito feio na adivinhação, e que será impossível entregar as capacidades pelo custo previsto. Neste caso assume-se o novo custo ou cancela-se cedo o projeto antes de o prejuízo ser grande demais.
Veja que no outro método você também pode errar feio - não a estimativa de custo mas sim a previsão do que deveria ser implementado pois previu isso sem contar com o conhecimento que adquire-se durante o projeto. Neste caso, quando o projeto for cancelado, todo o custo daquela fase inicial soma-se ao prejuízo. Ou pior: como você já "sabia" tudo que precisava fazer e não queria mesmo que viessem mudanças, você não entregou o software em partes mas sim deixou tudo pro final - ou seja: risco de prejuízo total.
Adivinhações durante o projeto
Bem, até aqui eu só falei sobre a adivinhação que acontece no começo do projeto. Mas e durante o projeto, como são estimadas as tarefas (pequenos requisitos que vão constituir o mega requisito - a tal da capacidade/feature)?
Aqui acontece o mesmo tipo de adivinhação baseado em conhecimento empírico. Os métodos Ágeis de maneira geral desencorajam a estimativa em horas, pois admitem que não se pode prever com tal nível de precisão quanto vai custar mesmo um requisito pequeno.
Então inventou-se story points que são uma estimativa de esforço ou de tamanho ou de complexidade da tarefa, mas não estão diretamente relacionadas a custo em horas. A idéia é que com o tempo aprenda-se quantos pontos se pode fazer num período e que isso ajude a estimar as tarefas que poderão ser completadas, conforme sua quantidade de pontos, num período seguinte de igual tamanho.
Num esforço de desvincular ainda mais as estimativas Ágeis das estimativas em horas, utiliza-se escalas fibonacci ou os tamanhos "P", "M" e "G" (tipo tamanhos de camiseta) para desestimular a associação com horas (a associação imediata fica mais difícil pois o cálculo de conversão é mais difícil ou abstrato).
Para buscar uma adivinhação mais promissora, existe ainda o planning poker, que conta com a experiência de vários profissionais ao mesmo tempo para evitar desvios grandes demais para mais ou para menos. Você pode ler como funciona o planning poker por aí ou fazer uma pergunta específica pois só isso já dá alguns parágrafos.
Abaixo as adivinhações
Por fim, a última moda no universo Ágil é buscar alternativas para que não seja preciso sequer tentar adivinhar estimativas.
O raciocínio é o seguinte: se medir o projeto (aqui apresentado como "método a") não atende bem o cliente e se não somos tão bons em adivinhar ("método b"), que tal esquecer essa parada de estimar?
O nome deste movimento é #NoEstimates e a idéia, é claro, não é simplesmente deixar de estimar software, mas sim buscar alternativas a isso. Tipo "não conseguimos estimar, então o que podemos fazer em vez disso para garantir a relação custo/valor/prazo para o cliente?".
Considera-se ainda que embora o cliente precise saber quanto vai gastar e quanto tempo vai levar, a estimativa em si não tem valor para ele, e o que não tem valor, segundo o pensamento lean, deveria ser eliminado do processo (ok, ok, esta é outra história, ainda mais longa, então fica pra outra hora).
Estimativas para quem?
Como eu comentei de leve, questiona-se muito o valor das estimativas para o cliente.
De algum modo ele precisa saber quanto vai custar e quando fica pronto, ok. Segundo os métodos Ágeis, isso pode ser resolvido com macro estimativa de capacidades/features, entregas interativas e escopo aberto.
E quanto vai custar cada tarefa? Quanto vai custar cada um daqueles 10 pequenos requisitos que você pretende desenvolver nas próximas duas semanas? Será que você precisa mesmo calcular isso? Vai vender essa medição pra quem? Quem vai pagar por este esforço? Qual o valor em pregar um número fibonacci em cada post-it do quadro?
Por isso, se você estiver trabalhando sozinho ou se o seu projeto permitir, se não houver um gerente te cobrando isso, procure libertar-se das estimativas de curto prazo pois o seu valor real para o projeto até agora não foi demonstrado.
Observações finais
Conforme já conversamos nos comentários, a relação entre fibonacci e pomodoro não existe.
Pomodoro é uma técnica para manter o foco.
E usar números da sequência fibonacci nas estimativas é justamente um esforço de desvincular as estimativas do custo em horas.
Uma referência para dar valor à resposta
Ron Jeffries, um dos caras que assinou o Manifesto Ágil, que criou o Extreme Programing e que ajudou a inventar essas coisas de "story points" e "velocidade do time", é engajado no movimento #NoEstimates. Inclusive ele já pediu desculpas por ter inventado esse negócio de estimar em pontos. Segue:

"Existe um número de idéias sobre como estimar usando alguma outra coisa que não tempo [horas]. Pontos, Gummi Bears, números Fibonacci, tamanhos de camiseta. Eles foram originalmente inventados para obscurecer o aspecto de tempo, de modo que a gerência não seria tentada a mal utilizar as estimativas. (Eu sei: eu estava lá quando eles foram inventados. Na verdade eu devo ter inventado os Pontos. Se eu inventei, me desculpe agora.)"

Veja este pedido de desculpas e muitas coisas intererssantes em: https://pragprog.com/magazines/2013-02/estimation-is-evil
Comment: Desculpe, mas eu ri ao ler o item "Aplica-se uma gordura". Isso é dizer que se usa o método B, quando na verdade se usa o método A mas com todo o trabalho burocrático do método B. :)
Comment: Pois é, @LuizVieira, seria cômico se não fosse trágico. É claro que não é formalmente chamado de gordura. Formalmente, você *"considera as Características Gerais do Sistema (GSCs) para calcular o Valor do Fator de Ajuste (VAF) e aplicá-lo sobre a Contagem de Pontos de Função Não Ajustada (Unadjusted FP Count) de modo a obter a Contagem de Pontos de Função Ajustada (Adjusted FP Count)"*. Como muitas das GSCs são super subjetivas, você atribui a elas o valor que bem entender de modo a obter a gordura final que desejar.
Comment: Excelente resposta, +1.
Answer: Estimação de software é fundamental para qualquer projeto. Estimativas de custo, esforço e prazo são geralmente demandadas por clientes e o gerente do projeto precisa ter uma base para o planejamento e para tomar decisões no decorrer do projeto. A estimação também contribui para um maior entendimento do problema e provê um horizonte para a conclusão do projeto ou da iteração.
O planejamento exige que você assuma um compromisso inicial, mesmo que mais tarde ele venha se mostrar errado. Sempre que forem feitas estimativas deve-se olhar o futuro e aceitar certo grau de incerteza.

...nossas técnicas de estimativas são muito mal desenvolvidas. E, mais
  grave ainda refletem uma suposição um tanto falsa não declara de que
  tudo sairá  bem...como não temos certeza sobre nossas estimativas,
  gerentes de softwares mutias vezes não tem a firmeza necessária para
  fazer as pessoas esperar por um bom produto (Brooks)

Uma estimativa nada mais é do que uma estimativa. Processos matemáticos podem dar a falsa impressão de veracidade, mas a base é subjetividade com base em uma definição abstrata do sistema.

Estimar é prover uma visão do projeto clara o suficiente para que a
  gerência possa tomar boas decisões de como gerenciar o projeto para
  que o mesmo atinja seus objetivos (McConnell)

Incerteza na estimativa.
Basicamente, conheça o que tem que ser feito, de outra maneira sua estimativa vai ser provavelmente errada.

No início do projeto a incerteza atinge seu ápice, mas diminui na medida em que as tarefas são concluídas.
Quanto mais cedo ocorrer a estimação, piores serão as estimativas. A estimação antecipada de todo o software tende a gerar estimativas piores do que em casos onde elas são feitas em fases posteriores do projeto.
Embora muitas vezes seja necessário estimar todo o software, é importante refazer a estimação quando se deseja obter uma posição atualizada sobre o estágio de desenvolvimento.
O software é mutável, os requisitos mudam ao longo do tempo.
Algumas Tecnicas e modelos de estimação:
Planning Poker
Alguns processos ágeis, como o Scrum, encaram o projeto de software como um jogo. Nessa linha, alguns autores consideram a melhor forma de estimar uma espécie de poker com as histórias de usuário do backlog (Cohn, 2006, p. 55).
No Planning Poker, todos os membros da equipe de desenvolvimento se reúnem. Primeiramente, cada membro recebe cartas. Cada carta contém um valor da escala de story point definida para o projeto. Para cada história de usuário, os membros escolhem secretamente a carta com o valor que consideram ser o tamanho daquela história. Então, todos mostram suas cartas ao mesmo tempo. Quando há consenso, a estimativa seria confiável. Se um ou mais valores forem discrepantes, os membros discutem entre si o motivo porque a história de usuário seria mais ou menos complexa. Após entrarem num consenso, uma nova rodada de cartas é realizada. Isso é feito até que todos estejam de acordo com a estimativa.
Os "agilistas" afirmam que esta técnica tem funcionado bem pelos seguintes motivos (Cohn, 2006, p. 59):
•   aqueles que sabem como fazer o trabalho são os que fazem as estimativas;
•   o diálogo faz com que os estimadores tenham que justificar suas estimativas, portanto eles pensam bem no que estão fazendo;
•   a discussão em grupo, segundo alguns estudos, levam a melhores estimativas.
O Planning Poker geralmente é feito de forma mais intensa, porém menos detalhada, no início do projeto, de modo a gerar as estimativas iniciais necessárias para o planejamento geral e o número de iterações.
No início de cada iteração, sugere-se levar algo em torno de uma hora para detalhar as estimativas das histórias de usuário que serão implementadas, as quais, que nesse ponto, estão dividias em tarefas. O tempo de estimar varia de acordo com o tamanho da iteração.
Estimação orientada a objetos
Sistemas orientados a objetos podem ser estimados através de modelagem orientada a objetos, como a UML (Unified Modeling Language). Atribui-se valores a cada objeto do sistema e, assim, pode-se chegar a uma estimativa geral.
Algumas medidas sugeridas por Pressman (2009, p. 506) são:
•   número de scripts de cenários de interação entre usuário e o sistema;
•   número de classes importantes e independentes do sistema;
•   número de classes de apoio não relacionadas ao domínio (banco de dados, interface com usuário);
•   número de classes de apoio relacionadas ao domínio;
•   número de subsistemas.
Estimação orientada a casos de uso
É possível utilizar casos de uso para estimar um software. As estimativas de cada caso de uso possibilitariam planejar o projeto com um todo.
Entretanto, como casos de uso são muito abstratos e pessoas diferentes trabalham em diversos níveis de abstração. Não há parâmetros para definir uma medida padrão para o esforço necessário para implementar um dado caso de uso (Pressman, 2009, p. 507). Em decorrência disso, a estimação com casos de uso não é recomendada, sendo pouco utilizada.
Você pode se aprofundar muito mais nesse universo, recomendo:
O blog State of the art (muita coisa foi tirada de la)
Engenharia de Software - 8ª Edição
Mythical Man Month
Scrum Em ação
....
Answer: Só não dou -1 a sua pergunta porque ela vale milhares de dólares para a indústria de software :-) e certamente as respostas que você leu acima são compilações do que se ensina nas Universidades nas disciplinas de Engenharia de Software. Mas agora, vou tirar meu chapéu de professor e colocar o de profissional para responder. Usar a minha própria experiência para responder e não citações daquilo que não uso mais e um dia deu certo, mas hoje para meus projetos e perfis de clientes não funcionam mais.
Se esse assunto fosse fácil não seriam necessários tantos livros sobre a Engenharia de Software que não é Engenharia (tal como conhecemos). Da mesma forma como não gosto de chamar de método aquilo que não tem comportamento bem definido e previsível e a possibilidade de ter sempre os mesmos resultados se aplicado em certas condições. Como diz Fred. Brooks: "não existe a bala de prata". Porém uma coisa que gosto muito de defender é o famoso triângulo do PMI: prazo, custo e esforço que são variáveis fortemente acopladas aos requisitos. Simples e fácil de entender: mexeu nos requisitos, afetará uma ou mais dessas variáveis. Exemplo: Encurtou o prazo vai ter que cortar requisitos. Aumentou escopo? Esticará o prazo por conta de esforço (e aí vem o erro clássico: aumento o time não tenho problemas com prazo - horda mongólica).
Se você for matemático de formação ou conheça profundamente os métodos de programação linear tal como o Simplex, entenderia que, para problemas complexos, existem possíveis soluções para se chegar ao que se chama de solução ótima (não disse correta). Lhe garanto, não existe nenhum método único completo capaz de aferir com certeza o que você quer, porque são ideias, não métodos formais. Trabalham com interpretação de requisitos.
Se você for usar uma estimativa para aplicar um preço ao seu trabalho, afirmo, esqueça. Extremamente falível porque estimam requisitos que não podem ser congelados ao longo do projeto. Eles mudam. Por isso Engenharia de Sfw não é Engenharia. Não adianta. Precifique pelo esforço de comprometimento, jamais só considerando o escopo dos requisitos congelados. As grandes fábricas de software misturam abordagens para alinhar o preço do projeto, ajustando de acordo com o prazo / esforço temperando com lucro e análise dos riscos.
Existem empresas vendendo sprints. Acho muito interessante essa abordagem. Não dão um preço final do que não enxergam ou daquilo que pode mudar muito. Parece surreal mas existem clientes maduros o suficiente para entender que este é um modelo interessante e funcional. Para seu caso, para ser pratico estime seu esforço mês o que você consegue entregar nesse mês e venda a sprint tendo como base seu custo/lucro. De uma ideia aproximada de quantidade de sprints e pronto. Esqueça unidade horas, homem/mês (em sua situação) para estimar prazo. Não vou te sugerir uma coisa complexa para ser aplicada em uma fábrica de software por vários profissionais visto que trabalhará sozinho nesse projeto e não tem como ter uma área de Q&A para garantir sucesso (em resumo).
Lembre-se sempre que a qualidade não vem do cumprimento correto dos métodos. Vai muito além disso. Não é porque adotamos um método ou modelo A ou B que teremos uma garantia de qualidade na estimativa, no desenvolvimento ou na entrega.
Espero ter te ajudado a encontrar um ponto de partida.
Comment: De maneira nenhuma eu gostaria de ver esta resposta excluída. Acho ela excelente e acho que agrega valor.
Comment: Nem todas as respostas são compilações do que se ensina nas universidades. Leia a minha resposta até o fim e observe que a sua aqui vem corroborar com o que já falei lá.
Comment: @Caffé disse que as respostas são, não disse somente a sua. plural e não necessariamente só o seu artigo. Disse isso na minha resposta?
Comment: E eu disse que você disse que era somente a minha? :D
Comment: @Caffé, preciso tomar café kkkkkkkkkk. O que deixaria você feliz, apagar minha resposta? Posso fazer isso sem problema nenhum amigo! :-D


How do I restrict the date popup to 12 months from start date?

Question: I have a custom module where I set two date pop-ups.
<code>$form['set_start_date'] = array(
  '#type' => 'date',
  '#title' => t('set start date'),
  '#required' => TRUE,
);

$form['set_end_date'] = array(
  '#type' => 'date',
  '#title' => t('set end date'),
  '#required' => TRUE,
);
</code>
If I select 2017-04-12 as start date, the accepted end date should not be after 2018-04-12.
How can I achieve this?
Comment: No need to do custom code ,content type>managefield>edit date field ,where you can see Default date and Relative default value,set Default date=relative,Relative default value= -12 month
Comment: @Vikramfz16 That is for a content type; the OP is creating a form, so that setting would not help.
Answer: Following Method i used to restrict the date Pop-up to 12 months
<code>$form['set_start_date'] = [
      '#title' => $this->t('START DATE '),
      '#type' => 'date',
      '#attributes' => array('type'=> 'date', 'min'=> '-12 months', 'max' => 'now' ),
      '#date_date_format' => 'd/m/Y',
    ];

 $form['set_end_date'] = [
      '#title' => $this->t('END DATE'),
      '#type' => 'date',
      '#attributes' => array('type'=> 'date', 'min'=> '-12 months', 'max' => 'now' ),
      '#date_date_format' => 'd/m/Y',
    ];

  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Filter'),
    );

 return $form;
}
</code>


Pure Java HTML viewer/renderer for use in a Scrollable pane

Question: What pure Java HTML viewers and renderers are available?  The requirements are:

It should implement the JComponent interface to be placed into Scrollable pane.
It should be preferably a free solution; open source is a plus.
Its availability as Maven artifact is a plus.

I know only of a few components and projects, some of which are now defunct:

Built-in JEditorPane, supports HTML 3.2 (as of Java 1.4)
DJ Project (it is pure Java?)
Ekit by hexidec (is based on javax.swing.text.html.HTMLEditorKit)
JSyndrome HTML Editor by Sferyx
JWebPane (was it ever released)?
JDIC (abandoned; from some info here I see that it is native)
(PDF renderer) WebRenderer (former XHTMLRenderer)
Answer: Since Java 8, you can use JavaFX's WebView Component, which can also be used in Swing.
Code is as simple as:
JFXPanel jfxPanel = new JFXPanel(); // Scrollable JCompenent
Platform.runLater( () -> { // FX components need to be managed by JavaFX
   WebView webView = new WebView();
   webView.getEngine().loadContent( " Hello World!" );
   webView.getEngine().load( "http://www.stackoverflow.com/" );
   jfxPanel.setScene( new Scene( webView ) );
});

It is backed by the WebKit engine (version depends on JRE and is reasonably up to date).
But keep in mind that it is not a full browser, so don't count on support of, say, HTML5 audio/video.
Otherwise, it runs HTML + CSS + JS as good as your browser.
Technically, the underlying engine is C++, not native Java.
But it is bundled in Oracle's official JRE, requires no library, has zero config, is as cross-platform as Java FX, and is actively updated and maintained.
As good as native Java for most use cases, I think?

The information below is outdated, seeing that we now have WebView in Java.

Tried Cobra/Lobo, CSSBox, and Flying Saucer, all pure Java. Others are either native or commercial.
Content: Simple HTML generated on the fly (as string), embedded CSS 2.1, no JS.
Short story: Flying Saucer is simplest to use and render is most correct, but you better have  full control over content. Otherwise look for a native solution.
Long story:
CSSBox seems to be more active, however it seems to depends on some 3rd party libraries.  For example the demo depends on nekohtml which use apache xerces which changed the way the default Java 1.7 sax parser works and broke my program, but when I force it to use java's built in xerces I get ClassCastException (InlineBox to BlockBox).  Can't get it to work at the end.  Plus still haven't found a way to replace the document in an existing  BrowserCanvas.
Cobra is no longer maintained, have to manually fix an incompatibility issue to make it works in 1.7.  Also need to grab mozilla Rhino (not using any JS) but that is all.  After that it is fairly smooth, just need to ask Logger to hide paint messages.  Render is correct and speed is fair - as long as the document is simple.  When you start to use less common tags or more complicated layout, Cobra falls apart pretty quickly.
Flying Saucer has the best CSS support of the three as of writing (Feb 2011).  Setup is very easy (e.g. no need to setup document like cobo or domparser like cssbox) has few dependency - which also means no javascript.  But Flying Saucer is very strict about what you feed it.  The source must be a well-formed XML, for example style and script may have to be wrapped in CDATA and if you use html entities you must declare DTD (so no html5 doctype).  However if you are embedding content that you can control then it may be your best choice.
Comment: Thanks for sharing your experience. Few years passed and there are no outstanding improvements / changes as far as I can see :)
Comment: @dma_k: Cobra ultimately failed me, but I can find a better alternative called Flying Saucer, last updated Feb 2011. Originally hosted on java.net, it seems to be both more up to date and easier to use then Cobra and CSSBox. So maybe there are some improvements after all.
Comment: CSSBox is working for me on Java 7 so it looks like the XML parser issues have been sorted out
Comment: I found the JavaFX WebView to be slow.  Are there any new solutions out there yet?
Comment: @gagarwal CSSBox is still growing, but it should hard to best WebView (native WebKit).  My experience is WebView has slows JS startup and limited (no?) parallel connection. For JS, JIT gives very good speed after warmup; not much we can do. For connection, WebView sucks on page with many resources, and it speed up when I use host file to block out irrelevant 3rd parties. Keep Java up to date also helps. If you open a new question (with specifics), the SO community may be able help you better.
Answer: If you are using Swing, you can embed a JavaFX WebView.
1)Should implement JComponent interface to be placed into Scrollable pane.
In order to add the WebView to Swing you need to add it to JFXPanel, which is a JComponent.
To make the WebView fill the full JFXPanel, I used an AnchorPane like so:
                final AnchorPane anchorPane = new AnchorPane();
                WebView webBrowser = new WebView();

                //Set Layout Constraint
                AnchorPane.setTopAnchor(webBrowser, 0.0);
                AnchorPane.setBottomAnchor(webBrowser, 0.0);
                AnchorPane.setLeftAnchor(webBrowser, 0.0);
                AnchorPane.setRightAnchor(webBrowser, 0.0);

                //Add WebView to AnchorPane
                anchorPane.getChildren().add(webBrowser);

                //Create Scene
                final Scene scene = new Scene(anchorPane);

                // Obtain the webEngine to navigate
                final WebEngine webEngine = webBrowser.getEngine();
                webEngine.load("http://www.google.com");
                _jfxPanel.setScene(scene);

Whenever you run JavaFX code, make sure to run it in Platform.runLater().
2) Should be preferably a free solution; opensource is a plus.
Well, it's pure Oracle java.
3) Availability as maven artifact is a plus.
See the StackOverflow answer Maven project with JavaFX (with jar file in `lib`) for advice on integrating JavaFX and Maven.
From Java8 on JavaFX will be fully integrated in Java.
Additonal Pros:
-supports HTML5 and JavaScript (uses webkit)
-supports platform interoperability
-even supports interacting with the DOM, run JavaScript, get notified of events from the Webview.
Cons:
-JavaFX needs to be installed. But it comes bundled with java since v7u6 (August 2012).
Other experiences:
I tried djproject, but had lots of problems with platform interoperability. Worked quite well on Windows, but only with major effort on Linux and I couldn't get it to work on Mac. For every platform you also need to build a 32bit and 64bit version of your jar. With lot of effort and a huge jar file you could possibly merge everything together in one jar. But this was far from being convenient.
Compared to the JavaFX solution I mentioned above, the DJProject was a way bigger pain.
Answer: CSSBox might be what you're looking for: http://cssbox.sourceforge.net
Answer: Check out this article: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java
It uses JEditorPane and some other Swing classes to parse and render not only HTML, but also CSS.
Comment: @Sean: Thanks for the answer, using `JEditorPane` is clear. I need alternatives.
Answer: You can also access the native browser through something like:
http://djproject.sourceforge.net/ns/
For certain web pages, this is sometimes the only way to go.  There are always trade offs.
I have yet to find a browser component that renders well, is open source, and sufficiently flexible at the same time.  Cobra comes close but there are pages that it won't render and it's tough (impossible?) to do things like get rid of its own scroll bars, etc..
Answer: Wow haferblues, I never thought I would find something I like about JavaFX. But the browser implementation is really nice. For those (like me) that never have used JavaFx before here the complete class (for the snippet of haferblues):
import com.sun.javafx.application.PlatformImpl;

import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class SwingBrowser extends JFXPanel {
    private static final long serialVersionUID = 1L;

    public SwingBrowser(String url) {
        PlatformImpl.startup(new Runnable() {
            @Override
            public void run() {
                final AnchorPane anchorPane = new AnchorPane();
                WebView webBrowser = new WebView();

                // Set Layout Constraint
                AnchorPane.setTopAnchor(webBrowser, 0.0);
                AnchorPane.setBottomAnchor(webBrowser, 0.0);
                AnchorPane.setLeftAnchor(webBrowser, 0.0);
                AnchorPane.setRightAnchor(webBrowser, 0.0);

                // Add WebView to AnchorPane
                anchorPane.getChildren().add(webBrowser);

                // Create Scene
                final Scene scene = new Scene(anchorPane);

                // Obtain the webEngine to navigate
                final WebEngine webEngine = webBrowser.getEngine();
                webEngine.load(url);

                setScene(scene);
            }
        });
    }
}

Comment: I am getting: Exception in thread "AppKit Thread" java.lang.NullPointerException
Answer: The Flying Saucer was doing the job OK, but the following rendered text example was a huge turnoff for my mobile app development on Linux Java :
Sometimes the period at the end changes line without the text beside
.
Also, the text isn't selectable unlike for the JTextPanel.
Parser only seems to accept UTF-8 encoding. I couldn't manage to force my own encoding when parsing.
Comment: The newest version has a fix in Breaker.java class of flying saucer that fixes this , try with the latest on flying saucer project on github


Cisco 877 VPN: PPTP encryption not working

Question: A followup to this question.
I have a Cisco 877 ADSL router configured (at last!) to act as a VPN server; it supports both PPTP and L2TP VPNs, and I can successfully connect to it from Windows computers using the built-in VPN software.
There is only one problem: when using a PPTP VPN, encryption doesn't work. If I configure the client to require encryption (default setting), the connection fails with an error about the remote endpoint not supporting it. If I remove the encryption requirement, the connection succeeds. I've also tried tweaking the encryption settings (40/128 bits), but this didn't work either.
This is the relevant part of the router's configuration; the complete config is available in the question I linked above.
vpdn enable
vpdn-group VPN_Clients
 accept-dialin
  protocol any
  virtual-template 1

ip local pool VPN_Pool 192.168.42.250 192.168.42.254

interface Virtual-Template1
 ip unnumbered Vlan1
 ip nat inside
 peer default ip address pool VPN_Pool
 ppp encrypt mppe auto required
 ppp authentication ms-chap-v2 ms-chap chap

The router's IOS version is 15, and it fully supports encryption.
The strangest thing is, encryption is actually required in the router config; but not only the router doesn't seem to offer it... it also accepts unencrypted connections, which it shouldn't. It's like the ppp encrypt mppe auto required command is completely ignored.
How can I fix this?
Comment: I'm not sure really, perhaps there is a separation here between the encryption of authentication and encryption of the data transmission.
Comment: That command (according to the documentation) has the exact purpose of turning on **data** encryption.
Comment: I know that PPTP is built upon GRE tunnels, I'll check with someone on why you're seeing what you are.
Answer: Looks like it was a bug.
I updated the router's IOS from version 15.0(1) to 15.1(3) and now the problem is gone.
Comment: Apologies for topping and old topic, but I've followed this thread, and the thread it followed on from, with interest. We're in exactly the same position - need to configure a Cisco 877 router as a VPN server. However, the instructions in the first thread are to setup a PPTP VPN, which I now believe are insecure. If this is the case what are you using instead?
Comment: The accepted answer in the first thread enables both PPTP and L2TP.


Exercise on saturated Tits system

Question: I'm trying to work through the following exercise in Bourbaki, Lie Groups and Lie Algebras.

For part (a), we are assuming $b \in B$ normalizes $N$, and we are supposed to show that $bnb^{-1}n^{-1} \in T = B \cap N$ for all $n \in N$.  The hint is to write $bn = (bnb^{-1})b$ use Theorem 1, which says that
$$w \mapsto BwB$$
is an injective on $N/T$.  Already $bnb^{-1}n^{-1}$ lies in $N$.  Thus, if we can show that $Bbnb^{-1}n^{-1}B = B$, it will follow that $bnb^{-1}n^{-1} \in B \cap N$.  I'm probably just tired but I can't get anywhere on this problem.  I would appreciate any further hints.
Answer: (a): First, assume that $b \in B \cap \hat{N}$.  We will show that $bnbn^{-1} \in B \cap N$ for all $n \in N$.  Let $n \in N$.  Since $b \in \hat{N} = \mathcal N_G(N)$, we have $bnb^{-1}  = n'$ for some $n' \in N$. Then $bn = n'b$, so $BnB = Bn'B$.  This implies that $n \equiv n' \pmod{T}$, so $n'n^{-1} = b_0$ for some $b_0 \in T$.  Then $$bnbn^{-1} = n'n^{-1} \in T = B \cap N$$ as required.
Next, let's show that if $b \in B \cap \hat{N}$, then $b \in \hat{T} = \bigcap\limits_{n \in N} nBn^{-1}$.  By what we just showed, we have for each $n \in N$, that $bnbn^{-1} = b_0$ for some $b_0 \in B \cap N$.  Then $$b = b_0nb^{-1}n^{-1} = n(n^{-1}b_0n)b^{-1}n^{-1}$$
which is in $nBn^{-1}$, since $N$ normalizes $B \cap N$.
Finally, let's show that $\hat{T} \cap N = T$.  Since $\hat{T} \subseteq B$, we have $\hat{T} \cap N \subseteq B \cap N = T$.  Conversely, if $b_0 \in T = B \cap N$, then already $b_0 \in N$, so we just need to show that $b_0 \in nBn^{-1}$ for every $n \in N$.  But
$$b_0 = n(n^{-1}b_0n)n^{-1}$$
with $n^{-1}b_0n \in B$.

Exercise on saturated Tits system


Redirect to "Access denied" page?

Question: Is there a path with which I can call the "Access denied" page?
I'm trying to implement a rule that redirects to such a page because I want to prevent users and search robots from visiting certain nodes.
This is for Drupal 6.
Comment: @Mohammad Ali Akbari's answer is the thing to do if you really do need to use a rule.  If you simply need to hide some nodes from being viewed on their own, then take a look at the [Rabbit Hole](http://drupal.org/project/rabbit_hole) module.
Comment: @MPD Thank you, I'll go with [Rabbit Hole](https://drupal.org/project/rabbit_hole). If you post your comment as an answer I can tick it as the correct one.
Answer: You don't need to redirect to any page; you can produce the access denied page by calling drupal_access_denied().
Comment: Correct.  You never want to redirect away from the URL that gets denied.  The URL itself should generate the 403.  When you redirect, a 301 would get generated for the URL and then a 403 for the page you redirected to.  Same goes for making a URL 404.
Comment: @BernhardV, try it as adding `drupal_access_denied(); exit;`
Comment: You can have an action on a rule to call custom PHP.
Comment: Unfortunately when calling `drupal_access_denied();` the "Access denied" page gets displayed in addition to the normal node view.
Comment: I see that generating a 403 error is better. But is it possible to call this function with my rule?
Comment: where do you load node? `page callback` or `block`?
Answer: If you simply need to add some logic to prevent nodes from being viewed on their own, there are a few well-known solutions.  If you search here, you will find the various options.
After trying a few different methods, using the Rabbit Hole module is my new preferred solution.  One, you don't need to roll your own solution in a custom module anymore.  Two, the configuration is rather flexible and supports multiple behaviors within a single site.  I don't see myself going back the method I used to promote.
Answer: You can create your own action in hook_rules_action_info()
Here is sample what you can do in your_module.rules.inc file.
<code>/**
 * @file your_module.rules.inc
 * Contains custom code for Rules module.
 */
/**
 * Implements hook_rules_action_info().
 */
function your_module_rules_action_info() {
  return array(
    '_your_module_access_denied' => array(
      'label' => t('Access Denied'),
      'group' => t('Nodeex Rules'),
    ),
  );
}
/**
 * Rule action _your_module_access_denied.
 */
function _your_module_access_denied() {
  return drupal_access_denied();
}
</code>
Comment: Also, the [content_access](https://www.drupal.org/project/content_access) module offers optional rules integration if you want to avoid adding custom code.

Redirect to "Access denied" page?


Tipo de teclado android, texto e número

Question: Tem como eu fazer com que o teclado do android fique com dois tipos, no caso eu queria números e letras. Eu tentei usando android:inputType, mas não funcionou. Será que já tem uma forma de resolver isso?
Obrigado.
RESOLVIDO
Olhando mais afundo o problema, percebi que o problema não era no tipo de teclado, e sim na máscara do input, tudo que era digitado, na classe da máscara ele chamava o setText() fazendo com que o teclado voltasse para o  padrão, então em vez de setText(), usei o seguinte:
ediText.getText().clear();
ediText.append(mascara.toUpperCase());

Obrigado a todos.
Comment: O teclado alfanumerico que aparece não resolve? Basta o usuário apertar a tecla especifica que muda para numeros e simbolos.
Comment: O problema é que quando eu mudo o tipo de teclado, eu clico em um número ele volta pro tipo anterior, talvez pode ser um máscara que estou usando no input, ai quando eu uso o setText, ele volta pro tipo anterior.
Answer: Tente o seguinte:
android:inputType="textCapCharacters"

Segundo a documentação:

Pode ser combinado com texto e suas variações para solicitar
  capitalização de todos os caracteres.

Segue o link da documentação
Saudações

Tipo de teclado android, texto e número


Como criar uma página de cadastro usando JSF + Spring

Question: Estou criando uma página de cadastro de usuários mas estou encontrando o seguinte erro:

type Exception report
message Não é possível criar instância para·a classe:
  managedBean.CadastroBean.
description The server encountered an internal error that prevented it
  from fulfilling this request.
exception
javax.servlet.ServletException: Não é possível criar instância para·a
  classe: managedBean.CadastroBean.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
  root cause
com.sun.faces.mgbean.ManagedBeanCreationException: Não é possível
  criar instância para·a classe: managedBean.CadastroBean.
    com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:191)
    com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
    com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
    org.apache.el.parser.AstValue.getValue(AstValue.java:135)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UIOutput.getValue(UIOutput.java:174)
    javax.faces.component.UIInput.getValue(UIInput.java:291)
    org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:77)
    org.primefaces.component.inputmask.InputMaskRenderer.encodeMarkup(InputMaskRenderer.java:99)
    org.primefaces.component.inputmask.InputMaskRenderer.encodeEnd(InputMaskRenderer.java:57)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
    com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
    com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
  root cause
java.lang.ClassCastException: java.lang.String cannot be cast to
  org.springframework.security.core.userdetails.User
    managedBean.UsuarioFace.getUsu(UsuarioFace.java:45)
    managedBean.UsuarioFace.(UsuarioFace.java:34)
    managedBean.CadastroBean.(CadastroBean.java:31)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
  Source)   java.lang.reflect.Constructor.newInstance(Unknown Source)
    java.lang.Class.newInstance(Unknown Source)
    com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
    com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
    com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
    org.apache.el.parser.AstValue.getValue(AstValue.java:135)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UIOutput.getValue(UIOutput.java:174)
    javax.faces.component.UIInput.getValue(UIInput.java:291)
    org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:77)
    org.primefaces.component.inputmask.InputMaskRenderer.encodeMarkup(InputMaskRenderer.java:99)
    org.primefaces.component.inputmask.InputMaskRenderer.encodeEnd(InputMaskRenderer.java:57)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
    com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
    com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)

Descrevendo melhor: Minha aplicação já utiliza o Spring Framework e funciona normalmente, mas agora eu preciso criar uma página para que qualquer pessoa se cadastre. Então na configuração do Spring já coloquei a página como permitAll .
Mas acontece que quando eu acesso a página ele me retorna o erro descrito. Mas quando eu logo em um usuário qualquer já cadastrado, e tento acessar a página, o acesso ocorre normalmente.
Meus códigos são o seguinte:
cadastroUsuario.xhtml
<h:body>
    <h:form id="formCadastroUsuario">
        <h:panelGrid id="panelUsuario" columns="2"
            style="margin-bottom:10px">

            <h:outputLabel for="nascimento" value="Data Nascimento: " />

            <h:outputLabel for="pass" value="Senha" />

        </h:panelGrid>
</h:form>

cadastroBean.java (todos os getters e setters estão criados)
@ManagedBean(name="cadastroBean")
@SessionScoped
public class CadastroBean {

  private UsuarioDAO usuDAO = new UsuarioDAO();
  private Usuario usu;
  private Usuario novoUsuario = new Usuario();
  private String cpf;
  private Date dataNascimento;
  List<Usuario> listaUsuario = null;

  public String inserirProprioUsuario(){

    AlunoDAO alunoDAO = new AlunoDAO();
    System.out.println(cpf);
    System.out.println(dataNascimento);
    Aluno a = alunoDAO.buscaAlunoPorCpf(cpf);

    if (a != null){

        if(a.getDataNascimento().equals(getDataNascimento())) {

            if (usuDAO.getUsuarioPorMatricula(a.getMatricula()) == null){
                System.out.println("Não existe login com esse aluno");

                novoUsuario.setAluno(a);
                novoUsuario.setPassword(criptografarSenha(novoUsuario.getPassword()));

                usuDAO.inserirUsuario(novoUsuario);

                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso","Cadastro com sucesso: "+novoUsuario.getUsername());
                FacesContext.getCurrentInstance().addMessage(null, msg);

                listaUsuario = null;
                novoUsuario = new Usuario();
            }else{
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Aviso","Já existe um login cadastrado com essa matrícula.");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }else{
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Aviso","Não existe aluno cadastrado com esse CPF.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
    return "usuarios";
  }

security-app-context.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/security
                http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<global-method-security secured-annotations="enabled"
    jsr250-annotations="enabled" />
<http auto-config="true" use-expressions="true"
    access-denied-page="/negado.jsf">
    <intercept-url pattern="/login.jsf" access="permitAll" />
    <intercept-url pattern="/cadastroUsuario.jsf" access="permitAll" />
    <intercept-url pattern="/listaEditaisDisciplinas.jsf" access="isAuthenticated()" />
    <intercept-url pattern="/realizarInscricoes.jsf" access="isAuthenticated()" />
    <form-login login-page="/login.jsf" default-target-url="/realizarInscricoes.jsf"
        authentication-failure-url="/login.jsf" />
    <logout logout-success-url="/realizarInscricoes.jsf" />
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider>
        <password-encoder hash="sha-256"></password-encoder>
        <jdbc-user-service data-source-ref="dataSource"
            authorities-by-username-query="select username, tipoUsuario from usuario where username=?"
            users-by-username-query="SELECT username, password, ativo  FROM usuario WHERE username=?" />
    </authentication-provider>
</authentication-manager>

<beans:bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="url"
        value="jdbc:mysql://localhost:3306/monitoria" />
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="root" />
</beans:bean>

Como resolver?
Comment: Vou colocar o resto @falsarella
Comment: Estranho, pode mostrar um pouco mais da stack de erro?
Comment: @falsarella a internet caiu na hora que fui postar. Coloquei todo o stack.
Comment: O que eu não entendo, é que eu não uso o UsuarioFace em nenhum local, e ele dá erro nele.
Comment: Parece que você tem algum filtro configurado. Lá que o UsuarioFace é usado.
Answer: Salve!
Eu ainda não tenho reputação para fazer comentários, então vou tentar responder a sua pergunta baseado no que você postou.
Parece que o problema é no acesso ao org.springframework.security.core.userdetails.User, que é o usuário autenticado.

java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.security.core.userdetails.User managedBean.UsuarioFace.getUsu(UsuarioFace.java:45) managedBean.UsuarioFace.(UsuarioFace.java:34) managedBean.CadastroBean.(CadastroBean.java:31)

Funciona com usuários autenticados porque há uma referência válida de User no contexto. Como é um anônimo, é possível que essa referência ainda não exista. Você poderia postar a linha 45 da classe UsuarioFace.java? Daí eu posso ver como ocorre esse acesso/conversão.
Para acessar o usuário autenticado via contexto do Spring Security, normalmente eu faço algo similar à isso:
// AuthUtils
import org.springframework.security.core.Authentication;
(...)

public static Authentication getAuthenticationObject() {

    if ((SecurityContextHolder.getContext() == null)) {
        return null;
    }

    final Authentication authentication =
            SecurityContextHolder.getContext().getAuthentication();

    if (authentication == null || authentication.getPrincipal() == null) {
        return null;
    }

    return authentication;

}

// recuperação do usuário autenticado
public static ApostadorUserDetails apostadorAutenticado() {
    final Authentication auth = AuthUtils.getAuthenticationObject();

    if(auth != null && auth.getPrincipal() instanceof ApostadorUserDetails) {
        return (ApostadorUserDetails) auth.getPrincipal();
    } else {
        return ApostadorUserDetails.apostadorAnonimo((AnonymousAuthenticationToken) auth);
    }
}

ApostadorUserDetails é uma referência do meu domínio que implementa org.springframework.security.core.userdetails.UserDetails. O método estático apostadorAnonimo é uma implementação do Null Object Pattern. Dessa forma não ocorre NPE ou erros de conversão.
Veja se ajuda ou deixe um comentário com mais informações que eu edito a minha resposta.


How do you throw from outfield without injuries?

Question: Whenever fielding outside the 30 yard circle, a fielder have to make harder and faster throws(and every time I end up with a painful shoulder).
How to effectively throw the ball from outfield without shoulder pain/injuries?
Comment: While I don't have a good reference for it, it's also worth noting that cricket  has taken over a lot of the skills baseball outfielders have had for years for how to get the ball to home plate / the wicket quickly.
Answer: This site gives a description of throwing technique for a cricketer:
http://www.coachingcricketexcellence.co.uk/cricket-coaching-advice/catching-and-fielding/how-to-throw.shtml
It describes the side-on technique, where you point with your non-throwing arm towards your target and you then can use your weight to provide impetus to the ball.
For a different, front-on technique, have a look at https://www.youtube.com/watch?v=MCvtnyqG4MM


Consequence of ignoring the order of a categorical variable with different levels in logistic regression

Question: As the title suggests, I am hesitating on whether to use ordinal logistic regression or not. I don't think I have the time to understand that and to figure out how to work it out in R, so can I just ignore it? Will the consequences be serious (i.e. seriously under/over-estimate the effect size)?
Thanks.
Comment: Just to be clear, it is the outcome variable that's ordinal? What is the alternative to ordinal logistic regression you're considering? Multinomial logistic regression, or grouping the categories into two groups and using standard logistic regression?
Comment: Ah, in that case you can definitely ignore ordinal logistic regression, as that's for an ordinal *outcome* variable.
Comment: Would you still be interested in knowing how ordinal logistic regression work? It may have serious implications on model interpretation when you ignore the natural ordering of a variable.
Comment: @onestop, the independent variable is ordinal, but not the outcome variable, outcome variable is whether the patient gets an infection or not
Answer: If you need to quickly use an ordinal variable as an input, I recommend using it as a factor. The order of the factor is important for the interpretation of the results, but it's rather simple to reorder to the factor (using the factor command). The way the results are reported is the first group in the factor is held constant as the intercept and the coefficients for the subsequent groups are the difference between your reference group (the first item in the factor) and the other group. For example, if you three races coded, White, Black, and Asian. Since R does things alphabetically by default, Asian will become your reference group if you use "+factor(race)" which means you won't see a coefficient for Asian, but you will see a coefficient for Black and for White. These coefficients will be for the Difference between White and Asian and the Difference between Black and Asian.
An easy way to think of this is each level in the factor is treated as a binary variable. Each variable is assigned a coefficient, but the input is binary, meaning if your observation is Asian, Asian=1, Black=0, White=0, so it doesn't matter what the coefficients are for Black or White if your observation is Asian because any coefficient multiplied by zero will still be zero. Thus they're all mutually exclusive.
This also works for ordinal things, such as high, medium and low income. Depending on what your independent variable is and how the data was collected this may be completely suitable for your needs. It is important to note that this does not work well for hierarchical variables. If your input(s) are hierarchical in nature, I highly recommend using a nested mixed random effects model (lme4 package).
Comment: for "nested mixed random effects model", do you mean multi-level modelling? if I don't use this for hierarchical variable (my variable are some kind of risk index that higher the number, more risk the patient has, does it suit your case?)
Comment: Yes, nested models are hierarchical in nature. In the case of a variable representing degree (i.e. degree of risk), you do not need a hierarchical model. Depending on how the risk index you're using is divided, you may even want to consider grouping the levels on the index (i.e. if it's 1-9 consider grouping as high [7-9], medium [4-6], and low [1-3]) as this may allow you to better represent the dominance effect where those in the reference group represent a substantially different outcome than those in the comparisons.


Is it ok to have a function that returns an array of values to be looped by *ngFor loop?

Question: I have an array of items in my App component and a function that sorts them based on the category:
app.component.ts
 items = [
 { category: 1, type: 'book', price: '100' },
 { category: 2, type: 'electronics', price: '1000' },
 { category: 1, type: 'book', price: '100' },
];

getItemsByCategory(category:number){
  return this.items.filter(item=>item.category === category)
}

In my template I  display items using *ngFor:

  {{item.type}}

I've heard that because getItemsByCategory returns a new array of objects every time the template is rerendered, it can cause some issues. I understand that this function would execute multiple times, however, if it's very "cheap"  to run, I don't see any particular issues with that. Also,  I didn't encounter any bugs too while running it in stackblitz.
I'd appreciate if someone could provide more details regarding what bugs this implementation can be causing, and if it's an ok approach in general.
Comment: I deleted my comment. "why functions shouldn't be used in template";

I assumed you were probably aware after re-reading your post. Here are some articles that try to explain in detail

https://javascript.plainenglish.io/angular-dont-call-a-function-inside-the-template-anymore-e74ebf499bb8

https://medium.com/showpad-engineering/why-you-should-never-use-function-calls-in-angular-template-expressions-e1a50f9c0496#:~:text=To%20avoid%20issues%2C%20it%20is,pipe's%20input%20does%20not%20change
Comment: this is why I like signals in angular v17+ (developer preview v16) so much. It'd just be a computed signal
Answer: Unless you're using a non-default change detection strategy, the view is likely re-rendered quite frequently. Every time this happens, your function gets executed. It allocates space for a new array, which garbage collection will need to track and de-allocate later. Then it does the work of filtering the original array to fill the new array with values. With any reasonable number of values, that's not all that much extra work.
By default, *ngFor will always iterate over arrays on a re-render, so you're not adding work from that perspective. And since you're not creating new objects in your array (e.g. via map(item => ({...}))), Angular should still be able to use cached renderings of elements for each of those items.
When it comes to performance questions, consider questions like:

How fast is fast enough?
What is the cost of making the application faster?
What conditions might change to cause acceptable performance to become unacceptable.

In your case, it sounds like you're not noticing any slowness arising from the UI's need to regenerate that array: it's fast enough. Don't make your code needlessly complex to eke out an unnoticeable gain in performance.
That said, the code to make this work faster may not actually be much more complex. You could make the view reference a property that always has the current version of your model. When category or items change, you could update that property by calling your function. If category and items don't change (in your example, both are hard-coded), the code to do this might be simpler than the code you're using now.
And even though your site works fine now, consider what might change to make this more problematic. For example:

a developer may choose to add expensive logic into getItemsByCategory without realizing how often it gets called.
a very large number of items could be loaded
a user might try loading your page on a device with far less processing power than the ones you use for testing.
events could be added to the user interface which cause change detection (and therefore re-rendering) to happen far more often.

It's wise to consider all of these aspects when deciding whether it's worth the effort to avoid that little bit of extra work. As your application grows, many little, unnoticeable slow-downs can add up to become noticeable. But typically if you're making reasonable efforts to address the larger problems (loading too many items into the UI), you don't need to sweat the small stuff like this.
Answer: The main issue is when the functions are doing something resource-heavy or anything that might take a long time (like HTTP requests). In these cases, running the function for every change will cause a significant performance issue. But, for what you are doing, I think you'll be fine with calling a function.
If you want something a bit more robust, with stuff like memoization, you can implement your functionality as a custom pipe instead.
Answer: Noob, if you write in your function a simple
console.log("I'm here")

You see that "I'm here is executed several times. The reason is not that return always a new array (it's true, but it's, not at the moment, the problem).
Angular need check when a variable "change" to show the new value. When Angular find a function, should executed the function to know if there any change. Each time you "click" a button, "make a call",.. the function is executed. Yes it's not very expensive but
items = [
 { category: 1, type: 'book', price: '100' },
 { category: 2, type: 'electronics', price: '1000' },
 { category: 1, type: 'book', price: '100' },
];
itemsFiltered=this.getItemsByCategory(1)

Is less expensive.
The "problem of return a new array" can be happens when you have an "input" inside the loop of the .html: as Angular repaint, each time you key press, you loose the focus -but this happens if you not use track by with any array-