OmniAICreator/Qiita-1.07M huggingface dataset:
VScodeでLatexを使う時に自動コンパイルする方法

この記事はあくまでメモ程度なので、わからないことがあったらコメントするかしてください。

# 目的
VScodeでLatexを書いたら自動でコンパイルされて、ヒャッハー気分で論文・レポートを書けるようになること

※Latexのインストールは各自で済ましているものだと仮定しています。


# 手順
以下の「コピペするコード」をVScodeの設定画面にコピペする。
bibtexを使う人と使わない人でコピペするコードが違うのでお間違いなく。

## コピペの場所がわからない人に向けて
まず、VScodeの一番左下にある歯車のアイコンをクリックします。
設定を開いたら、右上にある設定（JSON）をクリックしてコピペです。
以上です。


# コピペするコード（bibtexを使う人向け）
```json
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 5000,
    "latex-workshop.latex.recipes": [
        {
          "name": "platex",
          "tools": [
            "platex",
            "pbibtex",
            "platex",
            "platex",
            "dvipdfmx"
          ]
        }
      ],
      "latex-workshop.latex.tools": [
        {
          "name": "platex",
          "command": "platex",
          "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-kanji=utf8",
            "-shell-escape",
            "%DOC%"
          ]
        },
        {
          "name": "dvipdfmx",
          "command": "dvipdfmx",
          "args": [
            "%DOCFILE%.dvi"
          ]
        },
        {
          "name": "pbibtex",
          "command": "pbibtex",
          "args": [
            "-kanji=utf8",
            "%DOCFILE%"
          ]
        }
    ]
```

これで、保存するだけで自動的にpdfが生成されます。

# コピペするコード（bibtexを使わない人向け）
```json
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 5000,
    "latex-workshop.latex.recipes": [
        {
          "name": "platex",
          "tools": [
            "platex",
            "dvipdfmx"
          ]
        }
      ],
      "latex-workshop.latex.tools": [
        {
          "name": "platex",
          "command": "platex",
          "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-kanji=utf8",
            "-shell-escape",
            "%DOC%"
          ]
        },
        {
          "name": "dvipdfmx",
          "command": "dvipdfmx",
          "args": [
            "%DOCFILE%.dvi"
          ]
        }
    ]
```

# 補足
Vscodeの拡張機能に色々と便利なものがあるので、以下を使うことを私はおすすめします。  

- Latex Preview
- Latex Workshop
- Latex language support
Windows : Apacheをインストールする

# 目次
1. Apacheとは
2. Apacheのインストールする

# 1. Apacheとは
Apacheは、WindowsやMac OSなどの幅広いプラットフォームで動作するWebサーバです。世界中で幅広く使われており、無料で使うことができます。

以下にWebサーバのイメージ図を示します。
![apache-install-windows81_64_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529910/89ad9cc6-3932-7f0f-c190-24a12284c5a9.png)
上記のようにWebサーバとは、クライアント（Internet ExplorerやSafariなど）からのリクエスト要求に応じてコンテンツ（動画、画像、ホームページ）を配信するものです。

# 2. Apacheのインストールする
ここではWindows版Apache2.4の64ビット版のインストール手順について説明します。
![apache-install-windows81_64_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529910/f8f51b33-1e6e-aba3-e4e1-fdeeed99b322.png)
Apache2.4のインストーラーはApache公式ホームページには置いていないため、**Apacheソフトウェア財団のホームページ**からインストーラーファイルをダウンロードします。

![apache-install-windows81_64_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529910/e1b27cda-cb95-a513-32b1-d7f081234662.png)
ダウンロードページを表示し、「Apache2.4 Win64」のリンクをクリックし、ZIPファイルをダウンロードします。

ダウンロードしたZIPファイルを解凍するとApacheという名前のフォルダが展開されます。Apacheフォルダは、作業がしやすい任意の場所に移動させておきましょう。今回は、Cドライブ直下に移動させます。

## Cドライブ直下にApacheフォルダを保存した場合

```
C¥:Apache24
```

以上でApacheのインストールは完了です。
【Rails】簡単seedデータの挿入方法

#概要
Railsにおけるseedデータの挿入方法メモ
Gemを利用してデータベースに複数の初期データを挿入していく。

#やり方

Gemfileに

```
gem 'faker'
```

```
$ bundle install
```

https://github.com/stympy/faker
データを生成できるものは上記READMEに載っている。

例えば、
a = Faker::Movies::StarWars.character
でaの中にスターウォーズキャラクターの名前が入り、初期データとして作成できる。

`db/seeds.rb`

に以下追記。

```db/seeds.rb
100.times do |n| #100件シードデータを作成するということ。
  name = Faker::Movies::StarWars.character
  email = Faker::Movies::StarWars.droid
  password = "password"
  User.create!(name: name,
               email: email,
               password: password,
               password_confirmation: password,
               )
end
```

以下をコメントアウトする。
日本語対応はしていないため。

```locale.rb
I18n.config.available_locales = :ja
I18n.default_locale = :ja
```


その後、コンソールで`rails db:seed`
Styled-componentsでEmmetが効かない

めちゃくちゃ単純なことにハマったのでメモ。

## 症状
```
const Name = styled.div `
  display: block;
`
```
を書きたいとして、Emmetの補完が効かない。具体的には、

```
const Name = styled.div `
  db
`
```
で `Tab`を押すと

```
const Name = styled.div `
  <db>
`
```
になってしまう。

## 解決策
settings.jsonに

```
"emmet.includeLanguages": {
  "typescriptreact": "css",
  "javascriptreact": "css"
}
```
を追記すれば解決。
defx.nvimの導入

[defx.nvim](https://github.com/Shougo/defx.nvim)を導入していきます。
環境は `MacVim Custom Version 8.1.2234 (161)` です。

導入は非常に簡単です。
私は[minpac](https://github.com/k-takata/minpac)を使っているのでこんな感じ。

```viml:.vimrc
call minpac#add('Shougo/defx.nvim')
if !has('nvim')
  call minpac#add('roxma/nvim-yarp')
  call minpac#add('roxma/vim-hug-neovim-rpc')
endif
```

これだけです。簡単。
しかし、これだけだと動かないのでキーバインドを追加します。

基本的には公式の[サンプル](https://github.com/Shougo/defx.nvim/blob/master/doc/defx.txt#L663)をコピペしました。

一部手癖などに合わせて調整して

```viml:.vimrc
" ディレクトリの場合は開く。それ以外はすでにあるウインドウで開く。
  nnoremap <silent><buffer><expr> <CR>
  \ defx#is_directory() ?
  \  defx#do_action('open_directory') :
  \  defx#do_action('multi', ['drop', 'quit'])

" vsplitで開いてdefxを閉じる
  nnoremap <silent><buffer><expr> E
  \ defx#do_action('multi', [['open', 'vsplit'], 'quit'])

" <C-w>で親階層に移動する
  nnoremap <silent><buffer><expr> <C-w>
  \ defx#do_action('cd', ['..'])

" <C-p>でカーソルを上移動する
  nnoremap <silent><buffer> <C-p> <UP>

```

あとは適当なキーバインドをつけて

```viml:.vimrc
" NERDTreeのように左に表示する。現在のファイルの階層を開く。
  nnoremap <silent><C-e> :<C-u>Defx -split=vertical -winwidth=40 -search=`expand('%:p')` -direction=topleft `expand('%:p:h')`<CR>

```

完成！簡単便利！
pycparserでCプログラムのASTを出力してみた

研究でCプログラムのASTを取得する必要ができたので、勉強した内容のメモ代わりとして残す。

pycparserをpipでインストール

実際にサンプルプログラムを動かしてみた。

```python:sample.py
from __future__ import print_function
import sys
import json
from pycparser import c_parser, c_ast

text=r'''
int mian(void){
int i,j;
printf("test");
return 0;
}
'''

sys.path.extend(['.', '..'])
parser = c_parser.CParser()
ast = parser.parse(text, filename='<none>')
ast.show(attrnames=True,nodenames=True)
```

```ruby:実行結果
FileAST:
  FuncDef <ext[0]>:
    Decl <decl>: name=mian, quals=[], storage=[], funcspec=[]
      FuncDecl <type>:
        ParamList <args>:
          Typename <params[0]>: name=None, quals=[]
            TypeDecl <type>: declname=None, quals=[]
              IdentifierType <type>: names=['void']
        TypeDecl <type>: declname=mian, quals=[]
          IdentifierType <type>: names=['int']
    Compound <body>:
      Decl <block_items[0]>: name=i, quals=[], storage=[], funcspec=[]
        TypeDecl <type>: declname=i, quals=[]
          IdentifierType <type>: names=['int']
      Decl <block_items[1]>: name=j, quals=[], storage=[], funcspec=[]
        TypeDecl <type>: declname=j, quals=[]
          IdentifierType <type>: names=['int']
      FuncCall <block_items[2]>:
        ID <name>: name=printf
        ExprList <args>:
          Constant <exprs[0]>: type=string, value="test"
      Return <block_items[3]>:
        Constant <expr>: type=int, value=0
```

無事にCのプログラムからASTが出力されました(どうやって保存するんだろう…)。
JMeter起動しようとするとheapのエラーが出る

# JMeter起動しようとするとheapのエラーが出る

新しいWindows PCにJMeterをインストールしました。

起動してみたところ、以下のようなエラーが出ました。

```
Error occurred during initialization of VM
Could not reserve enough space for 1048576KB object heap
errorlevel=1
```

どうやらJMeterのデフォルトのヒープサイズが1GBになっていて、JVMでエラーが発生しているようです。



# ヒープサイズを少なくした

JMeterを起動する前に、以下のように `HEAP` を設定したところ、私の環境では改善しました。

```bash
rem ヒープサイズを変更
set HEAP=-Xms512m -Xmx512m -XX:MaxMetaspaceSize=256m

rem JMeterを起動
jmeter.bat
```

`jmeter.bat` は、JMeterのインストール先にあるバッチファイルです。

以下の記事と同じようにJMeterをインストールした場合、 `C:\apache-jmeter-4.0\bin\jmeter.bat` にあります。

- [プロキシ配下＆日本語でJMeter4.0を起動する](https://qiita.com/segur/items/66257aad638806b2f27a)


# さいごに
本記事作成にあたり、以下のサイトを参考にしました。ありがとうございました。

- [JMeterでOutOfMemoryが発生した場合の対応方法](https://qiita.com/akiynkmr/items/e7e7aba567cc6cf8f8d9)
【Rails】FontAwesome

準備
-
Gemfileに
`gem 'font-awesome-rails'`を記載。
ターミナルで`bundle install`を実行。

```bash:ターミナル
bundle install
```

`application.css`に`*= require font-awesome`を記載。

```css:app/assets/stylesheets/application.css

/*
（省略）
 *= require font-awesome
（省略）
 */
```

使い方
-
`<i class="fa fa-home"></i>`

ヘルパーメソッドを使用できるので
`<%= fa_icon("home") %>`
と書くこともできる。

例えば
`<%= fa_icon("home 5x") %>`
で５倍。
PHPのスコープについて2


##PHPのスコープについてさらに詳しく。
まずは下記のコードを確認。

```
<?php

$message = "PHP";

function say_hello($message){
    echo "hello".$message;
}


say_hello($message);
```

##出力結果
```
hello PHP
```


関数 say_hello の引数が $message となっている。
echoの時点では、$messageにはなんの値も入っていない。


関数の外(下)で、$messageを引数にした関数 say_hello を呼び出すと、


echo "hello".$message;


が実行される（関数の中身が実行される）


関数の外(上側)で、$messageは

$message = "PHP";

と文字列”PHP"が代入されている。

そのため、say_hello($message)の出力結果は上記のようになる。
【GitHub】プルリクエストをローカルに持ってきて確認する方法

#概要
特定のプルリクエストを指定してローカルへ反映し、
新しいブランチで作業を再開するときなどに利用した。

#コマンド

プルリクエストのIDと任意のブランチ名を指定。

```
$ git fetch origin pull/ID/head:任意のブランチ名
```


任意のブランチ名で新しいブランチを切って、
そのブランチ名でプルリクエストのIDのコード内容が反映されたものができる

```
$ git checkout 任意のブランチ名
```
GitHubでupstreamからローカルに特定のpull requestを落とす方法

## はじめに
表題の通り。
GitHubのプルリクエストをローカルに落としたいときのコマンドが分からなかったのでメモ。
IDとブランチ名が分かればどうにかなる。
※諸々の設定は完了している前提

## コマンド
```shell
$ git fetch upstream pull/{ID}/head:{branch name}
```
あとは `$ git switch {branch name}`でブランチに移動してしまえばローカルに落とせたことがわかるはず。


### 図解
IDとbranch nameがどこを指しているのかは下記画像を参考にしてくださいませ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50208/5d37eaa5-653e-a03a-402e-a0ef4ecc1bc1.png)

この場合は

```shell
$ git fetch upstream pull/777/head:upstream-branch
```

とすれば大丈夫。
XAMPPを使ったローカル開発環境（PHP）


PHP開発の簡単な利用方法についての記述。

XAMPPのインストール方法については、Google検索すると簡単にまとめられている。


◯バージョンは、Mac OS X XAMPP-VM (PHP 7.2.10)です。
2018年10月現在の最新バージョンです。
<img width="565" alt="スクリーンショット 2020-01-09 18.05.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/99e61acd-dca2-533e-0bb6-8c64fc40808b.png">



◯PHP記述に使うテキストエディターは、Sublime Textです。
【参考サイト：https://php-archive.net/php/php-texteditor-mac/ 】
<img width="248" alt="スクリーンショット 2020-01-09 18.05.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/7603a146-fe39-1551-adb6-472fc614f719.png">




◯利用方法

① General タブ
「 Start 」ボタンをクリック
（開発言語の細かい操作は、Servicesにて可能）
<img width="564" alt="スクリーンショット 2020-01-09 18.05.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/1964a745-c865-3a59-7fd9-86fef585e1a3.png">


「 Start 」ボタン押すとこんな感じ↓
<img width="568" alt="スクリーンショット 2020-01-09 18.05.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/7546f1fd-24a3-0f50-5bf1-85288b6e50c3.png">




② Network タブ
使用ローカルホスト（localhost）を選択し、Enableをクリック
今回は、localhost:8080 -> 80(Over SSH)を使用
<img width="568" alt="スクリーンショット 2020-01-09 18.05.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/5aa9f447-c57f-a003-1140-607e2305d30e.png">



実際やってみるとこんな感じ↓
<img width="564" alt="スクリーンショット 2020-01-09 18.06.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/15aeef4d-c342-dc19-27bd-78a14e717a62.png">



③ Volumes タブ
Mountをクリック
<img width="565" alt="スクリーンショット 2020-01-09 18.06.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/2b7dba5c-6253-a6c6-154a-69b296e2fb80.png">


デスクトップにXAMPPのディレクトリが表示される
<img width="238" alt="スクリーンショット 2020-01-09 18.06.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/708a3816-3ad4-3fba-7bc9-8de3026cb268.png">


ディレクトリを開き、[htdocs]内にprojectフォルダを作成。
<img width="565" alt="スクリーンショット 2020-01-09 18.06.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/427b0cf5-0042-ea41-11d0-a77f04c1b337.png">





④ PHPの記述
Sublime Textを開き、適当に記述する
<img width="565" alt="スクリーンショット 2020-01-09 18.06.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/565a3aae-0b2f-59b7-6756-a225a5769659.png">


test.phpなど適当に名前をつけて、projectフォルダに保存。


④ WEBブラウザにて表示
Google Chromeにて
localhost:8080/project/test.php
上記URLをブラウザで検索。
<img width="564" alt="スクリーンショット 2020-01-09 18.06.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558829/e6ca33e5-7500-7be4-2475-38804d0e75ab.png">



ブラウザでの表示完了！


バージョンアップがかなり多いので、初心者には苦戦する内容ですが、
チャレンジしてみると案外シンプルでした！

【参考にしたサイトURL : https://blanche-toile.com/web/mac-xampp 】
Nuxt.jsでのルートパスのテンプレートをindex.vueからtop.vueに変更する

# 編集するファイルは、.nuxt/route.js

router.jsのファイルを開いてみると、以下のような記述があると思います。

```vuejs:router.js
export const routerOptions = {

・・・・

  routes: [{
    path: "/top",
    component: _702885f1,
    name: "top"
  }, {
    path: "/",
    component: _2458d5ee,
    name: "index"
  }],
```

Nuxt.jsはディレクトリ構造でパスを決定する仕組みになっていますが、実はその設定はここに記載されています。

一番下で、ルートパスがindex.vueを参照するようにデフォルトで設定されてます。

この部分を書き換えてやれば、完了です。

```vuejs:router.js
export const routerOptions = {

・・・・

  routes: [{
    path: "/top",
    component: _702885f1,
    name: "top"
  }, {
    path: "/",
    component: _2458d5ee,
    name: "top" // 変更
  }],
```

僕の場合、ルートパスで、top.vueを参照して欲しいので上記のように変更しました。
情報論的学習理論

```{r}

#情報論的学習理論　山西健司著

#集合型予測アルゴリズム

#p.88

library(dplyr)

L=function(y,y_hat){
  
return(sum((y-y_hat)^2))
  
}

lambda=function(z){
  
z=1/abs(z)  
  
dl_0=(L(0,z+h)-L(0,z))/h

dl_1=(L(1,z+h)-L(1,z))/h

ddl_0=(L(0,z+h)-2*L(0,z)+L(0,z-h))/(2*h^2)

ddl_1=(L(1,z+h)-2*L(1,z)+L(1,z-h))/(2*h^2)

value=(dl_0*dl_1^2-dl_1*dl_0^2)/(dl_0*ddl_1-dl_1*ddl_0)

return(value)
  
} 

diff=1

x=10

eta=0.00001

h=0.01

while(diff>0.001)({
  
x_pre=x

if(x+eta*(lambda(x+h)-lambda(x))/h>1){
  
x=x+eta*(lambda(x+h)-lambda(x))/h
  
diff=abs(x-x_pre)

}

})
 
lam=1/lambda(x)


lam=sample(seq(h,lam,h),1)

N=5;w=rep(1,N)

params=sample(1:20,N,replace=T)

ite=1000;real_param=sample(1:20,1)

Y_hat=1/rpois(N,params)

Y_value=1/rpois(1,real_param)

for(l in 1:ite){
  
W=sum(w)  

v=w/W  

 



dt0=c();dt1=c()

for(s in 1:N){
  
dt0=c(dt0,as.numeric(v[s]*exp(-lam*L(0,Y_hat[s]))))

dt1=c(dt1,as.numeric(v[s]*exp(-lam*L(1,Y_hat[s]))))
  
}

dt0=-log(sum(dt0))/lam;dt1=-log(sum(dt1))/lam

Y=(sqrt(dt0)+1-sqrt(dt1))/2

for(j in 1:N){
  
w[j]=w[j]*exp(-lam*L(Y_value,Y_hat[j]))  
  
}    

print(L(Y_value,Y))
 
}





```
PHPのスコープについて

##スコープとは

変数の有効範囲が決まっていること。
同じ変数を使用していても、関数内で定義した変数と、関数外で定義した変数は独立したものとして扱われる。


```
<?php
// スコープを理解する

$a = 10;
$b = 15;

function say_hello3($x,$y){
 $a = "PHP";
 echo "hello,".$a."\n";

//戻り値

return $x * $y; 

    
}

$num = say_hello3($a,$b);
echo $num."\n";

?>
```

##出力結果
```
hello,PHP
150
```


##ローカルスコープとは
{}に囲まれている関数内で定義されるスコープ。

##グローバルスコープとは
ローカルスコープの外で定義した変数。プログラムの全体でどこでも使うことができる。
【DS】DBの検証環境構築

参考にしたページを記載。
詳細はリンク先をみれば十分。

https://knowledge.bizrobo.com/hc/ja/articles/360028155271
Tomcat 上に Management Console を構築し、MySQLなどのEnterprise 級のデータベースを使用する

https://portal.bizrobo.com/ja/%E8%A3%BD%E5%93%81/bizrobo%EF%BC%81-basic/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88"
https://knowledge.bizrobo.com/hc/ja/articles/360027313772-Derby-Database-DevelopmentDatabase-%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4%E6%96%B9%E6%B3%95
テスト用のDBは上記サイトで作れる。
derby databaseというのは、テスト用のDBのことらしい

DBに関する関連知識は以下サイト参照
https://oss-db.jp/dojo/dojo_15
https://www.keyman.or.jp/kn/articles/1802/07/news130.html"

デザインモードで実行をチェックすると、デザインモードでもDBに登録する動作ができる
登録したものを照会することも可能

SQLの生成はツールから可能
【DS】パターン置き換え注意点

まず、パターン置き換えのテスト入力値に値を入れることで
テストができる

<img width="226" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a61b7483-12dc-d955-abed-2aaf219531e3.png">
・設定パターンの置き換えが(.*)/(.*)/(.*)で、1/20という形で入ってきてもエラーにはならない

<img width="452" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/137839c2-a348-6d24-3061-e348d2317fdd.png">
?で区切られている　:はorみたいな感じ
なので、
$1  < 10だったら
"0" + $1 +  "/" + $2
じゃなければ
$1 +  "/" + $2
をしてね、という指示

だから
$0  < 10 ? >>少ない<<  : >>多い<<
これだと
多いってでる
Laravel の DB::listen で 使えるクロージャのプロパティ

Laravel 6で確認しています

```php
DB::listen(function($query){
    $query->sql; // プリペアードステートメントのSQL(未バインド)
    $query->bindings;// バインドされる値
    $query->time;// クエリの実行にかかったミリ秒
    $query->connection;// データベース接続インスタンス
    $query->connectionName;// 接続先データベース名
});
```

参考
https://laravel.com/api/6.x/Illuminate/Database/Events/QueryExecuted.html
matplotlibで一部をズームした図を作る

**この記事を読むとできるようになること**
`matplotlibで，一部を拡大した図を同じプロットに挿入できる`

こういうやつが描きたかった．
![zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403437/5a5c579b-74b8-a9a9-ee3b-287fc369386d.png)


- 環境
    - macOS mojave 10.14.6
    - Python 3.7.6

なんのことはない簡単な手順で，
subplot の枠を用意してあげればいいだけです．

```Python:zoom.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.tick_params(which='both', direction='in', top=bool, right=bool, labelbottom=True)
ax1.set_xlim(0.0, 4.0)
ax1.set_xlabel("x")
ax1.set_ylim(0, 2)
ax1.set_ylabel("y")

# 関数の作成
x = np.arange(0.01, 4.0, 0.01)
y = x*x*np.sin(1.0/(x*x*x)) +0.4
ax1.plot(x, y, "-", color='red', lw=1)

# zoomするsubplotの位置
#axes([左からどのくらい離すか, 下からどのくらい離すか, 幅, 高さ])
sub_axes = plt.axes([.2, .6, .25, .25])
sub_axes.tick_params(which='both', direction='in', top=bool, right=bool, labelbottom=True)
sub_axes.tick_params(labelsize=7)
sub_axes.grid(which='major',color='gray',alpha=0.1,linestyle=':',linewidth=0.3)
sub_axes.set_xlim(0.0, 0.6)
sub_axes.set_xticks( [0, 0.2, 0.4, 0.6] )
sub_axes.set_ylim(0.0, 0.8)

# subplotを描く
sub_axes.plot(x, y)

plt.savefig("zoom.eps")
```

参考：
[画像の一部をズームしてmatplotlibの同じプロットに挿入する方法](https://www.code-adviser.com/detail_13583153)
コンテンツ研修3日目

# 今日取り上げたいトピック
・%とvh

# なぜこのトピックを選定したのか
・本日学びを進める上で、簡単そうに見えてつまづいたポイントだったから。

# 新しい気付き・学び
・高さ調整について親要素がない場合、基準を定義できないので消えてしまう。
→<具体例>
.blue {
  background-color: #c9daf8;
  width: 100％;<b>
  height: 100％;</b>
}
＊でもなぜ横は親要素がないのに、%を使っても消えないのか？はわからず。。
　

・display: flex;またはfloatあることによって子要素を横に並べることができる。
・position=absolute;は子要素が親要素を無視して配置される。
・position=relativeは親要素を基準として子要素が配置される

# その学びを他人に教えるとしたら、このように説明したい
・正直、説明できるレベル感で理解できていない。

# 本日の学習
・モダンなwebサイトを作成しよう
・様々な高さや幅の指定方法について知ろう
・Lesson3まとめ
・Lesson3の確認テスト

## 本日の学習の点数（100点満点）とその理由
・50点
理由：3日目が終了した時点で、2日目の完了目安のところまでしか行っていない。
　　　わからないループにハマり必要以上に時間をかけてしまった。

## 点数を10点上げるために明日何ができるか
・科目ごとに制限時間をかけて、その中で計画的に進める。
・フォーカスデイの学習スタイルでも、わからないことはすぐ聞くようにする。
C#WPFで画面遷移PHP風

PHPでいうFormからPOSTメソッドで次の画面に値を送る初歩のプログラム。
できるだけ簡単にやってみる。

前提
visualStudio2019 -> 新しいプロジェクトの作成 -> WPF App（.NET Core）c#

```c#:MainWindow.xaml
//Navigationに変更
<NavigationWindow x:Class="kadai1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:kadai1"
        mc:Ignorable="d"
        //Source追加
        Title="MainWindow" Height="300" Width="400" Source="Page1.xaml">
</NavigationWindow>
//Gridタグを消去
```

```c#:MainWindow.xaml.cs
//NavigationWindowに変更
public partial class MainWindow : NavigationWindow {
    public MainWindow() {
        InitializeComponent();
    }
}
```


ページの追加: Page1.xaml

```c#:Page1.xaml
<Page 略
//追加:Loaded
Title="Page1" Loaded="Page1_Loaded">
//追加
<Grid>
    <StackPanel Orientation="Vertical" Margin="10,0">
        <Label>名前を入力して下さい</Label>
        <TextBox x:Name="_name" Width="100" HorizontalAlignment="Left"></TextBox>
        <Button Click="Btn_Click" Width="100" HorizontalAlignment="Left" Margin="0,10">送信</Button>
    </StackPanel>
</Grid>
```

```c#:Page1.xaml.cs
//追加
public partial class Page1 : Page {
	private NavigationService _navigation;
	public Page1() {
		InitializeComponent();
	}
	private void Btn_Click(object sender, RoutedEventArgs e) {
		Application.Current.Properties["Name"] = _name.Text;
		var _page2 = new Page2();
		_navigation.Navigate(_page2);
	}
	private void Page1_Loaded(object sender, RoutedEventArgs e) { 
		_navigation = this.NavigationService;
	}
}
```
ページの追加: Page2.xaml

```c#:Page2.xaml
//追加
<Grid>
    <StackPanel Orientation="Horizontal" Margin="10,0">
        <Label Name="_named" Margin="0,10"></Label>
        <Label Margin="0,10">さん。ようこそ。</Label>
    </StackPanel>
</Grid>
```

```c#:Page2.xaml.cs
//変更
public partial class Page2 : Page {
    public Page2() {
        InitializeComponent();
        _named.Content = Application.Current.Properties["Name"];
    }
}
```

![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/4ed4c531-7003-3681-52d4-d68db3e9a5fd.jpeg)![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/0318c044-7c66-a5b8-83e1-4db1efe2b306.jpeg)
説明
最低限のプログラムです。
本来なら空白時には次の画面に行かないとかバリデーションが必要となります。
NavigationWindowで画面遷移します。
Application.Current.Propertiesで値の送信はPHPのPOSTぽいので使いました。
実際にはこんなグローバル変数は使わないと思います笑
ChromeのSelenium IDEで変数設定とループ処理


##環境
chrome:バージョン: 79.0...
chrome拡張：Selenium IDE 3.16.1


##Selenium IDEの使い方
Recボタンを押してのブラウザ操作すると簡単に記録はできます。
この記録をした上で、繰り返し等を自分でコードに埋め込む形です。

##コード

| Command|Target| Value | 説明 |
|:-----------------|:------------------:|:------------------:|:------------------:|
| times  | 5 |  空  | 繰り返し（Targetの回数）,indexは不明 |
| store           |            taro |       name       | 変数に値格納、使用時は${name} |
| store    |  ${name}さん |        name        | 文字の結合、 １つ上と合わせるとtaroさんとなる|
| execute script   |  return Number(${seq})+1 |  seq |　seqに加算、seqはstoreとかである前提 |
| wait for element present | css=.user > .name |       3000       | 指定したセレクタの出現待ち。ajaxとかで非同期の時に、処理を待ちたくて組み合わせた |

##まとめ
やりたい事は簡単なのに、表の内容がわからず調べるのにかなり時間がかかりました。
わかれば後は組み合わせるだけで、大した事ないんですけどね。
※参考はどこか忘れちゃったので、次に書くときがあれば入れればと。
引数がいくつ入るか分からない場合2 **kwargs 可変長引数

引数がいくつ入るか分からない場合 *args 可変長引数は、
タプルでしたが、
キーワード引数を辞書化して同じ様な処理をする。

```py:辞書
def players(**kwargs):
    for k, v in kwargs.items():
        print(k + 'は' + v + 'です。')

d = {
    '太郎':'勇者',
    '次郎':'戦士',
    '三郎':'魔法使い',
    '四郎':'僧侶'
}

players(**d)
```

先程と同様、辞書dを
**dで展開し、
players関数に渡す。
**kwargsで辞書化。
そして、
その辞書kwargsを
for k, v in kwargs.items():
        print(k + 'は' + v + 'です。')で
利用。

```:辞書の実行結果
太郎は勇者です。
次郎は戦士です。
三郎は魔法使いです。
四郎は僧侶です。
```
【初心者】Java　メソッド／クラス／外部ライブラリ【備忘録２３】

##Java
###メソッド
基本的にクラスの中で定義する。処理をそれぞれまとめた部品のようなもの。
【例】

```java
public static void hello();{
 System.out.println("Hello World");
}
```

public...voidまでは定型文として、一度覚えておく。

###引数
メソッドに与える追加情報のこと。

先ほどのhelloの後の()の中に
「(String name)」など引数を渡すことができる。

複数の引数を渡す際は「(String name,int price)」...と書く。
1つ目を第1引数、2つ目を第2引数と呼ぶ。

###戻り値
メソッドの呼び出し元にて、結果を使用したい場合に用いる。
ちなみに、今まで使用していた「public static void..」のvoidは
戻り値なし、という意味なので覚えておく。
【例】

```java
....

public static void main(String[]args){
 String name=fullName("Yamada","Taro") /*←ここのfullName忘れないように注意！*/
 printData(name,27);
}

public static void printData(String name,int age){
 System.out.println("私の名前は"+name);
 System.out.println("私の年齢は"+age);
}

public static String fullName(String firstName,String lastName){
 return firstName+lastName; 
}

```

###クラス
今までmainメソッドと並列して、たくさんのメソッドを作ったが
並列が多すぎて見にくくなってしまうので、クラスを使用する。
そのために、他のクラスのメソッドを呼び出すことが必要になる。
【例】

```java
/*Mainクラス*/

class Main{
 public static void main(String[]args){
  Person.hello();
 }
}

/*Personクラス*/

class Person{
 public static void hello(){
  System.out.println("こんにちは");
 }
}

```

Mainクラス→実行クラス
Personクラス→ロジック(論理クラス)
と分けると役割が明確になりやすい。

###外部ライブラリ
他の人が作ったクラスをインポートを用いて利用することが可能。
例えばメジャーな例として、数学的なメソッドを持つMathというクラスがある。
それを読み込むには、クラスの↑で
「import java.lang.Math;」と書く必要がある。
※Mathに関しては、メジャーなため、インポートしなくても自動で読み込まれる。

【例】引数の２つの数値の大きい方を返してほしい時の書き方

```java
import java.lang.Math;
class Main{
 public static void main(String[]args){
  int max=Math.max(3,8);
  System.out.println("最大値は"+max+"です。");
 }
}
```

【例】引数の小数点以下を四捨五入して、切り捨てる場合の書き方

```java
/*...前省略...出力部分のみ*/
("BMIは"+Math.round(bmi)+"です。");
```

###Scanner
コンソールに入力された文字列を受け取ることが可能。

```java
import java.util.Scanner;
class Main{
 public static void main (String[]args){
  Scanner scanner=new Scanner(System.in);
  /*↑Scannerの初期化*/
  System.out.print("名前：");
  /*ここで実行が一旦ストップされ入力を待つ状態になる*/
  String name=scanner.next();
  /*ここのscannerは小文字！「.」を忘れない！　↑で入力された文字列を呼び出す*/
  System.out.println("名前は"+name+"です");

```

他に
scanner.nextInt();で整数。
scanner.nextDouble();で小数を受け取ることができる。

##振り返り
メソッドの分け方や、戻り値を自身で書く際に
順序よく書かないと、ごちゃっとしてしまうので
ひとつひとつ理解しながら進めていかなくてはいけない。
まだ慣れていない部分が多々あるので、Progateの道場モードに
時間を空けて何度かチャレンジしようと思います。
GoでSSO

## やりたいこと

やりたいこととしては、GSuiteのアカウントで認証を一元管理したいなと。

そこでGsuiteのSSOを試してみたところ、色々と苦戦したので共有がてらに。

golangでSSOを試したかったのでその時のメモとして。

## 試しメモ

使ったライブラリはこれ

https://github.com/russellhaering/gosaml2

Gsuiteの設定はqiita teamのSSOから参考に

https://teams.qiita.com/help/sso/configuring-sso-with-gsuite/


https://github.com/galigalikun/saml-go/blob/master/main.go

試したコードはこれ

Gsuiteの「ACS の URL * 」を、「AssertionConsumerServiceURL」にして
「エンティティ ID *」を「AudienceURI」にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27299/ea2a404b-cf96-2cef-5f16-fe58288ec112.png)



```
sp := &saml2.SAMLServiceProvider{
    IdentityProviderSSOURL:      metadata.IDPSSODescriptor.SingleSignOnServices[0].Location,
    IdentityProviderIssuer:      metadata.EntityID,
    ServiceProviderIssuer:       "saml-test",
    AssertionConsumerServiceURL: "https://localhost:8080/saml/consume",
    SignAuthnRequests:           true,
    AudienceURI:                 "https://localhost:8080/saml/metadata",
    IDPCertificateStore:         &certStore,
    SPKeyStore:                  randomKeyStore,
    AllowMissingAttributes:      true,
}
```

あとは、
BuildAuthURLでredirectさせて、認証したらAssertionConsumerServiceURLにPOSTされるのでparseするだけ

githubの方では色々と書いてあるけど、callbackされたところは

```
http.HandleFunc("/saml/consume", func(rw http.ResponseWriter, req *http.Request) {
    fmt.Println("aaaa")
    err := req.ParseForm()
    if err != nil {
        fmt.Println("ParseForm")
        rw.WriteHeader(http.StatusBadRequest)
        return
    }

    assertionInfo, err := sp.RetrieveAssertionInfo(req.FormValue("SAMLResponse"))
    if err != nil {
        fmt.Println("RetrieveAssertionInfo")
        fmt.Println(err)
        rw.WriteHeader(http.StatusForbidden)
        return
    }

    if assertionInfo.WarningInfo.InvalidTime {
        fmt.Println("InvalidTime")
        rw.WriteHeader(http.StatusForbidden)
        return
    }

    if assertionInfo.WarningInfo.NotInAudience {
        fmt.Println("NotInAudience")
        rw.WriteHeader(http.StatusForbidden)
        return
    }

    fmt.Fprintf(rw, "NameID: %s\n", assertionInfo.NameID)

    fmt.Fprintf(rw, "Assertions:\n")

    for key, val := range assertionInfo.Values {
        fmt.Fprintf(rw, "  %s: %+v\n", key, val)
    }

    fmt.Fprintf(rw, "\n")

    fmt.Fprintf(rw, "Warnings:\n")
    fmt.Fprintf(rw, "%+v\n", assertionInfo.WarningInfo)
})
```

ValidateEncodedResponseとかはRetrieveAssertionInfoの中身をそのまま、どこでerrになるのか確認するためのprint debugです。

あとはここで、認証情報をセッションとかで保存しておけばやりたかったことが完成。
外部テナント上のAzure Machine Learningへの接続

#はじめに
開発用テナントなど、外部のテナントでAzure Machine Learning (以下、AML)にAML SDKから接続する場合にひと手間必要だったためメモ

[参考リンク](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.workspace(class)?view=azure-ml-py)

#コード
 - 通常のAML接続
 - 対処方法

##通常のAML接続

チュートリアルとかだとこのような形です。

```python:py
ws = Workspace.from_config()

```

この時、AMLが外部にAzureAD環境だと失敗します。

##対処方法
ひと手間加えて、以下のように一度テナントを指定して認証しておきます。

```python:py
from azureml.core.authentication import InteractiveLoginAuthentication
auth=InteractiveLoginAuthentication(force=True, tenant_id="<Tenant ID>")
```

認証をパラメータに渡せばOK

```python:py
ws = Workspace.from_config(auth=auth)

```
WOWZAの視聴者数（接続数）をGoogle Analyticsで見る


JAVA使わない勢には、WOWZAのIDEって、面倒ですね。
WOWZAの同時接続数、いちいちWOWZAの管理画面にアクセスしないといけないので、
他の人にチェックしてもらうには、設定いじられたらと思うと、少しハードルが高いです。

公式を探したら、アクセス数をアナリティクスで見る設定方法があったので、
投稿しておきます。

###条件
・Wowza Streaming Engine™4.0.0以降
→ブラウザの管理画面、HOMEを見ればバージョンが書いてあると思います。
Wowza Streaming Engine Pro 4 for Amazon EC2 4.4.1 build17882 License
の場合は、4.4.1ですね。



###手順
・google analyticsの作成
GOOGLEアナリティクスで、トラッキングIDというものを生成します。
１アカウント名はなんでもよし。
２データ提供系のチェックはお好みで。僕は全部つけたままにしました。
３ウェブを選択。（AWSのインスタンスにWOWZAがのってるタイプを使用しています）
４ウェブサイトの名前も、なんでもよし。
５WEBサイトのURLは、使うサーバーを指定します。ドメインでもIPでも大丈夫です。一瞬、ルートにアクセスしても、「ワウザ！」みたいな文字列が出るだけなので大丈夫かなと思いますが、ルートにいくアドレスだけで大丈夫です。

作成すると、トラッキングIDが出てきます。


・ツールをDL、サーバーにアップロード

[公式ツールダウンロード](https://www.wowza.com/downloads/forums/collection/wse-plugin-analytics.zip)

フォーラムに１．１．０とか謎のバージョンが投稿されていますが、
2016年版なので、これが最新なはず。
解凍したら、 wse-plugin-analytics.jarというファイルを、winSCPなりコマンドなりで、
サーバーのwowza streaming engine 4.ほにゃらら / libの中にアップロードします。
このフォルダの中にはほかにも.jarのファイルがあります。
なお、サーバー内に、ワウザフォルダが２個あったのですが、1個はショートカットだったので、
たどり着いたlibに入れれば大丈夫です。


・WOWZA管理画面での設定
管理画面にログインしたら、アプリケーションタブを開きます。
既に使っているストリーミングであれば、LIVE APPLICATIONが左に表示されているとおもうので、
そのアプリケーション名をクリックします。

そうすると、中央のタブに、プロパティとモジュールというタブがあります。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156691/8f6c08bc-90d8-fde6-89dc-494b38de0fbe.png)

まずモジュールのタブを押して、EDITをクリック。
Add Modulesをおしたら、下記を入れます。

Name：　ModuleAnalytics
Description：　Sends statistics to Google Analytics.　（多分何でもいい）
Fully Qualified Class Name：　com.wowza.wms.plugin.Analytics

こんな画面になるので、Saveを押します。
　![22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156691/35c679e0-9cd3-8ca8-be56-58c69ebc274a.png)



つぎにプロパティタブを開きます。
一番下の方までスクロールすると、
Customという項目があるので、ここに値を追加します。
Editをおして、Add Custom Propaty

Path：　/Root/Application　（そのまま）
Name：　wowzalyticsGACode
Type：　String　（そのまま）
Value：　アナリティクスでゲットしたトラッキングID（UA-〇〇〇〇-〇）

こんな感じになるのでsave。
![33.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156691/6c795b07-cec6-3558-8ec2-47c5f8384c4f.png)


restart now を押します。
そのあと、一応サーバーも再起動。

そうすると、アナリティクスのホーム画面でアクセス数が見れるようになっています。
ストリーミングサーバーに誰かアクセスしていないと、アナリティクスの画面に何もでてこないので注意です。
WOWZAのアプリケーション画面で、テストプレイヤーとかで開けば自分で１アクセス付けられます。
WOWZAのモニタリングのconnectionsが１になっていることを見てから、確認してみてください。

WOWZAからデータを送信して、GAで受け取っているだけなので、
プログラムやってない人にアカウントを渡しても安心です。


もっといろいろなプロパティを取りたい人は、公式を見てみてください。
[WOWZA公式](https://www.wowza.com/docs/how-to-send-connection-and-stream-statistics-to-google-analytics-analytics)




以上、WOWZAをグーグルアナリティクスにつなぐ方法でした。
[漏洞通告]CVE-2019-19781/Citrix ADC&NetScaler存在目录遍历

### 漏洞描述
在`Citrix ADC&NetScaler`的10.5、11.1、12.0、12.1、13.0等版本中，被发现存在目录遍历.该漏洞可允许未授权访问服务器上的一些文件.目前该漏洞POC已经公开于互联网并存在在野利用的情况.
### CVE编号
CVE-2019-19781
### 漏洞威胁等级
高危
### 影响范围
10.5
11.1
12.0
12.1
13.0
### 漏洞验证
使用公开的payload进行验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/3be72da8-0039-2c6c-d438-845e034a4446.png)
### 修复建议
参考官网：https://support.citrix.com/article/CTX267679
### 时间轴
[0] 2019/12/27 NVD发布该漏洞
[1] 2020/01/09 亚信安全网络攻防实验室根据公开POC复现该漏洞并发布漏洞通告
### Reference
https://nvd.nist.gov/vuln/detail/CVE-2019-19781
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-19781
DjangoでWebアプリケーション作成

DjangoでWebアプリを作りたい。しかしできることが広すぎる上、個々のコンセプトに慣れなければならないので大変。

このページは恐らく、[公式のチュートリアル](https://docs.djangoproject.com/en/3.0/contents/)をやりながら、Djangoのコンセプトを覚え書き的に書いていくところになると思う。

## Djangoとはそもそも何なのか

Djangoは、PythonでWebアプリケーションを作成するためのライブラリのひとつ。メインの機能として、以下のものがある：

1. **ルーティング**：指定されたURLから、特定のPython関数に結びつける
2. **レンダリング**：テンプレートを用いたりして、Python関数から動的にHTTPレスポンスを生成する
3. **O/Rマッピング**：バックエンドとなるデータベースから、個々のレコードをPythonのオブジェクトとして取り出す

早い話が、MVCフレームワークを利用したWebアプリケーション作成用ライブラリ。ちなみに、このうちレンダリングのモチーフだけ分離したのがJinjaになるので、このあたりの表現方法はJinjaとよく似ている。

似たような(?)ルーティングライブラリであるFlaskと違ってデータベースI/Oやユーザ認証等の機能が充実しているので、ちょっと凝ったアプリケーションを手っ取り早く作りたい場合には便利。ただしそのぶん内部のモジュールがやたら多いので、シンプルな機能だけでよい（ただJSONを返すだけとか）ならFlaskの方がわかりやすいかもしれない。

Herokuでも使える（はず）。

## プロジェクトとアプリケーション

手っ取り早い理解としては：

- **プロジェクト**：作ろうとしているアプリの領域全体を指す言葉
- **アプリケーション**：アプリの内部に作る、個別のドメイン

たとえばCMSのようなサービスの場合、一つのサービスの中にWikiとブログ、チャットといった別々の機能を盛り込むことがある（それがデザイン的にどうかは別として）。このような場合の個別の機能に対応するのがアプリケーションと言える。

あるいは別の可能性として、マイクロサービス的な実装方法としてアプリケーションを捉えることもできるかもしれない（ただDjangoは基本的にはO/Rマッパーなので、そのようなデザインはあまりうまくいかないのではないかと思う）。

プロジェクトもアプリケーションもDjangoではPythonのモジュール・サブモジュールとして表現され、両方がMVCのまとまりとして個別にできるようになっている。一般的にはルーティングにおいて、プロジェクトがサービスの`/`（ルート）URLに対応し、個々のアプリはその下に`/<app-name>/...`のようなURLでぶら下がる形にすることが多い。

### プロジェクトの操作

ひとつのサービス（プロジェクト）を開発し始める場合、まずプロジェクトのボイラープレートを作る：

```bash
gwappa: myrepo$ django-admin startproject <project-name>
        # カレントディレクトリの下に<project-name>というディレクトリが作成され、
        # その中に基本的なファイルが書き込まれる
```

以降のプロジェクト操作は、`startproject`で作成した`<project-name>`ディレクトリの中にある`manage.py`というファイルを用いて行う：

```bash
# 上の操作の続き
gwappa: myrepo$ mv <project-name> src # 外側のディレクトリは、名前を変えても問題ない
gwappa: myrepo$ cd src
gwappa: src$ python manage.py ... # プロジェクトの操作
```

### アプリケーションの作成

`manage.py`から、`startapp`なるコマンドを使う：

```bash
gwappa: src$ python manage.py startapp <app-name> # アプリごとの一意な名前
```

これによって、プロジェクトディレクトリの中に`<app-name>`ディレクトリが作成され、ボイラープレートのファイルが配置される。
Cognos ユーザーのタイムゾーンに応じた現在時刻の表示

#ユーザーのタイムゾーンに応じた現在時刻の表示
こんな感じに、レポートを実行した時刻をレポート上に表示したい時があります。
<img width="468" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6590a884-d012-5437-0b33-039261bca19b.png">

これは、localtimestamp という関数で表示しているのですが、この関数はデータベース・ソフトウェアを実行しているサーバーの現在時刻を返します。

ところでCognosにはユーザー毎に「タイム・ゾーン」の情報を持っているので、ユーザーのタイムゾーンに応じた「現在時刻」を表示したい、という要件がありますが、localtimestampでは常にサーバー時間なので、ユーザーのタイムゾーンなどお構いなしです。
<img width="250" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/18a0165a-e83a-371e-0335-7fb43c13eac1.png">

何とかこの要件を実現できないだろうか、という時に役立つ実装です。

#実装
まず、レポート実行ユーザーのタイムゾーンは以下で取得できます。※「TimeZone」というデータアイテムで作成

```html
#sq($account.personalInfo.timeZoneID)#
```

この様に「_shift_timezone」関数を使う事で、東京のタイムゾーンから、各ユーザーのタイムゾーンに時刻変換します。※「TimeZoneTime」というデータアイテムで作成

```html
_shift_timezone (localtimestamp,'Asia/Tokyo',#sq($account.personalInfo.timeZoneID)#)
```

レポートにこの様にシングルトンで配置して。
<img width="272" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ac4a195a-8d64-8e2f-d465-ca318befd916.png">

先程のニューヨークユーザーで実行すると、ニューヨーク時間の表示になります。
<img width="471" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/09e4f537-6427-9fd5-5754-21ca4ce3b142.png">

ユーザーのタイムゾーンで時刻表示したい、という要件があった場合、是非思い出してご活用下さい。
300万IDデータのループ処理に苦労している話

## ■目的
300万個のIDそれぞれに対して、１ヶ月分のデータが用意されている
データの中身は、説明変数と目的変数が１つずつ。
つまりテーブルのカラムは、ID、説明変数x、目的変数yの３つ
レコード数は300万×30日 ≒ 9000万

この時、300万のIDそれぞれに対し、30日分の説明変数と目的変数の単回帰を行い、
アウトプットとしてそれぞれのIDに対して相関係数、傾き、p値を格納したい。

##■方針
300万のIDに対し、forループの中で回帰を行い、結果をリストとして格納
最後にリストを結合してデータフレームとする。
[この手法の速さに関してはこちらを参照](https://qiita.com/studio_haneya/items/35951c56decd212ba41e)

##■環境
- EC2インスタンス(ubuntu: r5d.4xlarge)
- JupyterLab 0.35.3

##■課題
単純にデータフレームから各IDに対応するレコードをクエリ抽出すると、時間がかかる（1idあたり約13秒）

```python:code1.py
for id in id_list:
    tmp_x = df[df.id == id].x
    tmp_y = df[df.id == id].y
```
##■解決策
- idをindexにしdf.loc[]で抽出することで高速化 (1idあたり約3.9秒)

```python:code2.py
df.index = df.id
for id in id_list:
	tmp_x = df.loc[id].x
	tmp_y = df.loc[id].y
```
- 上記と合わせて、pandasデータフレームの代わりにdaskデータフレームを使用 (1idあたり1.7秒)  
[※daskとはなんぞや](https://qiita.com/simonritchie/items/e174f243bc03fb25462e)

```python:code3.py
import dask.dataframe as dd
import multiprocessing

df.index = df.id
# 現環境では cpu_count = 32
ddf = dd.from_pandas(df, npartitions=multiprocessing.cpu_count())
for id in id_list:
	tmp_x = ddf.loc[id].x.compute()
	tmp_y = ddf.loc[id].y.compute()
```
##■結論
まだ遅い。これだと全データの処理が完了するのに２ヶ月かかってしまう。。

##■今後の予定
現状、１つのIDにつき30レコードが格納されている状況であるのを、30日分のデータをリストとして１セルに格納することで1IDにつき1レコードにする
こうすることで、ループ処理に内包処理が使用できるため、処理速度の向上が望める可能性がある。
(ただしそもそも30レコード → 1レコードへの変換にどれだけ時間がかかるか。。。 pivot_tableですんなりいってほしい)
pipenvでパッチバージョンまで指定する

`pipenv --python 3.7.2` などとしてパッチバージョンまで含めてpipenvの仮想環境を作っても,
Pipfile に入るPython指定バージョンはマイナーバージョンまで. 「3.7」までしか入りません.

```shell
% cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.7"
```

このPipfileから環境を再現しても, 3.7.2の仮想環境が作られることは保証されません.

そこで Pipfileのなかの `python_version = "3.7"` を `python_full_version = "3.7.2` に置き換えてやると, パッチバージョンまで含む仮想環境を再現できるようになります [^1].

普段使いでここまで細かいバージョンを問題にすることはあまりないですが, 実務においてはちょっと気になる話でした.

[^1]: `python_version` と `python_full_version` を同時に指定するとエラーになる
画像の一部を隠したいときにvwを使うと便利

# はじめに
後輩から教えてもらって非常に感動したテクニックのメモです。
人の写真の胸から上、など画像の一部だけ表示したい場合のテクニックです。

## ググると出てくるテクニック
少しググると以下のような記事にたどり着きます。
https://stackoverflow.com/questions/11092146/how-to-hide-part-of-the-image

<pre>
HTML:
&lt;div class="image-container"&gt;
  &lt;img src="some-image.jpg" /&gt;
&lt;/div&gt;

CSS:
.image-container {
  max-height:100px;
  overflow:hidden;
}
</pre>

画像をdivで包んでしまい、
親要素のハイトをピクセル単位で絞ってしまい、
はみ出した分は非表示とするやり方です。

これでも十分なのですが、イメージのwidthが100%などになっているといった
ディスプレイサイズに画像の大きさが依存する場合、うまく行きません。

## 結論

heightの値をピクセルでなくvw単位で実装します。
<pre>
HTML:
&lt;div class="image-container"&gt;
  &lt;img src="some-image.jpg" /&gt;
&lt;/div&gt;

CSS:
.image-container {
  max-height:40vw;
  overflow:hidden;
}
</pre>

実際の値はデベロッパーツールを使って調整します。
これで、ディスプレイのサイズに寄らず、画像の一部を隠すことができます。
プログラミング言語（ruby）学んでみて

プログラミング言語に初めて触れました。


ルービー、サファイアと聞くと美しい宝石を思い浮かべます。
ですが、学びが浅すぎて、まだrubyのもつ言語の美しさに気付けていません。。


マークアップ言語とrubyの初歩を学んだばかりですが、自分なりに感じたことを述べます。数ヶ月経つとrubyという言語に対する感じ方も変わってくると思いますので。
プログラミングを学んでからまだ数日しか経っていない、本当の初学者としての受講生の気持ちに寄り添えるように、アウトプットとして残しておきます。

まず、
暗記しようとしないほうがいいのかも、ということです。

初めて出てくる単語やルールを全てくまなく覚えようとすると精神的負荷が高い。
本質的な部分を学ぶ労力が削がれる気がしました。
ですので、理解に重点を置いて、単語やルールは出てきた度に慣れながら覚えていこうと思います。

次に、
いま何をやっているかが分からくなりそうになる、ということです。
木を見て森を見ず、という言葉がありますがまさにそうでした。
でも、森を見すぎても分からないので、林を見つつ、木をこなしていきたいと思います。

森　⇄　林　⇄　木

お手本をただただ模写するのでは学習効果が薄い気がしています。
自分なりにコードの区切りや意味を唱えながら一行づつ打ち出すべきなのかもしれません。

いま学んでいる時の感情や考えを忘れず今後に生かしていきたいと思います。
終わり。
KubernetesにHelm3を使ってPrometheusとGrafanaをデプロイする

Helm3を使ってPrometheusとGrafanaをデプロイします。

## prometheus-operator helmチャートをインストールする

```
helm repo add stable https://kubernetes-charts.storage.googleapis.com
```

```
helm search repo stable/prometheus-operator
```

```
helm install my-prometheus-operator stable/prometheus-operator
```

## 配置されたpodsを確認する

```
kubectl --namespace default get pods -l "release=my-prometheus-operator"
```

## GrafanaのUIを表示する

```
kubectl port-forward $(kubectl get pods --selector=app=grafana --output=jsonpath="{.items..metadata.name}") 3000
```

open http://localhost:3000/

## References

* https://helm.sh/blog/helm-3-released/
* https://github.com/helm/charts/tree/master/stable/prometheus-operator
mongodbメモ

#ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=1/FAILURE)
エラー該当のディレクトリとファイルを作成して権限を付与する。

```
sudo chown -R mongodb:mongodb /var/log/mongodb
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chmod -R 755 /var/lib/mongodb
sudo chmod -R 755 /var/log/mongodb
```
[MySQL] インストール（Windows）

##MySQLが使えるようになるまでの流れ
①インストーラをダウンロード
②MySQLインストール
③環境変数設定
④動作確認

##手順
###インストーラをダウンロード
以下のサイトからダウンロードする。
・http://dev.mysql.com/

左の「MySQL Downloads」から該当のものを選択。私は「MySQL Installer for Windows」を選択したので、これで話を進める。
右側の「Download」ボタンをクリック。アカウントを持っていない方は、左下の青文字「No Thanks, just start my download.」で
ダウンロード開始。

###MySQLインストール
上記でダウンロードしたインストーラを実行。
選択肢がいろいろあるが、全て「next」、「execute」して進めても問題なかった。
途中パスワードの入力を求められる。MySQLにログインするとき必要なので忘れないように。（変更手段もあるが少し面倒そうであった）

**「Finish」するとデフォルトで立ち上がってくるが、消しておけばよい。**

###環境変数設定
MySQLのPathを設定する。よくわからない方は以下が参考になる。
https://webkaru.net/mysql/windows-confirmation/

###動作確認
コマンドプロンプトを立ち上げる。MySQLにログインするために以下を実行。

~~~
C:¥user>mysql -u root -p
~~~

するとパスワード入力を求められるので、インストールで設定したパスワードを入力。

~~~
Enter password: ここにパスワードを入力
~~~

mysql> が表示されれば成功。切断する場合はquitコマンドを使う。

~~~
mysql>quit
Bye
~~~

##困ったところ
インストール後デフォルトで立ち上がる画面でsqlを実行しようとしてもできなかった。またそれを立ち上げたまま、新たなコマンドプロンプトでログインできなかったので注意したほうが良い。

##感想
変なところで時間を食ったが、簡単に取り入れられるので是非皆さんにも試してほしい。

##参考URL
・MySQLのダウンロードとインストール - Windows環境
https://webkaru.net/mysql/install-windows/
PHPの関数(引数と戻り値)

```
<?php
// 関数の作成

function sum($a, $b) {
    echo $a + $b;
}
```
関数sumの完成！


##関数の呼び出し

```
sum();

```
※()を忘れないように注意。
関数を変数として定義。

```
$num1 = sum(3, 2);
echo $num1."\n";
```
```
$num2 = sum(300, 400);
echo $num2."\n";
?>
```

関数はとっても便利！

ちなみに、　"\n"はテキストでの改行を表しています。


参考になるWEBページ：https://www.php.net/manual/ja/functions.user-defined.php
ABC125_C - GCD on Blackboard[Pythonで解いたメモ]

・[ABC125_C - GCD on Blackboard]
(https://atcoder.jp/contests/abc125/tasks/abc125_c)

N個の整数 A1,A2,....Anが入力される。
内1つを任意の整数に置き換えてみた時、N個の整数の最大公約数は幾らになるかという問題

まあよくわかんねーけど１個ずつ数字潰してgcdぶん回したら解けるやろｗをした結果・。・....



# ダメな解法

何も考えずにとりあえずオレオレ実装した結果、潰す数字を変える毎に何度も端から端までgcdぶん回す事で計算量が凄いことになり頭がおかしくなって死ぬコードを書いてしまった図

```Python
    import sys
    input = sys.stdin.readline
     
    import numpy as np
    import fractions
    from functools import reduce
     
    from copy import deepcopy
     
     
    def gcd_list(nums):
        return reduce(fractions.gcd, nums)
     
    def main():
        N = int(input())
        A = np.array(sorted(list(map(int, input().split()))))
     
        bools = np.ones(N, dtype=bool)
     
        ans = 0
        vals = []
        for i in range(N):
            A_cop = deepcopy(A)
            bl_cop = deepcopy(bools)
     
            fal = [i]
            bl_cop[fal] = False
     
            vals.append(gcd_list(A_cop[bl_cop]))
     
        print(max(vals))
     
    main()
```


＞突然のTLE＜



# よい解法

潰す数字をAiと置き、区間[A0,Ai)と区間(Ai,An]のそれぞれについて最大公約数をそれぞれ求める。
更にその2数の最大公約数を求めることでAiを潰した時に取れる最大公約数が分かるのでこの操作を全ての整数に行った後に最大の最大公約数（ゲシュタルト崩壊感）を取り出せばオッケー

キモになるのはこの方法を用いるとAiを挟み込む2つの区間の最大公約数を求める時に、1つ前のAiの最大公約数を計算した時に使った数値を持ち越して使用できるため、いちいち端から端まで何度も計算する必要がないということ

累積GCDって言うらしい
（まだ累積和にブチ当たってすらない）

```Python
    import sys
    input = sys.stdin.readline
    import fractions
    
    
    def main():
        N = int(input())
        A = list(map(int, input().split()))
    
        L_gcds = [0] * N
        L_gcd_tmp = L_gcds[0]
        for i in range(1, N):
            L_gcd_tmp = fractions.gcd(L_gcd_tmp, A[i-1])
            L_gcds[i] = L_gcd_tmp
    
        R_gcds = [0] * N
        R_gcd_tmp = R_gcds[0]
        for j in range(1, N):
            R_gcd_tmp = fractions.gcd(R_gcd_tmp, A[N-j])
            R_gcds[j] = R_gcd_tmp
        R_gcds.reverse()
    
        LR_gcds = [0] * N
        for k in range(0, N):
            LR_gcds[k] = fractions.gcd(L_gcds[k], R_gcds[k])
    
        print(max(LR_gcds))
    
    main()
```


# 学び

- 制約はちゃんと見ようね
- オレオレ実装する前に計算量をちゃんと考えよう
γ変換に関しての備忘録

γ変換で画像の明るさを変化させる。


```python
#ライブラリをインポートする
import cv2 
import numpy as np
```

今回はLennaの画像を用います。
![Lenna.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515507/f2bbd525-3c22-0569-ee6a-0c1ee3b7c9c7.jpeg)

```python
img = cv2.imread(r'../Lenna.jpg')
```
γの値を設定し、γ変換を行っていきます。

```python
gannma = 0.5
cvt_gannma = np.zeros([256,1],dtype=uint8)
for i in range(256):
    cvt_gannma[[i],[0]] = 255 * (float(i) / 255) ** (1.0/gannma)

img_gannma = cv2.LUT(img,cvt_gannma)
```
γ変換の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515507/92614ea4-b484-e483-290d-0396618c64d9.png)
【TypeScript】文字型の数値を文字型のまま減算する処理

`"12345678901234567890"`のように桁数が多い数値の場合、

```ts
Number("12345678901234567890") === 12345678901234567000 // true
```
となってしまいます。

自分の作っているアプリでこのような桁の大きい文字型の数値から1だけマイナスしたかったので下記のような関数を作りました。

```ts
export const decrease = (snowflake: string): string | null => {
  if (!/^([1-9]\d*|0)$/.test(snowflake)) return null;

  let i = 1;
  while (snowflake[snowflake.length - i] === "0") { i++; }

  const tail = snowflake.slice(-i);
  let tailDec = String(Number(tail) - 1);
  if (tailDec.length < tail.length) tailDec = "0" + tailDec;

  return snowflake.slice(0, -i) + tailDec;
}
```

```ts:実行
console.log(decrease("12345678901234567890"));
// 12345678901234567889
```
箱玉系（ソリトン Cellular Automaton）

```hs
import Data.List (span)


main = mapM_ (putStrLn . draw) . take 20 . iterate step . initialize $ dat
  where draw = map (\n -> if n == 0 then ' ' else '■')
        dat = [1,2,3,7,8,12,13,18]


initialize :: [Int] -> [Int]
initialize = ini [] (-1)
  where ini acc _ [] = reverse acc
        ini acc prev (x:xs) = ini (make (x-prev)++acc) x xs
        make n = (1:) . take (n-1) . repeat $ 0

step ns = step' [] ns 
  where step' acc [] = reverse acc
        step' acc (x:xs) = case x of
          0 -> step' (0:acc) xs
          2 -> step' (1:acc) xs
          1 -> step' (0:acc) $ balls ++ (2:drop 1 boxes)
            where (balls,boxes) = span (/= 0) xs
            


```

実行結果

```
 ■■■   ■■   ■■    ■
    ■■■  ■■   ■■   ■
       ■■  ■■■  ■■  ■
         ■■   ■■  ■■ ■■
           ■■   ■■  ■  ■■■
             ■■   ■■ ■    ■■■
               ■■   ■ ■■     ■■■
                 ■■  ■  ■■      ■■■
                   ■■ ■   ■■       ■■■
                     ■ ■■   ■■        ■■■
                      ■  ■■   ■■         ■■■
                       ■   ■■   ■■          ■■■
                        ■    ■■   ■■           ■■■
                         ■     ■■   ■■            ■■■
                          ■      ■■   ■■             ■■■
                           ■       ■■   ■■              ■■■
                            ■        ■■   ■■               ■■■
                             ■         ■■   ■■                ■■■
                              ■          ■■   ■■                 ■■■
                               ■           ■■   ■■                  ■■■
```
[UE4]StompMallocを使ってメモリ破壊バグを調査しよう！

#不定な位置でクラッシュする・・・
クラッシュが発生するけど、発生位置が不安定、メモリの解放時にエラーに引っかかるなどの場合、 *メモリ破壊* が起こっていることがあります。

こういうコードで発生します。

```c++:bufferoverrun
void AStompSampleCharacter::Jump()
{
	Super::Jump();
	const int32 ArraySize = 32;
	TArray<int32> Array;
	Array.SetNum(ArraySize);
	Array.Shrink();
	const int32 ArraySizeAsByte = sizeof(int32) * ArraySize;
	int32 *Top = Array.GetData();
	for (int32 Index = 0; Index < ArraySizeAsByte/*おおっ*/; Index++)
	{
		Top[Index] = Index;
	}
}
```

このような不正な処理をおこなった位置で止まってくれれば簡単に修正が可能ですが、
全く関連性のないところで突然で不正な処理が報告されるとなかなか追跡が難しかったりします。
そんなときに役にたつのが **StompAllocator** です！

#まずは関連情報です

この機能をpullrequestしてくれたPabloさんのブログ
https://pzurita.wordpress.com/2015/06/29/memory-stomp-allocator-for-unreal-engine-4/


メモリ破壊：見つけにくいクラッシュを見つけて修正
https://www.unrealengine.com/ja/blog/memory-corruption-finding-and-fixing-elusive-crashes

[UE4] Memory Allocationについて
https://qiita.com/EGJ-Yutaro_Sawada/items/4983d0ebfa945611d324

#どんなアロケータなの？
ひとつのメモリアロケーション要求に対してひとつの仮想ページを割り当てます。
そしてOSにメモリを開放するときに物理メモリだけを返却して仮想アドレスは予約状態を維持します。
これらの動作を図にすると以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/096cf19d-2a69-0a44-3fc8-c98ccf6cf49a.png)
**水色の部分、赤い部分を読み込んだり、書き込んだりすると例外が発生します。**
赤くなった部分(予約済みの部分)はそれ以降OSのアロケータが利用することはありません。
これらの動作によって不正なメモリアクセスを捕捉します。

#使い方
基本的には起動する際にコマンドラインオプションに `-stompmalloc` というオプションを追加することでアロケータを切り替えることが出来ます。
##Visual Studioから起動する場合
デバッガをつないだ状態で例外をトラップしたいのでこの方法がおすすめです。
UnrealVSがインストールしてあればVisualStudioのツールバーにこのようなCommandLineオプションの入力窓があるとおもいますので
ここに `-stompmalloc` を追加してあげるのが簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/8b8902b0-6896-c24c-a4b6-2905babd1d47.png)

注意としては大量のメモリを消費するため、PCに多めにメモリを積んであげてください。
メモリが少ないPCでこれを有効にすると大量のページアウト(スワップ)が発生して極端に動作が重くなってしまいます。

##エディタからのスダンドアローン実行

スタンドアローンボタンをぽちっとする前にオプションの詳細設定を開いて、追加の起動パラメータに追記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/dd0a2a26-c499-1876-1ee3-8ad2c8f71f01.png)
起動した後にVisualStudioからアタッチするのを忘れずに！

#結果
stompallocatorが有効になったあとはテストプレイを行うだけです。
うまく再現できるとこんな感じで不正アクセスの瞬間をとらえることができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/99ad88d2-6e5e-1cb4-b9fe-acfe27f55df8.png)

#参考ソースファイル

WindowsPlatformMemory.cpp
MallocStomp.cpp/.h
JavaScript 即時関数を使って変数の初期値を分岐する

constで変数の宣言時に初期値を代入する方法！　


# 即時関数とは
関数の定義時に実行される関数で以下が利用例。

```JS
var getValue = (function(){
    const a = 10;
    const b = 20;
    return a + b;
}());

// 引数もOK！
var getValue2 = (function(a, b){
    return a + b;
}(10, 20));
```

# やり方
```JS
// BEFORE : letで一度宣言する書き方
const score = getScore();
let grade;
if(score > 80){
  grade = 'Good';
}else if(score > 40){
  grade = 'Normal';
}else{
  grade = 'Bad';
}

// AFTER : 即時関数+constで初期値代入
const score = getScore();
const grade = (function (value){
  if(value > 80){
    return 'Good';
  }else if(value > 40){
    return 'Normal';
  }else{
    return 'Bad';
  }
}(score));
````

別にif文じゃなくてもswitch文でもOK

### 追記：アロー関数使う場合
```javascript
const score = getScore();
const grade = ((score) => {
  if(value > 80){
    return 'Good';
  }else if(value > 40){
    return 'Normal';
  }else{
    return 'Bad';
  }
})(score);