Quais as desvantagens de proteger uma cadeia de objetos de um nullPointerException usando o map do optional?

Question: Por exemplo:
public static void main(String[] args) {
    Cidade cidade = new Cidade();
    Estado estado = new Estado(cidade);
    Endereco endereco = new Endereco(estado);
    Loja loja = new Loja(endereco);

    String nomeCidade;

    //null-safe ifs
    if(loja != null) {
        Endereco endereco1 = loja.getEndereco();

        if(endereco1 != null) {
            Estado estado1 = endereco1.getEstado();

            if(estado1 != null) {
                Cidade cidade1 = estado1.getCidade();

                if(cidade1 != null) {
                   nomeCidade = cidade1.getNome();
                }
            }
        }
    }

    //null-safe optional

    Optional<Loja> lojaOptional = Optional.of(loja);

    nomeCidade = lojaOptional.map(Loja::getEndereco).map(Endereco::getEstado).map(Estado::getCidade).map(Cidade::getNome).orElse("SEM CIDADE CADASTRADA");
}

O objetivo é validar essa cadeia de objetos sem precisar de uma cadeia de ifs.
Comment: HelloWorld, foi intencional mesmo desmarcar a resposta do Maniero como a aceita, em favorecimento da minha?
Answer: A maior desvantagem que eu vejo é que não é muito legível.
Porém legibilidade tem a ver com com contexto. Se todo mundo fizer isso pode tornar-se normal.
Mas eu olho isso e não sei bem o que faz mesmo tendo quase 40 anos de experiência e conhecer bem o idioma funcional. Olhando com mais cuidado dá para entender, ou seja, não é legível. Parece abuso, e talvez por falta de ter um recurso mais simples na linguagem.
Outra desvantagem é a performance que é um pouco inferior, ainda que talvez não esteja precisando se preocupar com isso nesse caso.
Obviamente que tem a vantagem de ser mais curto assim.
Mas fico pensando se o correto é se o objeto que tem esses dados não deveria garantir que não fosse nulo. Nem sempre dá, mas em muitos casos não só dá como é o correto a ser feito.
A modelagem parece errada também.
Answer:
O que eu escrevo aqui primeiro vem de experiência que eu tenho na empresa e, depois, de absorver o que está escrita no artigo (em inglês) Usar Optional corretamente não é opcional, publicado na DZone.

Como o Maniero mesmo falou, uma desvantagem objetiva do uso do Optional para esse fim é que a performance é pior. A HotSpot tenta amortecer isso fazendo otimizações no uso do invokeDynamics, mas são só amortizações que não chegarão ao nível da versão "puramente imperativa". Ele demonstra uma razão subjetiva quanto a isso que devo concordar: a pessoa/o time precisa estar acostumada/acostumado a esse idioma.
Existem outras desvantagens objetivas no uso do Optional além da performance. A principal que eu vejo: não é fácil tratar a nulidade intermediária.
Enquanto que num mundo de ifs e elses é fácil determinar explicitamente onde ocorre cada mapeamento e como se comportar em casos de nulos, é uma tarefa árdua para se fazer com Optional.
Imagine que você deseja, por algum motivo, determinar quem foi o elemento nulo na cadeia. Com o jeito clássico de se programar ficaria algo assim:
    int saltosNulidade = -1; // -1 significa que não houve nulos
    if (loja != null) {
        Endereco endereco1 = loja.getEndereco();
        if (endereco1 != null) {
            Estado estado1 = endereco1.getEstado();
            if (estado1 != null) {
                Cidade cidade1 = estado1.getCidade();
                if (cidade1 != null) {
                   nomeCidade = cidade1.getNome();
                } else {
                  saltosNulidade = 3; // conseguiu dar 3 saltos, mas parou num nulo
                }
            } else {
              saltosNulidade = 2; // conseguiu dar 2 saltos, mas parou num nulo
            }
        } else {
          saltosNulidade = 1; // conseguiu dar 1 salto, mas parou num nulo
        }
    } else {
      saltosNulidade = 0; // deu nulo já no primeiro passo
    }

Infelizmente, não há maneira trivial de se tratar de maneiras distintas o caso contrário no Optional. Você consegue até tratar o caso de "saltos positivos", a lógica complementar ao quantos saltos se deu até a nulidade. Mas, mesmo assim, desperdiça o uso dos lambdas:
// só para permitir um closure com mudanças, já que o objeto no closure precisa ser
// efetivamente final, mas não seus campos
class IntIndirection {
  int x;
  IntIntidrection(int valorInicial) {
    x = valorInicial;
  }
}

// ...

//
<T, M> Operator<Function<T, M>> retornaMapIncremento(Function<T, M> mapeamento, IntIndirection saltos) {
  return orig -> {
    saltos.x += 1;
    return mapeamento.apply(orig);
  };
};

// ...

// para o caso de loja poder ser nulo também, usar o Optional.ofNullable
// .map(Estado::getCidade).map(Cidade::getNome).orElse("SEM CIDADE CADASTRADA")
Optional<Loja> lojaOptional = Optional.ofNullable(loja);

IntIndirection saltosNulidade = new IntIndirection(0);
lojaOptional.map(retornaMapIncremento(Loja::getEndereco, saltosNulidade))
  .map(retornaMapIncremento(Endereco::getEstado, saltosNulidade))
  .map(retornaMapIncremento(Estado::getCidade, saltosNulidade))
  .map(retornaMapIncremento(Cidade::getNome, saltosNulidade))
  .orElse("SEM CIDADE CADASTRADA");

Notou o esforço necessário para algo simples? E, como é o algoritmo de complemento, não é estritamente equivalente aquele apresentado anteriormente. O equivalente deste daqui seria o seguinte em versão imperativa:
int saltosNulidade = 0;
if (loja != null) {
  saltosNulidade++;
  Endereco endereco1 = loja.getEndereco();
  if (endereco1 != null) {
    saltosNulidade++;
    Estado estado1 = endereco1.getEstado();
    if (estado1 != null) {
      saltosNulidade++;
      Cidade cidade1 = estado1.getCidade();
      if(cidade1 != null) {
         saltosNulidade++;
         nomeCidade = cidade1.getNome();
      }
    }
  }
}

Entretanto, devo afirmar que a maior parte do "processamento em cadeia" que eu preciso fazer em códigos em produção não envolvem elses intermediários. Logo, apesar de essa ser uma desvantagem extrema no caso de uso que praticamente força o uso do tradicional if-else, ela não é extremamente comum.
Uma vantagem de se usar o mapeamento através do Optional é ficar one-line, com o caso de exceção explícito. Foi o que o Maniero pincelou em "tem a vantagem de ser mais curto assim", mas a melhoria estética aqui é um tanto além do "ficas mais curto". Fica mais direto também (claro, isso é algo subjetivo). Por exemplo, tirando este trecho de um código de produção:
lbRiscoValue.setText(Optional.of(cliente)
  .map(Cliente::getRisco)
  .map(Risco::getDsRisco)
  .orElse("Sem resultado"));

Nessa modelagem, o objeto cliente pode não ter o campo risco, já risco é garantido ter um dsRisco. Também é garantido a existência do cliente neste trecho do código.
O equivalente imperativo do acima, dadas essas restrições acima, é:
String textoLabel = "Sem resultado";
Risco r = cliente.getRisco();
if (r != null) {
  textoLabel = r.getDsRisco();
}

lbRiscoValue.setText(textoLabel);

ou então, alternativamente
String textoLabel = null;
Risco r = cliente.getRisco();
if (r != null) {
  textoLabel = r.getDsRisco();
}

lbRiscoValue.setText(textoLabel != null? textoLabel: "Sem resultado");

ou então, alternativamente
String textoLabel;
Risco r = cliente.getRisco();
if (r != null) {
  textoLabel = r.getDsRisco();
} else {
  textoLabel = "Sem resultado";
}

lbRiscoValue.setText(textoLabel);

Mais eficiente que a versão com Optional? Sim, com certeza. Mas a linha de código que reflete a ação desejada (lbRiscoValue.setText) é colocada como um detalhe com menos ênfase, enquanto que na versão com Optional isso fica mais evidente.
Antes de ter acesso ao Optional do Java 8, o projeto em que eu estava trabalhando usava Java 7, mas conseguimos usar lambda usando o Retrolambda. Para a maioria dos casos, não era necessário usar algo semelhante ao Optional, mas um mapeamento de um único nível (como o visto acima). Por isso, na época, criamos o Toolbox.getIfNotNull. A versão com essa função seria a seguinte:
lbRiscoValue.setText(Toolbox.getIfNotNull(cliente.getRisco(), Risco::getDsRisco, "Sem Resultado"));

Mais um exemplo um pouco menos trivial. Eu tenho um objeto do tipo Verba, que não pode ser instanciado. Mas ela conhece quais os tipos que ela pode ser e, dependendo de seu tipo, ela pode sofrer uma conversão implícita através de seus próprios métodos. Por exemplo, Verba.asVerbaFinanceira(), retorna um Optional<VerbaFinanceira> preenchido se, por acaso, a Verba for realmente uma VerbaFinanceira. Se não for o caso, retorna um Optional.empty(). Pode acontecer de uma VerbaFinanceira causar um tipo de pendência específico. É assim que ficou o código:
return Optional.ofNullable(verba).flatMap(Verba::asVerbaFinanceira)
    .map(VerbaFinanceira::getTipoBlocPedidoSit)
    .map(TipoBlocPedidoSit::getCdTipoBloc)
    .map(TipoPedidoPendente::getTipoPedidoPendenteFromMnemonico)
    .orElse(null);

O equivalente interativa disso seria (vamos imaginar que exista o método isVerbaFinanceira() que retorna false quando o asVerbaFinanceira() retorna um Optional.empty() e true para o caso contrário):
TipoPedidoPendente tpp = null;
if (verba != null) {
  if (verba.isVerbaFinanceira()) {
    VerbaFinanceira vf = (VerbaFinanceira) verba;
    TipoBlocPedidoSit tbps = vf.getTipoBlocPedidoSit();
    if (tbps != null) {
      Integer cdTipoBloc = tbps.getCdTipoBloc();
      if (cdTipoBloc != null) {
        tpp = TipoPedidoPendente.getTipoPedidoPendenteFromMnemonico(cdTipoBloc);
      }
    }
  }
}
return tpp;

Note que o valor default (no caso null) é inicializado em tpp logo no começo. Se  tivesse outro valor para indicar esse padrão, iniciar tpp com esse outro valor seria um erro. Por sinal, exatamente por conta desse erro que eu não coloquei o return dentro do nível mais aninhado dos ifs. Se existisse outro valor a ser retornado (suponha que seja a constante TipoPedidoPendente.ALGO), os códigos seriam os seguintes:
return Optional.ofNullable(verba).flatMap(Verba::asVerbaFinanceira)
    .map(VerbaFinanceira::getTipoBlocPedidoSit)
    .map(TipoBlocPedidoSit::getCdTipoBloc)
    .map(TipoPedidoPendente::getTipoPedidoPendenteFromMnemonico)
    .orElse(TipoPedidoPendente.ALGO);

TipoPedidoPendente tpp = null;
if (verba != null) {
  if (verba.isVerbaFinanceira()) {
    VerbaFinanceira vf = (VerbaFinanceira) verba;
    TipoBlocPedidoSit tbps = vf.getTipoBlocPedidoSit();
    if (tbps != null) {
      Integer cdTipoBloc = tbps.getCdTipoBloc();
      if (cdTipoBloc != null) {
        tpp = TipoPedidoPendente.getTipoPedidoPendenteFromMnemonico(cdTipoBloc);
      }
    }
  }
}
return tpp != null? tpp: TipoPedidoPendente.ALGO;

Existem outros usos para o Optional além do "proteger contra NPE", que é o citado na pergunta. Só irei pincelar um pouco sobre um desses outros usos, sem entrar em muitos detalhes: processamento em uma função de um valor não nulo.
Por exemplo, eu preciso que seja preenchido, em um componente visual, quais são os elementos selecionados de uma lista. Por acaso, essa tela, na modelagem em que ela foi criada, recebe como argumento o objeto a ser modificado (se for uma atualização do objeto) ou nulo (novo objeto). O objeto em questão é o usuarioAlcadaAprovacaoDTO.

Por questões de otimizações no GWT, tempo de startup e dificuldade em separar em menores módulos GWT do projeto, muito do preenchimento dos objetos na tela se faz através do que chamamos informalmente de Tripleta, que consiste de um código, um texto e um classificador, esse classificador usado para diminuir quantidade de chamadas ajax via GWT-RPC, permitindo uma multiplexação dos resultados

Para mapear desse objeto até quem deve ser preenchido, faço o seguinte:
Optional.ofNullable(this.usuarioAlcadaAprovacaoDTO)
  .map(UsuarioAlcadaAprovacaoDTO::getUsuarios)
  .map(usuarios -> usuarios.stream().map(p -> new Tripleta(p, Constantes.USUARIO_SISTEMA)).collect(Collectors.toList()))
  .ifPresent(usuariosSelect::setSelectedValues);

Note que eu só preencho o valor em usuariosSelect se o objeto for de atualização, se ele tiver preenchido quais usuários devo preencher e ainda apenas após o mapeamento de Usuario para Tripleta. Supostamente, como getUsuarios retorna uma coleção, deveria ser garantido que essa coleção não é nula, no máximo vazia. De toda sorte, fica claro a quem está acostumado com esse idioma que o foco é chamar usuariosSelect.setSelectedValues(usuarios), todo o resto anterior é apenas o modo para fazer essa chamada.
O equivalente sem Optional (nem Stream, nesse caso) disso seria:
if (this.usuarioAlcadaAprovacaoDTO != null) {
  List<Usuario> usuarios = this.usuarioAlcadaAprovacaoDTO.getUsuarios();

  // vou assumir que não é nulo por questões de razoabilidade
  ArrayList<Tripleta> usuariosAsTripletas = new ArrayList<>();
  for (Usuario usuario: usuarios) {
    usuariosAsTripletas.add(new Tripleta(usuario, Constantes.USUARIO_SISTEMA));
  }
  usuariosSelect.setSelectedValues(usuariosAsTripletas);
}

Para quem está acostumado com esse idioma, fica claro que o foco é chamar usuariosSelect.setSelectedValues.
Uma outra vantagem é o else do ifPresentOrElse (Java 9, que o GWT não suportava mas que eu fiz um amplo backport). Nele, você faz todos os mapeamentos necessários e, então, toma uma de duas ações disponíveis:

se houver valor mapeado no final
na ausência de valor no final

Peguemos o caso:
lbRiscoValue.setText(Optional.of(cliente)
  .map(Cliente::getRisco)
  .map(Risco::getDsRisco)
  .orElse("Sem resultado"));

Para tratar a ausência de valor no final, poderia fazer o seguinte:
Optional.of(cliente)
  .map(Cliente::getRisco)
  .map(Risco::getDsRisco)
  .ifPresentOrElse(
      lbRiscoValue::setText,
      () -> showToast("Sem risco associado ao cliente")
  );

O equivalente imperativo seria algo assim:
String text = null;
Risco r = cliente.getRisco();

if (r != null) {
  text = r.getDsRisco();
}

if (text != null) {
  lbRiscoValue.setText(text);
} else {
  showToast("Sem risco associado ao cliente");
}


Linear recurrence by characteristic equation.

Question: Consider the linear recurrence $a_n = 2a_{n−1} − a_{n−2}$ with initial
conditions $a_1 = 3, a_0 = 0$. We have
$x^2 − 2x + 1 = (x − 1)^2$.
Thus $ x = 1$ and $a_n$ = $u(1)^n + v(1)^n$.
Why do we get $a_n = u + nv$ instead of $a_n = u + v$ since $1^n = 1$?
Comment: When you have repeated roots (multiplicity more than $1$), the form of the generic solution changes. Check http://math.stackexchange.com/questions/129849/linear-homogeneous-recurrence-relations-with-repeated-roots-motivation-behind-l
Comment: it must be $a_n=A+nB$
Answer: $x=1$ is a repeated root of your characteristic equation, so the general solution is $$a_n=u\cdot(1)^n+v\cdot n(1)^n=u+nv.$$
Applying the initial conditions,
$$
a_0=u+0 \cdot v=0\implies u=0 \quad\text{ and }\quad a_1=u+1\cdot v=3\implies v=3
$$
so the solution is $a_n=3n$, $n=0,1,2,\dots$


how do I change the fontsize in custom_radio_grouped_button package on flutter?

Question: how do I change the fontsize in custom_radio_grouped_button package on flutter?
package:
https://pub.dev/packages/custom_radio_grouped_button#-readme-tab-

  Widget _selectDayBar() {
    return CustomCheckBoxGroup(
      buttonColor: Theme.of(context).canvasColor,
      buttonLables: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
      buttonValuesList: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
      checkBoxButtonValues: (values) => print(values),
      defaultSelected: "Mon",
      horizontal: false,
      hight: 100,
      width: 50,
      selectedColor: Theme.of(context).buttonColor,
      // padding: 10,
      customShape: CircleBorder(
        // borderRadius: new BorderRadius.circular(18.0),
        side: BorderSide(color: Theme.of(context).buttonColor)
      ),
      enableShape: true,
    );
  }

Answer: You can customise package according to your requirements.
You can hold ctrl(command) key and click on widget, which take you to the implementation of widget. Now find out Text widget in it and change size (default size in this package is 15) according to your requirements.
Moreover, if you want to add fontSize property then you can also add this in package. i only suggest to do this if you want to change font size more than once in same project.
Make sure that you do full restart your app because it does not reflect in hot reload.
Comment: Yes, I did tried this but it didn't work. It works after I restart the app. I didn't know I need to restart it. thanks!
Comment: Yes, you require full restart to reflect the change. Accept the answer if you got your desire rest.
Answer: It's very simple. Simply go to that package and copy the source code into your own source code and change values as you wish.
Here is the full source code of CustomCheckBoxGroup


DSC, having a simple script executed on a target node

Question: I've create a simple MOF file:
Configuration ConfigName
{

  Node NB05
  {
    File ResName
  {
}

Edit 1
This is not a mof file, but a file that has to be compiled into a mof file. This will be the focus on another question since this question applies nevertheless.
And I tried to apply it with the command:
PS C:\var\DSC> Start-DscConfiguration

Cmdlet Start-DscConfiguration at position 1 in the command pipeline
Please specify values for the follwing parameters:
Path: .\Configurations

Id     Name            PSJobTypeName   State         HasMoreData    Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            Configuratio... Running       True            c1                   Start-DscConfiguration

Questions

It says "runnning" but how can I determine that it has finished?
Even if I make a mistake in the config file, say that i write NNNode, it doesn't give an error at all, but says "Running" as well. How is it supposed to work?
Answer: The other cmdlets associated with this cmdlet are located here:
https://msdn.microsoft.com/powershell/reference/5.1/PSDesiredStateConfiguration/Start-DscConfiguration?f=255&MSPPError=-2147217396
Get-DscConfiguration
Get-DscConfigurationStatus
Restore-DscConfiguration
Stop-DscConfiguration
Test-DscConfiguration
Update-DscConfiguration
This cmdlet by default runs as a job. This will run in the background. If you want it to run interactively, use the -wait parameter.
start-dscconfiguration -path "c:\example\configurations" -wait

To view further information about the job use:
    get-job -name job1

The job will run periodically to keep the desired state of the system.
Hope this helps.
Thanks, Tim.


How to determine similarity between histograms? (Which metric to use?!)

Question: Hello Stack Exchange community,
I'm relatively confused on what to do in this scenario. I am running an experiment that retrieves data of interest and stores it as an array. Experimental conditions are slightly different, and for my specific application, it is important to measure heterogeneity of my data. I was asked to use a distance metric for my 2D histograms generated post data analysis.
However, there are a wide array of options available after doing a literature search. There is the "Earth Mover's Distance", the Jensen-Shannon metric (the square root of the Jesen-Shannon divergence value), Bhattacharyya distance, Minkowski distance, etc.
I understand that these distances are defined differently, quantitatively speaking, and thus have difference implications, but for my example, what seems to be an efficient metric at quantifying differences in histograms (i.e, getting to the end goal of assessing heterogeneity)?
Thank you
Answer: There are two other metrics that reportedly work well with histograms:

Chi-square distance
$ \chi^2 (x,y)=\frac{1}{2} \sum _{i=1} ^{d} \frac {(x_i - y_i)^2} {x_i+y_i}$
Histogram intersection kernel (similarity)
$k(x,y)=\sum _{i=1} ^{d} \min (x_i,y_i)$

I used these in my PhD thesis for image-based localization indoors. The image descriptors were essentially histograms and these two measures were found to be useful.
Comment: I am interested in looking at differences in data distribution for another problem - a deep learning model on imagery in my case. I want to see how the distribution of pixel values of the data used to train the model differs from the data the model is being applied to. in trying to find the best way to do so i stumbled upon your answer. this led me to trying to figure out what image localization is, to see if these metrics could be applied in my case. i found a paper, but am still unsure exactly what IL is and how these metrics helped you. could you expand on this and IL in general? Thanks!
Comment: the main problem i am seeing for me is that these two datasets - the training set and the applied set - have a different number of pixels/values. so it seems that neither of these metrics would work as is


How I can store values in Array

Question: Here is the sample in which the code is working but I wan something different.
/** @var array */
    private  $LoadYear = [
       '2018', '2019', '2020', '2021', '2022'
    ];

What I want is I want to store dates Dynamically Which means the dates should be two past year date and current year and one up coming year.
I was trying like this. But this is not working

$Years =date(Y);
/** @var array */
    private  $validYears = [
       $Years-3, $Years-2, $Years-1, $Years, $Years+1,
    ];

Comment: It's because `date(Y)` throws error. Turn error reporting. It should be `(int)date('Y')`
Comment: An example would be very helpful.
Comment: What have you tried so far? Where are you stuck? Through debugging the existing code, it should not be too hard to spot the problem
Answer: From the docs:

They are defined by using one of the keywords public, protected, or private, optionally, as of PHP 7.4, followed by a type declaration, followed by a normal variable declaration. This declaration may include an initialization, but this initialization must be a constant value.

*emphasis by me

This means, you need to initialize the property from somewhere else. For example the constructor of the class in question. E.g.:
class Example
{
    private array $validYears;

    public function __construct()
    {
        $Years = date('Y');

        $this->validYears = [
            $Years - 3, $Years - 2, $Years - 1, $Years, $Years + 1,
        ];
    }
}

How I can store values in Array


cannot sending email to several mail address

Question: i have domain jatek.com
i have two connection to different ISP and have public IP in each ISP
router failover fature is off.
jatek.com. is pointed to ip 184.108.40.206 so is www.jatek.com (ISP A)
mx is pointed to 18.104.22.168 (ISP B)
everything works fine, until when i send an email to @cigna.com, the mail is bouncing with error message :
There was a SMTP communication problem with the recipient's email server.  Please contact your system administrator.
can anyone help me please..
thanks.
Answer: If I understand correctly cigna.com is not under your control. So this means the smtp server of cigna.com is malconfigured or not reachable. There is nothing you can do, as it is out of your reach.
Comment: to further complicate things. if re-route this email to our a smarthost (relay server of our isp) it gets delivered. And if i send email to cigna.com from a different domain it works? Our IP is not listed in any blacklist database either.


Trend in exogenous variable in time series

Question: I have a time series of a variable V1 with seasonality and a strong trend. The trend however seems to be closely related to (and caused by) the trend of another time varying variable (V2). As V2 grows i.e shows a positive trend, the trend on V1 declines (see chart).

I want to use V2 as an exogenous variable in the time series forecast of V1. I am using prophet for this where I forecast V2 and then use it as an exogenous variable to forecast V1. But, since V2 has a trend that affects the trend of V1 does it make sense to use V2 as an exogenous variable at all? I can simply run a forecast with and without the exogenous variable to see what difference it makes. It might not be much, but I am more interested in knowing if there is a fundamental flaw in using exogenous variables with trends.
The question is similar to this one, but it was not very clear to me.
Answer: Lets say you want to predict $y_t$ based on its past $y_{0},y_{1},...,y_{t-1}$, as well as based on exogenous variable $x_t$. Models such as the additive Prophet model treat $x_t$ as independent over time. Hence, Prophet will not notice a trend in the process $\{x_0,x_1,...,x_t\}$ because it only looks at $x_t$ and then immediately forgets $x_t$ (see here)
However, this does not mean that you cannot use $x_t$ to predict $y_t$. If $x_t$ is a good external regressor for $y_t$, then there must exist some function $f$ such that $f(x_t)\approx y_t$. This does not change if there is a trend in $\{x_0,x_1,...,x_t\}$. For example, if your exogenous variable is actually a straight line with slope $k_1$ and y-intercept $d_1$, and your target variable is a straight line with slope $k_2$ and y-intercept $d_2$, then the solution is $f(x_t)=\frac{k_2}{k_1}(x_t-d_1)+d_2=y_t$. Since Prophet treats all external variables as linear regressors, it can solve this particular problem.
For the data you posted, I do not think that there is a linear function from the exogenous variable to the target variable. So Prophet should not be able to learn this exactly - in fact, it cannot be more exact than the best linear function from $x_0,...,x_t$ to $y_0,...,y_t$.


How can i use TLS with IOT IBM?

Question: I have already worked with IOT MQTT protocol but now i want to work with IBM IOT MQTT with TLS and i want to publish and subscribe messages using python 3.7 and paho-mqtt library please guide me.
Answer: Use the libraries from here: https://ibm-watson-iot.github.io/iot-python/
The connection is secured with TLS by default by the libs.

How can i use TLS with IOT IBM?


Go to page section after redirect

Question: I wanted to provide feature where non-logged in users can click on "Rate" button, which will lead them to login and after login they come back to the page. Upto this, it is working fine.
But I want user's to go to particular section of page, div with id = "id1".
How can I achieve this?
-- Many thanks for your time.
This is what I have tried:
$destination = drupal_get_destination();

$options = array( 'query' => $destination,'fragment'=>'div_id');

print l('Review', 'content/login', $options);

Answer: This works for me...
$destination = drupal_get_destination();
$destination['destination'] .= '#div_id';
$options = array( 'query' => $destination);
print l('Review', 'content/login', $options);

Comment: No I setting just redirect url with fragment in it. This is my code:                          $destination = drupal_get_destination();
$options = array( 'query' =>   $destination,'fragment'=>'tabs-0-region_');
print l('Review', 'content/login', $options);
Comment: Edited question
Comment: Hmmm try adding it to the `$destination` variable, something like `$destination['path'] .= '#div_id';`
Comment: No luck, it didn't work.
Comment: Oops wrong array key, please see the updated answer
Comment: Actually, it replaced destination URl with #div_id only, and not working.
Comment: That code outputs: `Review` which works perfectly for me...
Comment: Yes it is working. Actually, I don't notice concatenation. I was assigning.
Comment: Glad to help  :)

Go to page section after redirect


Criando aplicação player de música com JLayer

Question: Estou tentando criar uma aplicação Java que receba uma música através de JFileChooser e adicione essa música em uma lista (ArrayList<File>).
Porém ao acessar o arquivo array.getindex(0).getPath(), o sistema lança um NullPointerException.
Aqui está o código:
package br.lp2.view;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.ArrayList;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.*;

import br.lp2.player.*;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
import javazoom.jl.player.advanced.AdvancedPlayer;
import br.lp2.main.*;

@SuppressWarnings({ "serial", "unused" })
public class GUI extends JFrame {

    JFileChooser jfile;
    Component parent = null;
    //private Player ply;

    // Dimensoes da tela principal
    private int ALTURA = 300;
    private int LARGURA = 500;

    //Player
    File p1Player;
    ArrayList<File> arrayMusic = new ArrayList<File>();
    private Player pl = null;

    // Janela de cadastro de usuario
    private CadastroUsuario cadastroUsuario = new CadastroUsuario();

    // Menu bar
    private JMenuBar menuBar = new JMenuBar();
    // Menus
    private JMenu menuMusicas = new JMenu("Musicas");
    private JMenu menuPlaylists = new JMenu("Playlists");
    private JMenu menuUsuarios = new JMenu("Usuarios");
    // Menu items
    private JMenuItem adicionarMusica = new JMenuItem("Adicionar musica");
    private JMenuItem removerMusica = new JMenuItem("Remover musica");
    private JMenuItem verMusicas = new JMenuItem("Ver lista de musicas");
    private JMenuItem verPlaylists = new JMenuItem("Ver playlists");
    private JMenuItem criarPlaylist = new JMenuItem("Criar playlist");
    private JMenuItem removerPlaylist = new JMenuItem("Remover playlist");
    private JMenuItem verUsuarios = new JMenuItem("Ver lista de usuarios");
    private JMenuItem adicionarUsuario = new JMenuItem("Cadastrar        usuarios");
    private JMenuItem removerUsuario = new JMenuItem("Remover usuario");

    // Botoes
    private JButton play = new JButton("Play");
    private JButton pause = new JButton("Pause");
    private JButton proximaMusica = new JButton(">>");
    private JButton anteriorMusica = new JButton("<<");

    public GUI() {
        jfile = new JFileChooser();

        // Configuracoes padrao
        setTitle("Player de musica");
        setSize(LARGURA, ALTURA);
        setLayout(null);
        setVisible(true);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Adicionando menu
        menuBar.add(menuMusicas);
        menuBar.add(menuPlaylists);
        menuBar.add(menuUsuarios);
        // Adicionando itens aos menus
        menuMusicas.add(verMusicas);
        menuMusicas.add(adicionarMusica);
        menuMusicas.add(removerMusica);
        menuPlaylists.add(verPlaylists);
        menuPlaylists.add(criarPlaylist);
        menuPlaylists.add(removerPlaylist);
        menuUsuarios.add(verUsuarios);
        menuUsuarios.add(adicionarUsuario);
        menuUsuarios.add(removerUsuario);
        // Setando menubar
        setJMenuBar(menuBar);

        // Adicionando botoes
        add(play);
         add(pause);
        add(proximaMusica);
        add(anteriorMusica);
        // Setando posicao dos botoes
        play.setBounds(70, ALTURA - 90, 100, 30);
        pause.setBounds(180, ALTURA - 90, 100, 30);
        proximaMusica.setBounds(290, ALTURA - 90, 50, 30);
    anteriorMusica.setBounds(10, ALTURA - 90, 50, 30);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pause.setEnabled(false);
    // Login inicial
    // Login login = new Login();

    // Eventos
    adicionarMusica.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            jfile.showOpenDialog(parent);
            p1Player = jfile.getSelectedFile();
            try{
                arrayMusic.add(p1Player);
            }catch (NullPointerException ex){
                System.out.println(ex.getMessage());
                System.out.println(ex.getStackTrace());
            }
        }
    });

    play.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            pause.setEnabled(true);
            play.setEnabled(false);
            Music msc = new Music();
            msc.start();

        }
    });
    pause.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            play.setEnabled(true);
        }
    });

    adicionarUsuario.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            cadastroUsuario.setVisible(true);
        }
    });
}

/*class Music extends Thread implements Runnable{
    public void run(File file_t) throws FileNotFoundException{
        System.out.println("chegou aqui");
        FileInputStream input = new FileInputStream(file_t);
        PlayerFile ply = new PlayerFile(file_t);
        Thread playing = new Thread((Runnable) ply);
        playing.run();
    }
}*/
class Music extends Thread{
    public void run(){
        try {
        System.out.println("chegou aqui222");
        //System.out.println("CAMINHO " + arrayMusic.get(0).getPath());
        InputStream teste = this.getClass().getResourceAsStream("C:/Users/pedrohbcavalcante/Downloads/ateste.mp3");
        //System.out.println("GETPATH() " + file.getPath() + " GETABSOLUTPATH() "+ file.getAbsolutePath());
            pl = new Player(teste);
            pl.play();
        } catch (JavaLayerException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}
}

Me resultou no seguinte stacktrace:
Exception in thread "Thread-3" java.lang.NullPointerException: in
    at javazoom.jl.decoder.Bitstream.<init>(Unknown Source)
    at javazoom.jl.player.Player.<init>(Unknown Source)
    at javazoom.jl.player.Player.<init>(Unknown Source)
    at br.lp2.view.GUI$Music.run(GUI.java:174)

Comment: Olá PEdro, você poderia editar a pergunta e incluir o stack trace? Também seria interessante simplificar o seu exemplo (veja que outros usuários não possuem classes como `CadastroUsuario`, ficando difícil rodar o seu codigo para tentar reproduzir o problema).
Comment: Olá Anthony, fiz uma alteração para chamar a classe Music atraves do .start() e me resultou nos stack que está no edit. Se tratando da classe CadastroUsuario, ela é só outra parte do projeto onde é mais ligada ao view. é só algo de comentar, como já está aí. Obrigado pela ajuda :)
Answer: O NullPointerException está vindo do construtor da classe Bitstream. Ou seja, daqui.
De acordo com o código-fonte da classe BitStream:

    public Bitstream (InputStream in) {
        if (in == null) throw new NullPointerException("in");

Ou seja, o parâmetro in passado ao construtor era nulo.
Subindo no stacktrace temos o construtor da classe Player. Essa classe não existe mais na versão mais atual do JLayer-gdx. Entretanto, ao olhar na versão anterior, essa classe existia. Olhando no código do commit onde foi removido, temos isso:
public Player(InputStream stream) throws JavaLayerException
{
    this(stream, null);
}

public Player(InputStream stream, AudioDevice device) throws JavaLayerException
{
    bitstream = new Bitstream(stream);

Ou seja, o parâmetro stream era nulo.
Subindo mais no stacktrace, chegamos nessa linha do seu código:
            pl = new Player(teste);

Ou seja, teste era nulo. Essa variável tem seu valor atribuído aqui:
        InputStream teste = this.getClass().getResourceAsStream("C:/Users/pedrohbcavalcante/Downloads/ateste.mp3");

E isso está errado! O getResourceAsStream(...) retorna nulo quando não encontra o recurso procurado.
Por que ele não achou o recurso? Porque o método getResourceAsStream(...) serve para procurar recursos dentro do arquivo JAR (ou WAR ou EAR) que contém a sua aplicação. Porém, este não é o seu caso, o recurso não está dentro do JAR, e sim diretamente no sistema de arquivos.
A solução seria usar algo assim:
        InputStream teste = new FileInputStream("C:/Users/pedrohbcavalcante/Downloads/ateste.mp3");

Ao usar o FileInputStream, o recurso será procurado dentro do sistema de arquivos. O compilador vai reclamar que faltaria um IOException, que é o que é lançado se ocrrer um erro ao tentar localizar o arquivo (possivelmente FileNotFoundException, que é subclasse de IOException, para o caso de o arquivo não existir). Assim sendo, coloque mais um catch para o IOException.


O que é 'binding time' no contexto de desenvolvimento?

Question: No estudo de qualidade de software me deparei com esse termo 'binding time' (Tempo de ligação) e fiquei um tanto quanto perdido no conceito. Então, o que exatamente é?
Comment: https://en.m.wikibooks.org/wiki/Introduction_to_Programming_Languages/Binding pode ser uma boa leitura
Answer: Para entender o que é Binding time, podemos começar pelo o que significa Binding.
O termo Binding neste contexto é o ato de fazer uma associação, seja de um atributo, símbolo, entidade ou uma operação.
O termo Binding Time é quando isto irá ocorrer. Os momentos que existem para isto são vários:

em tempo de programação: quando o programador escrever o código
em tempo de compilação: quando o compilador cria o arquivo de execução (.class no Java, .dll no C#, etc).
em tempo de carregamento: quando o sistema operacional inicia o programa. Uma variável estática pode ficar limitada a um espaço na memória.
em tempo de execução: quando o programa está rodando. O bind ocorre com uma variável local não estática em um espaço na memória.

Algumas das explicações acima podem ser válidas apenas para algumas linguagens. Outros autores preferem desconsiderar alguns deles ou adicionar outros. Mas o objetivo aqui é passar o conceito.
As maiorias das decisões de binding time estão relacionadas as variáveis, que possuem diversas propriedades: nome, escopo, tipo, local na memória e valor. Todas elas podem ser determinadas em tempo de compilação ou execução.
Abaixo vou apresentar um exemplo bem simples mostrando a diferença de binding time em tempo de programação e tempo de execução.
Considere que deseja printar um valor na tela. No Java, podemos fazer:
String valor = "Alô Mundo";
System.out.println(valor);

No exemplo acima, o valor é sempre Alô Mundo e foi decidido pelo programador. Ou seja, é um binding time em tempo de programação.
Porém, se o código for alterado para receber este valor do usuário:
Scanner scanner = new Scanner(System.in);
String valor = scanner.nextLine();
System.out.println(valor);

O binding time passa a ser por tempo de execução, pois só sera possível saber o valor da variável durante a execução do programa.


drush make on local gitweb raw url

Question: I moved a git repo from github to local gitweb and want to access the raw build make file
http://git.mycompany.com/?p=workflow.git;a=blob_plain;f=build-workflow.make;h=170f5329b413bea0efb1ec33bebdc1549403cc3e;hb=HEAD
opening that url in browser is fine:   raw code same as in github
But drush make complains about missing core and api entries.
So I checked with wget and it saves a `index.html?p=workflow.git' which is a complete html page.
How is that supposed to work on gitweb ??
Answer: So I found the solution : the shell is interpreting the semicolons and cuts the URL so it has to be quoted. Here for example http://sourceforge.net/apps/trac/sourceforge/ticket/9358 it is explained.
my drush cmd should be:
<code>drush make "http://git.mycompany.de/?p=workflow.git;a=blob_plain;f=build-workflow.make;h=170f5329b413bea0efb1ec33bebdc1549403cc3e;hb=HEAD"
</code>

drush make on local gitweb raw url


Iterating through an arralist - java

Question: public void display(detailTom tomData)
{
   ArrayList<detailTom> temp = new ArrayList<detailTom>();

  for (int i=0;i<tomData.toString().length();i++)
  {
      temp=tomData[i];
      System.out.println(temp.getMark1());
  }

}

Hello all,
I am trying to iterate through an arraylist tomData which is an object arraylist. I am trying to iterate through the list and display the variable of the object "Mark1".
The error is get is "Array required but detailTom found"
any ideas? Or any other way of iterating through tomData?
Comment: What do you think `tomData[i];` does and why?
Comment: And why are you using the length of some string representation of `tomData` to work out how far to iterate? And where do you think the `getMark1` method is declared? (Hint: it's not on `ArrayList`...)
Comment: You defined `tomdata` as a `detailTom` which is not an array, so you can't access it as if it were an array.
Comment: Basically, think about the types of *all* these expressions. (And ideally name your classes in `PascalCase` too...)
Comment: the main object of tomData[i] is to pass the object to temp so that temp can display the value
Comment: None of the lines of code make any sense (except the ones with `}`)  You can't program based on what you meant the code to do.  Can you show us what code you have which compiles at least.
Comment: You have defined `temp` as an ArrayList and ArrayList doesn't have a method called `getMark1()`.  `temp` doesn't appear to have any purpose.
Comment: public void display(detailTom tomData) is a method to display the contents of tomData which is an arraylist of objects of class detailTom
Comment: detailTom is a class which has variables and getters and setters
Comment: In which case, surely you want the signature to be `public void display(List tomData)`, since `tomData` is a `List` of instances of class `detailTom`?
Comment: let me try that Edd - thx
Answer: What you've provided doesn't really make sense, but based on the comments I'm guessing the answer you're looking for is something like the following:
public void display(List<DetailTom> tomData) {
    for (DetailTom detail : tomData) {
        System.out.println(detail.getMk1());
    }
}

I've renamed your class from detailTom to DetailTom as is the convention in Java:

Names of class types should be descriptive nouns or noun phrases, not overly long, in mixed case with the first letter of each word capitalized.
Comment: thanks Edd - that worked. The problem I had with my code is as follows:-
Comment: My method was declared initially as - public void display(detailTom tomData). I should have declared it as public void display(ArrayList tomData)

Iterating through an arralist - java


hook_views_data join table on multiple columns

Question: I have 3 tables lms_user, lms_answer_initial and lms_model_answer and need to join them to display a view on certain columns.
I can successfully join the first 2 tables (lms_user, lms_answer_initial ) by using 'relationship'
$data['lms_answer_initial']['uid'] = array(
    'title' => t('Drupal user ID'),
    'help' => t('The Drupal user ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'relationship' => array(
      'title' => t('User(LMS)'),
      'help' => t('Relate content to the LMS user.'),
      'base' => 'lms_user',
      'base field' => 'uid',
      'label' => t('user'),
      'handler' => 'views_handler_relationship',
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_equality',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument',
    ),
  );

but I has no idea how to join the third table on 3 columns.
Here is my complete code in hook_views_data:
$data['lms_answer_initial']['table']['group'] = t('LMS Answer Initial');
$data['lms_answer_initial']['table']['base'] = array(
    'title' => t('Answers (Report)'),
    'help' => t('Answers for the Learning Management System.'),
    'weight' => -10,
  );
$data['lms_answer_initial']['table']['join'] = array(
    'lms_model_answer' => array(
        'left_table' => 'lms_model_answer',
        'left_field' => 'fid',
        'table' => 'lms_answer_initial',
        'field' => 'fid',
    ),
);

  $data['lms_answer_initial']['uid'] = array(
    'title' => t('Drupal user ID'),
    'help' => t('The Drupal user ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'relationship' => array(
      'title' => t('User(LMS)'),
      'help' => t('Relate content to the LMS user.'),
      'base' => 'lms_user',
      'base field' => 'uid',
      'label' => t('user'),
      'handler' => 'views_handler_relationship',
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_equality',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument',
    ),
  );
  $data['lms_answer_initial']['fid'] = array(
    'title' => t('File ID'),
    'help' => t('EPUB File ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'relationship' => array(
      'title' => t('LMS Model Answer'),
      'help' => t('Relate activity model answer.'),
      'handler' => 'views_handler_relationship',
      'base' => 'lms_model_answer',
      'base field' => 'fid',
      'label' => t('model answer'),
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_equality',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument',
    ),
  );
  $data['lms_answer_initial']['book_id'] = array(
    'title' => t('Book ID'),
    'help' => t('The book ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );
  $data['lms_answer_initial']['unit_id'] = array(
    'title' => t('Unit ID'),
    'help' => t('The unit ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );
  $data['lms_answer_initial']['activity_id'] = array(
    'title' => t('Activity ID'),
    'help' => t('The activity ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'relationship' => array(
      'title' => t('LMS Model Answer'),
      'help' => t('Relate activity model answer.'),
      'handler' => 'views_handler_relationship',
      'base' => 'lms_model_answer',
      'base field' => 'activity_id',
      'label' => t('model answer'),
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );
  $data['lms_answer_initial']['question_id'] = array(
    'title' => t('Question ID'),
    'help' => t('The question ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'relationship' => array(
      'title' => t('LMS Model Answer'),
      'help' => t('Relate activity model answer.'),
      'handler' => 'views_handler_relationship',
      'base' => 'lms_model_answer',
      'base field' => 'question_id',
      'label' => t('model answer'),
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );
  $data['lms_answer_initial']['answer'] = array(
    'title' => t('Answer'),
    'help' => t('The answer.'),
    'field' => array(
      'handler' => 'views_handler_field',
    ),
  );
  $data['lms_answer_initial']['is_correct'] = array(
    'title' => t('Correct'),
    'help' => t('Indicates whether the answer is correct.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_numeric',
    ),
  );
  $data['lms_answer_initial']['changed'] = array(
    'title' => t('Change date'),
    'help' => t('The date when the answer was changed.'),
    'field' => array(
      'handler' => 'views_handler_field_date',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort_date',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_date',
    ),
  );

And here is the resulting query

SELECT lms_answer_initial.uid AS lms_answer_initial_uid, >lms_answer_initial.book_id AS lms_answer_initial_book_id, lms_answer_initial.unit_id AS lms_answer_initial_unit_id, lms_answer_initial.activity_id AS lms_answer_initial_activity_id, lms_answer_initial.question_id AS lms_answer_initial_question_id, lms_answer_initial.answer AS lms_answer_initial_answer, lms_answer_initial.is_correct AS lms_answer_initial_is_correct, lms_answer_initial.fid AS lms_answer_initial_fid
FROM {lms_answer_initial} lms_answer_initial
LEFT JOIN {lms_user} lms_user_lms_answer_initial ON lms_answer_initial.uid = lms_user_lms_answer_initial.uid
LEFT JOIN {lms_model_answer} lms_model_answer_lms_answer_initial ON lms_answer_initial.fid = lms_model_answer_lms_answer_initial.fid
LIMIT 30 OFFSET 0

How to add the following condition to the query?
lms_answer_initial.activity_id = lms_model_answer_lms_answer_initial.activity_id and lms_answer_initial.question_id = lms_model_answer_lms_answer_initial.question_id
Appreciate any help on this.
Answer: In Drupal 8 I used the following code:
  $data['table_a']['table_a_some_field'] => [
    'field' => [
      'id' => 'standard',
    ],
    'filter' => [
      'id' => 'numeric',
    ],
    'relationship' => [
      'id' => 'standard',
      'label' => t('Table B'),
      'base' => 'table_b',
      'base field' => 'table_b_some_field',
      'extra' => [
        [
          'left_field' => 'table_a_field_2',
          'field' => 'table_b_field_2',
        ],
      ],
    ],
  ],

Of course, table_b should be defined separately with its fields as well.
Answer: I finally get this done by following the solution here: http://eworldproblems.mbaynton.com/2014/04/drupal-views-join-on-multiple-columns/
Here is what I have actually do. In hook_views_data, add join_handler:
'relationship' => array(
          'title' => t('Model answer relationship on fid'), //Title shown when adding the relationship
          'base' => 'lms_model_answer', //name of table to join with
          'base field' => 'fid',        //name of the field on the joined table
          'handler' => 'views_handler_relationship',
          'join_handler' => 'lms_reports_join_lms_answer_initial_lms_model_answer',
          'label' => t('model answer fid'),
          'type' => 'LEFT',
        ),

Then implement my own customized handler, in *.views.inc:
class lms_reports_join_lms_answer_initial_lms_model_answer extends views_join
{
  public function build_join($select_query, $table, $view_query) {
    $select_query->addJoin('INNER', $this->table, $table['alias'], "lms_answer_initial.fid = ${table['alias']}.fid AND lms_answer_initial.activity_id = ${table['alias']}.activity_id AND lms_answer_initial.question_id = ${table['alias']}.question_id");
  }
}

Hope this help anyone else who encounter the same problem.
Answer: You can use hook_views_query_alter(&$view, &$query).
And in this hook you can write:
$query->add_where_expression(0,'lms_answer_initial.activity_id = lms_model_answer_lms_answer_initial.activity_id');
Comment: Thanks. Just tried but it add to the expression to overall sql instead in the Join condition.

Resulting query now becomes:

SELECT *
FROM
{lms_answer_initial} lms_answer_initial
LEFT JOIN {lms_user} lms_user_lms_answer_initial ON lms_answer_initial.uid = lms_user_lms_answer_initial.uid
INNER JOIN {lms_model_answer} lms_model_answer_lms_answer_initial ON lms_answer_initial.fid = lms_model_answer_lms_answer_initial.fid
WHERE (( (lms_answer_initial.activity_id = lms_model_answer_lms_answer_initial.activity_id) ))
LIMIT 30 OFFSET 0


What does "headless" mean?

Question: While reading the QTKit Application Programming Guide I came across the term 'headless environments' - what does this mean? Here is the passage:

...including applications with a GUI and tools intended to run in a "headless" environment. For example, you can use the framework to write command-line tools that manipulate QuickTime movie files.
Answer: "Headless" in this context simply means without a graphical display. (i.e.: Console based.)
Many servers are "headless" and are administered over SSH for example.
Comment: They exist in the background operations. Examples are virtual servers running on a parent OS. They do not necessarily actively listen to keyboards and mouse events. Not even the screen.
Comment: @JohnParker One of my lead said something about headless maven which made me confuse as maven by it self does not have a GUI. Is there a headless mode in maven?.
Answer: Headless means that the application is running without a graphical user interface (GUI) and sometimes without user interface at all.
There are similar terms for this, which are used in slightly different context and usage. Here are some examples.
Headless / Ghost / Phantom
This term is rather used for heavy weight clients. The idea is to run a client in a non-graphical mode, with a command line for example. The client will then run until its task is finished or will interact with the user through a prompt.
Eclipse for instance can be run in headless mode. This mode comes in handy when it comes to running jobs in background, or in a build factory.
For example, you can run Eclipse in graphic mode to install plugins. This is OK if you just do it for yourself. However, if you're packaging Eclipse to be used by the devs of a large company and want to keep up with all the updates, you probably want to find a more reproducible, automatic easier way.
That's when the headless mode comes in: you may run Eclipse in command line with parameters that indicate which plugins to install.
The nice thing about this method is that it can be integrated in a build factory!
Faceless
This term is rather used for larger scale application. It's been coined in by UX designers. A faceless app interacts with users in a manner that is traditionally dedicated to human users, like mails, SMS, phone... but NOT a GUI.
For example, some companies use SMS as an entry point to dialog with users: the user sends a SMS containing a request to a certain number. This triggers automated services to run and reply to the user.
It's a nice user experience, because one can do some errands from one's telephone. You don't necessarily need to have an internet connection, and the interaction with the app is asynchronous.
On the back-end side, the service can decide that it does not understand the user's request and get out of the automated mode. The user enters then in an interactive mode with a human operator without changing his communication tool.
Answer: You most likely know what a browser is. Now take away the GUI, and you have what's called a headless browser. Headless browsers can do all of the same things that normal browsers do, but faster. They're great for automating and testing web pages programmatically.
Comment: @GayanPathirage PhantomJS is a popular example.
Comment: The question is about headless environment not headless browser. These are two different things just learnt today.  We have Jenkins server configured to run our selenium tests on a dynamic docker instance. We we try to take the screenshot of the browser it is possible as the browser is not headless but when i try to take the screenshot using Robot class (java.awt.Robot) i get the headless environment error as the environment is having windows graphics
Answer: Headless can be referred in terms of a browser or a program that doesn't require a GUI. Not really useful for a general person to view and only to pass the info in the form of code to another program.
So why one uses a Headless program?
Simply because it improves the speed and performance and is available for all user, including those that have access to the graphic card. Allows testing browserless setups and helps you multitask.
Guide to Headless Browser
What is GUI ?
Answer: In software development it is an architectural design that completely separates the backend from the front end. The front end, gui, or UI is a stand alone piece and communicates to the backend through an API. This allows for a multi server architecture, flexibility in software stack and performance optimization.

What does "headless" mean?


Why does my batch script stop after activating a new conda env?

Question: This is enough to reproduce the issue:
Save as test.bat
:: Create Conda env
set name=%1
conda create -n %name% python -y
activate %name%
echo "Never gets here"
:: script should continue below...

Run from cmd.
>test.bat "testname"

Output:
C:\Users\Jamie\git>test.bat testname

C:\Users\Jamie\git>set name=testname

C:\Users\Jamie\git>conda create -n testname python -y
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment C:\Users\Jamie\Miniconda2\envs\testname:

The following NEW packages will be INSTALLED:

    pip:            9.0.1-py27_1
    python:         2.7.13-0
    setuptools:     27.2.0-py27_1
    vs2008_runtime: 9.00.30729.5054-0
    wheel:          0.29.0-py27_0

#
# To activate this environment, use:
# > activate testname
#
# To deactivate this environment, use:
# > deactivate testname
#
# * for power-users using bash, you must source
#

C:\Users\Jamie\git>activate testname

(testname) C:\Users\Jamie\git>

And that's it. The echo statement doesn't execute, but there is no error message.
Why does activating the conda env halt the batch script, and is there a way around it?
Comment: Possible duplicate of [Activate virtual environement and start jupyter notebook all in batch file](http://stackoverflow.com/questions/42353108/activate-virtual-environement-and-start-jupyter-notebook-all-in-batch-file)
Answer: use
call activate %name%

I'm assuming that activate is a batch file. If you call it, processing will return after that batch is finished. Without the call, execution is transferred to activate and ends when activate ends.
Comment: @JamieBull With respect to Conda, `being in an environment` is basically having ~4 environment variables set. If you use `CALL`, the environment variables set by the activate batch file will be retained on return.  See: https://paste.fedoraproject.org/paste/Rd5AW3qrqxXkTCt6Ma7Qx15M1UNdIGYhyRLivL9gydE=/raw
Comment: I need to be in the environment to continue
Answer: As discussed in the comment by asker @Jamie Bull himself.

I need to be in the environment to continue

In my case, to describe it more precisely, how could I activate a CONDA ENV, change to a working directory directly in one-click, or in one-command?
From a Linux background, we are more likely to complete this request by a simple one-line BASH script. I was facing the same problem with BAT file, as discussed here, CMD batch file's behavior is not that suitable for this task. Using CALL directive within BAT does not help either.
Luckily, CONDA now is packaged with PowerShell's PS1 start script, and the according shortcut left me with another choice, after a few test, it works.
My final solution is to create a Windows shortcut for my purpose, i.e, open PyTorch ENV or Tensorflow ENV in one click. I just made a copy of CONDA's package shortcut, did the edit on the copy itself, than the edited shortcut is ready to use. The screenshot will explain it well.

For PS1 script, it is finally as easy as BASH now:
# tf_env.ps1: Activate ENV and go to working directory
conda activate tf-gpu
cd C:\Tensorflow.Playground

Answer: try adding a new line at the end of your .bat file
Comment: but if there was a solution - it would look something like this. `conda activate EVN_NAME --execute second_part_of_the_script.bat`
Comment: That´s not actually the end, just in the example. I'll edit to make that clear
Comment: ah, you're right. to think of it - it can't possibly continue executing - since you've started a new shell session. It's same with ssh. Imagine you do

    `run-locally.sh`
   `ssh remote@server`
    `run-on-the-remote-server.sh`

remote command would never execute, because it will give you back control once it's logged in
Comment: you can't use `activate` (as I imagine), but you can call any python binary (you can use binary from virtual env directly) - no need to run "activate"
Comment: Ah, yes. I don't actually need to activate the env until the very end of my script. Thanks, I think it's sorted now
Comment: yeah - I don't think it's possible, sorry for giving you a wrong idea. What I meant to say by that "what if", is that whatever happens after `activate`, should be somehow passed as a script at that stage. But that's probably impossible.
Comment: I've gone with making two scripts. the first leaves me in the env, then the second does the rest, and still reduces my typing considerably!


When reporting the results of a time-varying covariate Cox model, are cumulative hazard rates more "accurate" than survival estimates?

Question: I am using a time-varying covariate to represent subjects that can enter and leave groups at arbitrary times. Because group membership is not fixed, I posit that the true time-to-event is more accurately represented by cumulative hazard rates than by survival estimates.
The calculation of hazard rates has the interpretation of the number of events per unit time among those at risk, while survival estimates imply some probability of an event among a fixed cohort of subjects moving forward in time. Intuitively, I cannot describe what a survival curve is measuring when group membership is changing; the probability of an individual in a group surviving to the next time point given prior survival to the current time point seems unsupportable.
Do cumulative hazard rates have an advantage for these reasons?
If not, what is the interpretation of a survival curve in the presence of a time-dependent covariate?
Reproducible example:
<code>library(dplyr)
library(survminer)
library(survival)

set.seed(42)

id <- rep(c(1:10), 100)
n <- length(id)
event <- rbinom(n, 1, 0.5)
group <- sample(c(1,2),n, TRUE)
time <- abs(rnorm(n,0,1)* 10 * group)
df <- data.frame(id, event,group, time)

df <- df %>% arrange(id) %>% group_by(id) %>%
      mutate(t0 = lag(time, default = 0, order_by = id),
             t1 = lead(t0 + time, default = time, order_by = id))

surv.obj <- with(df, Surv(t0, t1, event, type = "counting") )
survfit.obj <- survfit(surv.obj ~ group, df)

ggsurvplot(survfit.obj, fun = "cumhaz", df, censor = F)
ggsurvplot(survfit.obj, fun = "pct", df, censor = F)
</code>
Answer: There isn't any conceptual advantage of cumulative hazard over instantaneous hazard rates. The cumulative hazard is just the integral of the instantaneous hazard over time. With respect to your conceptual issue,

I cannot describe what a survival curve is measuring when group membership is changing; the probability of an individual in a group surviving to the next time point given prior survival to the current time point seems unsupportable

Therneau and Grambsch on pages 271-2 suggest that you can

imagine some hypothetical "cohort" of subjects who follow a given path [of covariate values], losing members to death along the way

as a way to think about modeling time-varying covariates.
Part of the problem is that you use the word "group" in two different ways. In your case, the "group membership" is a time-varying covariate. But in the phrase "a fixed group of subjects moving forward in time," what you are talking about is an initial cohort  of subjects (as in Therneau and Grambsch) whose "group membership" can change over time.
You do raise an important point in making predictions with time-varying covariates. It's very easy to hypothesize time courses for covariates that aren't realistic. Furthermore, making a prediction about a covariate value at a given time implies that an individual has survived up to that time. Survivorship bias is a serious risk.
Comment: @ToddD it might be defensible, but I think it would be unwise. I suggest that you take the Therneau and Grambsch cohort approach to thinking about such predictions, produce the requested survival curves, but perhaps note appropriate cautions about interpretation in associated text.
Comment: My question is most closely related to the last two sentences in your answer. I have been asked by a peer reviewer to plot survival curves, but I'm inclined to refuse due to the survivorship bias you mention. Is refusal to plot survival curves a defensible stance?


Como descobrir se uma cor hexadecimal é escura ou clara?

Question: Tenho uma listagem de status que é exibida e cada status tem uma cor atribuída. Essas cores estão salvas no meu banco de dados em formato hexadecimal.
Exemplo:
#add555

Eu estou com um pequeno problema: Se a cor for escura demais, pelo fato da mesma ser usada para background, a cor do texto torna-se ilegível.
Então eu queria saber se tem alguma forma de descobrir se a cor é escura, para, quando for escura, eu determinar que a cor do texto será branco, e se for clara, preto.
Tem como fazer isso?
Nota: A solução pode ser tanto em Javascript como em PHP.
Comment: tbm tenho esse problema, dai o que fiz foi deixar o usuário escolher a cor de fundo e cor do texto, mas sim, se ele escolher uma cor escura para o texto e para o fundo dai fica ilegível, mas os usuários já foram notificados disso, então ficou como, se acontecer é culpa deles, fiz o que deu no momento.
Answer: Calculando luminosidade
A solução já vem do próprio W3:

https://www.w3.org/TR/AERT#color-contrast

Mais especificamente com esta fórmula:
( R * 299 + G * 587 + B * 114) / 1000

Ela retorna a luminosidade na faixa de 0 a 255.
Como o ser humano tem em média uma percepção diferente de cada cor, a fórmula compensa para isto (o azul precisa ser muito mais forte para que tenhamos a "sensação" de que ele brilha tanto quanto um determinado vermelho).
Isto é uma média que não se aplica para os daltônicos. Daltônicos são pessoas que justamente tem problemas com algum desses "canais" de cor, muitas vezes deixando de ver parcialmente ou totalmente alguma das três cores.
Tratando o hexadecimal
Uma cor no formato #add555 nada mais é do que a combinação dos valores RGB em hexadecimal. No caso, temos estes valores:
R (red, vermelho ) 0xAD
G (green, verde )  0xD5
B (blue, azul )    0x55

Como já mencionei nesta outra postagem:

Como funcionam os números em hexadecimal?

O cálculo do hexa é bem simples. Não vou entrar em detalhes, pois tanto JS quanto PHP tem funções próprias para isto, quem quiser mais detalhes pode ler a postagem acima.
Vamos direto aos exemplos em código:
PHP
  $hexa = '#add555';
  $r = hexdec(substr($hexa,1,2)); // Se for sem o #, mude para 0, 2
  $g = hexdec(substr($hexa,3,2)); // Se for sem o #, mude para 3, 2
  $b = hexdec(substr($hexa,5,2)); // Se for sem o #, mude para 5, 2
  $luminosidade = ( $r * 299 + $g * 587 + $b * 114) / 1000;

E para usar o resultado (lembrando que vai de 0 a 255):
  if( $luminosidade > 128 ) {
     echo 'Cor clara';
  } else {
     echo 'Cor escura';
  }

Veja funcionando no IDEONE.
JS
var hex = '#add555';
var r, g, b, lum;

hex = hex.replace('#', '');

r = parseInt(hex.substr(0, 2));
g = parseInt(hex.substr(2, 2));
b = parseInt(hex.substr(4, 2));

lum = (r * 299 + g * 587 + b * 114) / 1000;

Veja funcionando no CODEPEN.
Formato "curto" e desconsiderando o #
Importante saber que as cores no formato "curto", como #fc0 são simplesmente uma maneira mais curta de escrever #ffcc00.
Para converter uma cor do "formato" curto basta isso:
r = r_curto * 17

P: Mas de onde veio esse 17?

R: No formato curto, 0xF equivale a 0xFF, 0x1 equivale a 0x11. Em outras palavras, uma variação de 0 a 15 em decimal no formato curto equivale a uma variação real de 0 a 255.
Simplificando: 255 / 15 = 17:)

Em PHP pode ser usado desta forma:
function Luminosidade($hexa) {
   $hexa = trim($hexa, ' #');
   $longo = strlen($hexa) > 3;

   $r = $longo ? hexdec(substr($hexa, 0, 2)) : hexdec(substr($hexa, 0, 1)) * 17;
   $g = $longo ? hexdec(substr($hexa, 3, 2)) : hexdec(substr($hexa, 1, 1)) * 17;
   $b = $longo ? hexdec(substr($hexa, 5, 2)) : hexdec(substr($hexa, 2, 1)) * 17;

   return ( $r * 299 + $g * 587 + $b * 114) / 1000;

E em JS:
function Luminosidade(hex) {
   var r, g, b, longo;
   hex = hex.replace( '#', '' );
   longo = hex.length > 3;

   r = longo ? parseInt(hex.substr(0, 2), 16) : parseInt(hex.substr(0, 1), 16) * 17;
   g = longo ? parseInt(hex.substr(2, 2), 16) : parseInt(hex.substr(1, 1), 16) * 17;
   b = longo ? parseInt(hex.substr(4, 2), 16) : parseInt(hex.substr(2, 1), 16) * 17;

   return ( r * 299 + g * 587 + b * 114) / 1000;
}

Vai além do que foi perguntado, mas se precisar de um código mais "universal", que reconheça cores em muitos formatos, tem um parser bem completo pronto aqui:

http://www.phpied.com/rgb-color-parser-in-javascript/
Comment: @AckLay com certeza não, pois o daltônico tem uma limitação em alguns dos "canais". Já que você mencionou, vou fazer uma observação.
Comment: Será que segue a mesma regra para os daltônicos?
Comment: [Fabuloso!](https://i.stack.imgur.com/qse78.jpg)
Answer: A biblioteca TinyColor disponibiliza diversas funções para inspecionar e manipular cores, entre elas:

isLight

Retorna um boolean indicando se o brilho percebido para a cor é claro.
tinycolor("#fff").isLight(); // true
tinycolor("#000").isLight(); // false

isDark

Retorna um boolean indicando se o brilho percebido para a cor é escuro.
tinycolor("#fff").isDark(); // false
tinycolor("#000").isDark(); // true

Extraído e traduzido de https://stackoverflow.com/a/32442062/5230740.
Answer: Já falei disso nesta outra resposta minha:

Composição de cores
É importante ter em mente que embora o branco seja o resultado da soma do vermelho, do verde e do azul, isso não significa que cada uma destas três cores representa um terço do branco. Isso não é verdade, e pode ser percebido facilmente de forma empírica ao notar-se que o verde puro é brilhante, enquanto que o vermelho puro é fosco e o azul puro é escuro.
Na verdade, a proporção exata da composição da luz branca depende da disposição das diferentes células receptoras na retina do olho do observador, condições de saúde, cansaço, idade e stress do observador, das condições de iluminação, do brilho e contraste da tela, do ângulo e direção entre o plano da tela e a linha de visada do observador, do tipo da tela (reflexiva ou anti-reflexiva, CRT, LED, plasma, LCD, retroprojetor, kindle, etc), entre muitas outras variáveis, podendo até mesmo variar de um olho para outro em uma mesma pessoa com visão normal e saudável.
Mas, desconsiderando-se estas variáveis que estão fora do controle do programador e pressupondo que o usuário tenha uma visão saudável e esteja usando uma tela de boa qualidade em um ambiente com iluminação adequada, há uma fórmula que vi em um livro uma vez há alguns anos que dava a seguinte proporção:

É uma pena que não lembro o título, mas o bfavaretto deu três referências para isso nos comentários: 1, 2 e 3, embora existam pequenas variações nos fatores exatos.
Ter em mente estes fatores da composição do brilho é importante para o caso de você quiser fazer um algoritmo de anti-aliasing que considere que os subpixels têm diferentes cores.
Essa mesma fórmula dada acima para a cor branca, pode ser usada para medir-se o brilho de uma determinada cor a partir de seus componentes vermelho, verde e azul. De acordo com esta página, a fórmula recomendada pela W3C (parecida com essa anterior) é:

Entretanto, essa mesma página diz que essa fórmula pode falhar ainda. Por exemplo, a cor (240, 0, 30) é um pouco mais brilhante que (80, 80, 80), sendo que por essa fórmula da W3C, a primeira teria um brilho de 75,18 enquanto que a segunda teria 80 (). O motivo disso é que o brilho é na verdade a distância que uma cor tem em relação ao preto, e não apenas a soma ponderada dos valores das suas tonalidades.
Se considerarmos todas as cores dispostas como diferentes pontos internos em um paralelepípedo onde um dos vértices é o preto, o vértice oposto é o branco, os vértices adjacentes ao preto são o vermelho, o verde e o azul e os vértices opostos a esses são o ciano, o magenta e o amarelo (nesta ordem), teríamos que uma das dimensões corresponde ao valor do componente vermelho, a outra do componente verde e a outra do componente azul. Se definirmos o tamanho de cada uma das dimensões desse paralelepípedo como a intensidade do componente da cor correspondente, então poderíamos usar a distância euclideana do ponto ocupado por uma cor qualquer dentro desse paralelepípedo até o vértice da cor preta como uma medida do brilho. Assim, para calcular a intensidade de uma cor, basta usar o teorema de Pitágoras. Se usarmos os valores da W3C, chegaríamos a esta fórmula:

Nesta fórmula, os brilhos das cores acima seriam 131,62 e 80.

Assim sendo, uma solução em Javascript considerando que uma cor clara seria aquela mais perto do branco enquanto que uma escura é a mais perto do preto, seria isso:

/**
 * Função que define se uma cor, dado os valores dos componentes vermelho, verde e azul em uma escala de 0 a 1, é clara ou escura.
 * @param {int} r - Valor do componente vermelho em uma escala de 0 a 1.
 * @param {int} g - Valor do componente verde em uma escala de 0 a 1.
 * @param {int} b - Valor do componente azul em uma escala de 0 a 1.
 */
function corClaraRgb(r, g, b) {
    return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) >= 0.5;
}

// Mapeia nomes comuns de cores. Fonte: http://www.w3schools.com/cssref/css_colors.asp
var colorMap = {"ALICEBLUE": "#F0F8FF", "ANTIQUEWHITE": "#FAEBD7", "AQUA": "#00FFFF", "AQUAMARINE": "#7FFFD4", "AZURE": "#F0FFFF", "BEIGE": "#F5F5DC", "BISQUE": "#FFE4C4", "BLACK": "#000000", "BLANCHEDALMOND": "#FFEBCD", "BLUE": "#0000FF", "BLUEVIOLET": "#8A2BE2", "BROWN": "#A52A2A", "BURLYWOOD": "#DEB887", "CADETBLUE": "#5F9EA0", "CHARTREUSE": "#7FFF00", "CHOCOLATE": "#D2691E", "CORAL": "#FF7F50", "CORNFLOWERBLUE": "#6495ED", "CORNSILK": "#FFF8DC", "CRIMSON": "#DC143C", "CYAN": "#00FFFF", "DARKBLUE": "#00008B", "DARKCYAN": "#008B8B", "DARKGOLDENROD": "#B8860B", "DARKGRAY": "#A9A9A9", "DARKGREY": "#A9A9A9", "DARKGREEN": "#006400", "DARKKHAKI": "#BDB76B", "DARKMAGENTA": "#8B008B", "DARKOLIVEGREEN": "#556B2F", "DARKORANGE": "#FF8C00", "DARKORCHID": "#9932CC", "DARKRED": "#8B0000", "DARKSALMON": "#E9967A", "DARKSEAGREEN": "#8FBC8F", "DARKSLATEBLUE": "#483D8B", "DARKSLATEGRAY": "#2F4F4F", "DARKSLATEGREY": "#2F4F4F", "DARKTURQUOISE": "#00CED1", "DARKVIOLET": "#9400D3", "DEEPPINK": "#FF1493", "DEEPSKYBLUE": "#00BFFF", "DIMGRAY": "#696969", "DIMGREY": "#696969", "DODGERBLUE": "#1E90FF", "FIREBRICK": "#B22222", "FLORALWHITE": "#FFFAF0", "FORESTGREEN": "#228B22", "FUCHSIA": "#FF00FF", "GAINSBORO": "#DCDCDC", "GHOSTWHITE": "#F8F8FF", "GOLD": "#FFD700", "GOLDENROD": "#DAA520", "GRAY": "#808080", "GREY": "#808080", "GREEN": "#008000", "GREENYELLOW": "#ADFF2F", "HONEYDEW": "#F0FFF0", "HOTPINK": "#FF69B4", "INDIANRED ": "#CD5C5C", "INDIGO ": "#4B0082", "IVORY": "#FFFFF0", "KHAKI": "#F0E68C", "LAVENDER": "#E6E6FA", "LAVENDERBLUSH": "#FFF0F5", "LAWNGREEN": "#7CFC00", "LEMONCHIFFON": "#FFFACD", "LIGHTBLUE": "#ADD8E6", "LIGHTCORAL": "#F08080", "LIGHTCYAN": "#E0FFFF", "LIGHTGOLDENRODYELLOW": "#FAFAD2", "LIGHTGRAY": "#D3D3D3", "LIGHTGREY": "#D3D3D3", "LIGHTGREEN": "#90EE90", "LIGHTPINK": "#FFB6C1", "LIGHTSALMON": "#FFA07A", "LIGHTSEAGREEN": "#20B2AA", "LIGHTSKYBLUE": "#87CEFA", "LIGHTSLATEGRAY": "#778899", "LIGHTSLATEGREY": "#778899", "LIGHTSTEELBLUE": "#B0C4DE", "LIGHTYELLOW": "#FFFFE0", "LIME": "#00FF00", "LIMEGREEN": "#32CD32", "LINEN": "#FAF0E6", "MAGENTA": "#FF00FF", "MAROON": "#800000", "MEDIUMAQUAMARINE": "#66CDAA", "MEDIUMBLUE": "#0000CD", "MEDIUMORCHID": "#BA55D3", "MEDIUMPURPLE": "#9370DB", "MEDIUMSEAGREEN": "#3CB371", "MEDIUMSLATEBLUE": "#7B68EE", "MEDIUMSPRINGGREEN": "#00FA9A", "MEDIUMTURQUOISE": "#48D1CC", "MEDIUMVIOLETRED": "#C71585", "MIDNIGHTBLUE": "#191970", "MINTCREAM": "#F5FFFA", "MISTYROSE": "#FFE4E1", "MOCCASIN": "#FFE4B5", "NAVAJOWHITE": "#FFDEAD", "NAVY": "#000080", "OLDLACE": "#FDF5E6", "OLIVE": "#808000", "OLIVEDRAB": "#6B8E23", "ORANGE": "#FFA500", "ORANGERED": "#FF4500", "ORCHID": "#DA70D6", "PALEGOLDENROD": "#EEE8AA", "PALEGREEN": "#98FB98", "PALETURQUOISE": "#AFEEEE", "PALEVIOLETRED": "#DB7093", "PAPAYAWHIP": "#FFEFD5", "PEACHPUFF": "#FFDAB9", "PERU": "#CD853F", "PINK": "#FFC0CB", "PLUM": "#DDA0DD", "POWDERBLUE": "#B0E0E6", "PURPLE": "#800080", "REBECCAPURPLE": "#663399", "RED": "#FF0000", "ROSYBROWN": "#BC8F8F", "ROYALBLUE": "#4169E1", "SADDLEBROWN": "#8B4513", "SALMON": "#FA8072", "SANDYBROWN": "#F4A460", "SEAGREEN": "#2E8B57", "SEASHELL": "#FFF5EE", "SIENNA": "#A0522D", "SILVER": "#C0C0C0", "SKYBLUE": "#87CEEB", "SLATEBLUE": "#6A5ACD", "SLATEGRAY": "#708090", "SLATEGREY": "#708090", "SNOW": "#FFFAFA", "SPRINGGREEN": "#00FF7F", "STEELBLUE": "#4682B4", "TAN": "#D2B48C", "TEAL": "#008080", "THISTLE": "#D8BFD8", "TOMATO": "#FF6347", "TURQUOISE": "#40E0D0", "VIOLET": "#EE82EE", "WHEAT": "#F5DEB3", "WHITE": "#FFFFFF", "WHITESMOKE": "#F5F5F5", "YELLOW": "#FFFF00", "YELLOWGREEN": "#9ACD32"};

/**
 * Função que define se uma cor, dado o nome dela, é clara ou escura.
 * @param {string} cor - Nome da cor, pode ter um dos seguintes formatos: '#abcdef', '#abc', 'rgb(a,b,c)', 'rgba(a,b,c)'  ou ser um nome comum de cor, tal como 'red' ou 'yellow'.
 */
function corClara(cor) {
    var r, g, b;
    try {
        var rgb = cor.trim().toUpperCase();
        if (colorMap[rgb]) rgb = colorMap[rgb];
        if (rgb.startsWith("#") && rgb.length === 7) {
            r = parseInt(rgb.substring(1, 3), 16) / 255;
            g = parseInt(rgb.substring(3, 5), 16) / 255;
            b = parseInt(rgb.substring(5, 7), 16) / 255;
        } else if (rgb.startsWith("#") && rgb.length === 4) {
            r = parseInt(rgb.substring(1, 2), 16) * 17 / 255;
            g = parseInt(rgb.substring(2, 3), 16) * 17 / 255;
            b = parseInt(rgb.substring(3, 4), 16) * 17 / 255;
        } else if (rgb.startsWith("RGB") && rgb.endsWith(")")) {
            rgb = rgb.substring(3);
            var a = rgb.charAt(0) === 'A';
            if (a) rgb = rgb.substring(1);
            rgb = rgb.trim();
            if (!rgb.startsWith("(")) throw new Error();
            rgb = rgb.substring(1, rgb.length - 1);
            var x = rgb.split(',');
            if (x.length !== (a ? 4 : 3)) throw new Error();
            r = parseInt(x[0].trim());
            g = parseInt(x[1].trim());
            b = parseInt(x[2].trim());
            aa = a ? parseFloat(x[3].trim()) : 0.0;
            if (isNaN(r) || isNaN(g) || isNaN(b) || isNaN(a) || r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || aa < 0.0 || aa > 1.0) throw new Error();
            r /= 255;
            g /= 255;
            b /= 255;
        } else {
            throw new Error();
        }
        return corClaraRgb(r, g, b);
    } catch (x) {
        throw new Error("A cor '" + cor + "' não foi reconhecida.");
    }
}

// Teste
function teste(x) {
    try {
        document.write("A cor '" + x + "' é uma cor " + (corClara(x) ? "clara" : "escura") + ".
");
    } catch (e) {
        document.write(e.message + "
");
    }
}

document.write("
Essas cores devem ser todas válidas
");
teste("#102030");
teste("#0000ff");
teste("#00f");
teste("#00ff00");
teste("#FF00FF");
teste("#808080");
teste("#888");
teste("#ffffff");
teste("#fff");
teste("#000000");
teste("#000");
teste("#a000A0");
teste("#a0A");
teste("yellow");
teste("BLUE");
teste("PowderBlue");
teste("rgb(20, 40, 60)");
teste("rgb(100, 180, 250)");
teste(" rgb (100 , 180 , 250 )");
teste("  rgb (255 , 255 , 255 )  ");
teste("rgba(20, 40, 60, 0.4)");
teste("rgba(100, 180, 250, 0.7)");
teste(" rgba (100 , 180 , 250 , 0.9)");
teste("  rgba (255 , 255 , 255 , 0.33 )  ");

document.write("
Essas cores devem ser todas inválidas
");
teste("hahaha");
teste("cor de burro quando foge");
teste("rgba(255, 255, 255)");
teste("rgb(255, 255, 255, 255)");
teste("rgb(255, 255)");
teste("rgba(255, 255, 255, 0, 0)");
teste("rgb(256, 0, 0)");
teste("rgb(-1, 0, 0)");
teste("rgba(256, 0, 0, 0.0)");
teste("rgba(-1, 0, 0, 0.0)");
teste("rgba(255, 0, 0, -1.0)");
teste("rgba(255, 0, 0, 1.1)");
teste({});
teste(1245);
teste([]);
teste(undefined);
teste(null);
Comment: Eu estou vendo "rgb" na função. No caso do hexadecimal, como ficaria?
Comment: @Wallace, no caso de uma cor `#abcdef`, o `ab` seria o vermelho, o `cd` o verde e o `ef` o azul. Vou editar a resposta para abordar isso.
Comment: Tinha imaginado que fosse isso, já que o Bacco tinha me falado pra "dividir em três"
Comment: @WallaceMaxters Editado. Ainda vou querer fazer umas alterações para abordar cores especificadas em outros formatos.
Comment: @WallaceMaxters Editado de novo. Me diga o que você acha disso.


Redirect /{POSTID}/{CATID}/{TITLE} to just /{POSTID}/

Question: I need help with a rewrite / redirect rule to fix some duplicate content issues on my website.
I have a URL structure that it causing a ton of duplicate content. The same page can be accessed with:

/Static1/Static2/Static3/{POSTID}/{CATID}/{TITLE}
/Static1/Static2/Static3/{POSTID}/{CATID}/
/Static1/Static2/Static3/{POSTID}/

So, there are 3 copies of every page.
I need to redirect #1 & #2 from above to #3, so /Static1/Static2/Static3/{POSTID}/ is the only URL that will display the content, and the other 2 will 301 to it.
The post ID's and category ID's are only numbers but they can be a different number of digits ( /1/, /24/, /827/, etc.)
The titles include numbers, letters and dashes ( - )
/Static1/Static2/Static3/ represents the folder structure before the part I need to rewrite - those folder names are always the same, and should also be included in the URL.
Comment: You might also find [canonical URLs](https://support.google.com/webmasters/answer/139066?hl=en) useful.
Answer: It's really quite simple:
RewriteEngine On
RewriteRule ^(static1/static2/static3)/(\d+)/(\d+)(/[0-9a-z-]+)?/?$ /$1/$2 [NC,R=302,L]

The expression requires that the IDs be used, and makes the title and trailing slash optional.
To make the redirect permanent, change 302 to 301.
Comment: I have one more rewrite rule I need:
Comment: I'm actually all set now.  I was able to figure it out based on the one you posted.  Thank you for your help!


When do dynamic IPv6 addresses for Azure load balancer front-end configurations change?

Question: I need a static ip address for IPv6 on Azure, but it looks like only dynamic IPv6 addresses are supported. I'm wondering about the relative stability of a dynamic IPv6 address for Azure load balancers. How often will it change?
In the Azure Docs, it says that dynamic ip addresses for VMs change when the vm is restarted, stopped, or deallocated. How does this work for load balancers, since they are not restarted or stopped?
If I have a load balancer with an availability set of vms as a backend pool, will the public IPv6 front-end ip configuration be relatively stable even if it's technically "dynamic", as long as I don't change the backend pool?
Answer:
I'm wondering about the relative stability of a dynamic IPv6 address
  for Azure load balancers. How often will it change?

For now, IPv6 allocation static method are not supported.
Any unreserved IP address(IPv4 and IPv6) will remain static if you:
1.Don't delete the public IP object associated with the load balancer.
2.Maintain at least 1 VM in the backend pool.
So, if we don't delete public IP address or disassociate it, and keep a VM running in the backend pool, we will keep the Public IPv6 address(will not change).
Comment: Thank you, Jason! The behavior you describe makes sense--just for more detail, I also saw that the VMs cannot be "stopped", so we must maintain at least 1 Active VM in the backend pool. So, if for some reason, all of our machines were shut down for awhile (such as in disaster scenario or maintenance), we would also lose the IPv6 address.


Getting .htaccess to allow access for specified IP, but request .htpasswd user + password if from any other IP

Question: Ive got a site that im trying to set an .htaccess / .htpasswd password restriction on, but at the same time allow any users with a specific IP address access.
So far ive implemented this as below in my .htaccess file, but for some reason this dosnt work, if i visit the site, no matter from which IP address it allows access, if i comment out the line order deny,allow above the Allow from 184.108.40.206 line, the password protection works, but will request an IP from everyone, even if visiting from the 18.104.22.168 IP (note - not my real IP)
(I haven't published my .htpasswd file for obvious reasons, but it is 1 line containing 1 hashed password)
Any ideas ?
<Files ~ "^\.(htaccess|.htpasswd)$">
    deny from all
    </Files>

    DirectoryIndex index.php
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www\.example\.example\.co\.uk)(:80)? [NC]
    RewriteRule ^(.*) http://example.example.co.uk/$1 [R=301,L]
    order deny,allow

    <Files ~ "^\.(htaccess|.htpasswd)$">
    deny from all
    </Files>
AuthType Basic
AuthName "Please enter your ID and password"
    AuthUserFile /var/www/vhosts/example.co.uk/subdomains/example/httpdocs/.htpasswd
    AuthGroupFile /dev/null
    require valid-user
    order deny,allow
    Allow from 22.214.171.124
    # satisfy any

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule .? %{ENV:BASE}index.php [L]

Comment: Do you have any other directives in htaccess?
Comment: @starkeen yes, but its only to do with the php config so i didint include it in the above, this is what it is : `RemoveType .php
 AddHandler application/php5-fcgi php
 Action application/php5-fcgi /cgi-bin/php5fcgi.fcgi`
Answer: Through trial and error i ended up using the below which works on apache 2.0, taken from here : https://perishablepress.com/htaccess-password-protection-tricks/
In the above article they wrapped the code block in <IfModule mod_auth.c>
 which was causing the code not to run (as i guess the if block equated to false on this server) so i removed them.
    # password protect excluding specific ip
 AuthName "Username and password required"
 AuthUserFile /home/path/.htpasswd
 AuthType Basic
 Require valid-user
 Order Deny,Allow
 Deny from all
 Allow from 111.222.333.444
 Satisfy Any

Answer: 4 you should use:
AuthType Basic
AuthUserFile c:/wamp/www/_test/www/.htpasswd
AuthName "Protected Area"

<RequireAny>
    Require ip 127.0.0.1
    Require valid-user
</RequireAny>

order, deny, allow are now Deprecated.
Comment: thanks, but that ends up giving a server error, do you know what the mimimum spec of LAMP is required to run the above ?


Como criar o serviço de um controller?

Question: Olá, eu gostaria de saber se é possível com este código criar um serviço. Pois todos os vídeos que vejo eles apenas criam serviços para coisas que serão duplicadas no código e afins ou de links do localhost. Se for possível me ajudar, agradeço.
angular.module('TarefApp')

.controller('TarefasController', function($scope) {
    $scope.categorias = [
        {nome:'Tarefas Primárias'},
        {nome:'Tarefas Secundárias'},
    ];
    $scope.tarefas = [];
    $scope.categoriaTarefa = {tarefa:{}};

    $scope.addTarefa = function(tarefa) {
        if(!$scope.categoriaSelecionada){
            alert("Selecione uma categoria!")
            return;
        }

        var c = $scope.categoriaSelecionada;

        if(!$scope.categoriaTarefa.tarefa[c])
        $scope.categoriaTarefa.tarefa[c] = [];
        else{
            var itemDuplicado = false;
            angular.forEach($scope.categoriaTarefa.tarefa[c], function (item, index){
                itemDuplicado = (item.nome === tarefa.nome);
                if(itemDuplicado){
                    alert("Tarefa para categoria já existe!");
                    return false;
                }
            });
        }

        if(!itemDuplicado){
            $scope.categoriaTarefa.tarefa[c].push(tarefa);
            $scope.tarefa = {};
        }
    };

    $scope.delTarefas = function() {
        angular.forEach($scope.categorias, function(item) {
            var c = item.nome;
            var oldTarefas = $scope.categoriaTarefa.tarefa[c];
            $scope.categoriaTarefa.tarefa[c] = [];

            angular.forEach(oldTarefas, function(tar) {
                if (!tar.selecionado) $scope.categoriaTarefa.tarefa[c].push(tar);
            });
        });
    };

    $scope.addCategoria = function(categoria) {
        for(var i=0; i < $scope.categorias.length; i++){
            if($scope.categorias[i].nome === categoria.nome){
                alert("A categoria já existe!");
                return;
            }
        }
        $scope.categorias.push(angular.copy(categoria));
        delete $scope.categoria;
    };
});

Answer:
[...]é possível com este código criar um serviço[?].

Sim, é possível. Na verdade, da maneira como seu controller foi escrito, a conversão para um serviço se torna muito simples. Você só precisa levar em consideração alguns pontos:
Serviços não possuem $scope
Serviços em Angular são singletons - o que significa que apenas uma instância é criada. Como $scope é uma ferramenta do Angular para referenciar o contexto de cada instância, ele é desnecessário. Neste caso, você precisa  converter todas as menções de $scope para this.
Referências para this em funções precisam ser revisadas
Um ponto adicional que você precisa ter em mente é que o javascript irá criar um escopo para cada chamada de função, e this sempre aponta para o contexto atual.
A solução é criar uma referência ao escopo principal (var that = this, no meu exemplo), e utilizar esta referência ao invés de this dentro de uma função (!that.categoriaSelecionada).
A versão convertida do seu código vem a seguir:

angular.module('TarefaApp', []);

angular.module('TarefaApp')
    .service('TarefasService', function() {
        var that = this;

        this.categorias = [
            {nome:'Tarefas Primárias'},
            {nome:'Tarefas Secundárias'},
        ];
        this.tarefas = [];
        this.categoriaTarefa = {tarefa:{}};
        this.categoriaSelecionada = {};

        this.addTarefa = function(tarefa) {
            if(!that.categoriaSelecionada){
                alert("Selecione uma categoria!")
                return;
            }

            var c = that.categoriaSelecionada;

            if(!that.categoriaTarefa.tarefa[c])
            that.categoriaTarefa.tarefa[c] = [];
            else{
                var itemDuplicado = false;
                angular.forEach(that.categoriaTarefa.tarefa[c], function (item, index){
                    itemDuplicado = (item.nome === tarefa.nome);
                    if(itemDuplicado){
                        alert("Tarefa para categoria já existe!");
                        return false;
                    }
                });
            }

            if(!itemDuplicado){
                that.categoriaTarefa.tarefa[c].push(tarefa);
                that.tarefa = {};
            }
        };

        this.delTarefas = function() {
            angular.forEach(that.categorias, function(item) {
                var c = item.nome;
                var oldTarefas = that.categoriaTarefa.tarefa[c];
                that.categoriaTarefa.tarefa[c] = [];

                angular.forEach(oldTarefas, function(tar) {
                    if (!tar.selecionado) that.categoriaTarefa.tarefa[c].push(tar);
                });
            });
        };

        this.addCategoria = function(categoria) {
            for(var i=0; i < that.categorias.length; i++){
                if(that.categorias[i].nome === categoria.nome){
                    alert("A categoria já existe!");
                    return;
                }
            }
            that.categorias.push(angular.copy(categoria));
            delete that.categoria;
        };
    })
.controller('TarefasController', function($scope, TarefasService) {
  $scope.svc = TarefasService;
})
.controller('Tarefas2Controller', function($scope, TarefasService) {
  $scope.svc = TarefasService;
});

      Controle 1:

      <select class="form-control" ng-model='svc.categoriaSelecionada'>
        <option ng-repeat="categoria in svc.categorias">{{categoria.nome}}</option>
      </select>

      Controle 2:

      {{svc.categoriaSelecionada}}

Observe como o valor selecionado no Controller 1 é compartilhado, via serviço, com o Controller 2.
Comment: Acredito que esteja faltando parte do código no final que provavelmente faz o código funcionar.
Comment: @LarissaMourullo Err... obrigado, você está correta; faltou copiar as linhas finais do serviço. Post editado e corrigido.
Comment: muito obrigada de verdade, achei bem fácil como foi feito. Me ajudou bastante.
Comment: @LarissaMourullo Sempre um prazer! Tendo mais dúvidas, sinta-se à vontade para perguntar.
Comment: estou tentando fazer funcionar, mas nada ta acontecendo (OBS: nenhum erro ocorrendo). Estou colocando isso no controller para chamar os serviços: .controller('TarefasController', function($scope, TarefasService) {
Comment: @LarissaMourullo Eu alterei o post, incluindo um exemplo de controle consumindo seu serviço.
Answer: O que é um serviço em angular?
Um serviço em angular serve para compartilhar recursos entre controladores. O uso mais comum nesse caso é a utilização desse recurso para criar uma interface de comunicação http comum. Por exemplo, você pode ter um serviço chamado pessoa e usar esse em diferentes controladores. Esse serviço irá prover uma interfac de acesso a dados para toda a aplicação no que se referir a uma pessoa (consultar, editar, incluir e etc).
app.controller('PessoaController', function($scope, $pessoa) {
    $scope.cadastrar = function (){
        $pessoa.cadastrar('<passa aqui dados pessoa>');
    };

    $scope.excluir = function (){
        $pessoa.cadastrar('<passa aqui id pessoa>');
    };

    $scope.consultarPorId = function (){
        $pessoa.cadastrar('<passa aqui id pessoa>');
    };
});

app.controller('VendaController', function($scope, $pessoa, $venda) {
    $scope.incluir = function (){
        $scope.consultarPorId(idPessoa).then(efetivarVenda);
    };

    $scope.efetivarVenda = function(pessoa){
        var venda = {/* Aqui monta objeto venda */};
        venda.pessoa = pessoa;
        $venda.efetivar(venda);
    };

    $scope.consultarPorId = function (){
        $pessoa.cadastrar('<passa aqui id pessoa>');
    };
});

Nesse exemplo você pode identificar o serviço $pessoa e o $venda. O serviço pessoa é compartilhado entre dois controladores, PessoaController e VendaController. A idéia do serviço é justamente essa. Compartilhar interfaces comuns entre os controladores.
É possível usar um controlador para encapsular métodos comuns?
Sim! É possível, entretanto não recomendo. Um serviço tem algumas limitações que podem dar mais dor de cabeça do que ajudar. Como já mencionado o serviço deve prover uma interface de comunicação entre outro sistema ou ainda entre serviços.
Como posso fazer para criar um ponto único de acesso a funções comuns no sistema?
Você criar um modulo commons que pode prover esses métodos comuns.
var commom = angular.module("utils.commom", []);
commom.factory("$commomutils", function($http, $q, $injector) {
    return({
        fazAlgo:function(algumaCoisa){
            console.log(algumaCoisa);
        }
    });
});

var appQualquer = angular.module("AppQualquer", ["utils.commom"]);
appQualquer.controller("ControllerQualquer", function($scope, $commomutils) {
    $scope.iniciar = function() {
        $commomutils.fazAlgo("JEC não vai cair!!! Figueira freguês!!!");
    };
});

appQualquer.directive("diretiva", [function () {
    return {
        restrict : "E",
    replace : true,
    link : function(scope, element, attr) {
            angular.element(element).html("Figueira FREGUES!!! JEC Maior de SC");
    }
    };
}]);

Observe o módulo utils.commom e como o mesmo é injetado no AppQualquer. Dessa forma você pode centralizar seus métodos comuns tendo um acesso a todos os recursos necessários.
Answer: Este código apresentado por você poderia sim ser convertido em serviço, a questão é que o que ele faz, não é o comportamento de um serviço angular.
No geral, serviços oferecem acesso a recursos ou funcionalidades partilhadas por toda aplicação, exemplos disso são, chamadas a servidor, informações do usuário e coisas do tipo.
Já os controladores, são estruturas para comandar os comportamentos de uma tela, eventos de botão, chamadas aos serviços. Perceba que é justamente isso o que o seu controlador atual faz.
Neste link você encontra um exemplo simples de criação de serviço: http://techbusters.com.br/criar-servico-com-angularjs/ mas os melhores posts sobre o assunto estão em inglês, caso queira mais informações a pesquisa "angular service" deve lhe retornar resultados satisfatórios.

Como criar o serviço de um controller?