OmniAICreator/Qiita-1.07M huggingface dataset:
痒いところに手が届く！vbsのスクリプトの忘備録！

#vbsのスクリプトを使ってみる。

http://www.whitire.com/vbs/

https://tonari-it.com/vbs-get-filepath/


```vbs:エクスプローラー.vbs
Option Explicit
On Error Resume Next

Dim strFolderName   ' フォルダ名
Dim objShell        ' Shell オブジェクト

strFolderName = "C:\Temp"

Set objShell = WScript.CreateObject("Shell.Application")
If Err.Number = 0 Then
    objShell.Explore strFolderName
    WScript.Echo strFolderName & " を開きました。"
Else
    WScript.Echo "エラー: " & Err.Description
End If

Set objShell = Nothing
```


```vbs:複数実行.vbs
Option Explicit
Dim objWshShell
'シェルオブジェクトの作成
Set objWshShell = WScript.CreateObject("WScript.Shell")
'シェルの実行
objWshShell.Run "C:\e.vbs"
```



```vbs:IE複数起動.vbs
Option Explicit
    Dim objIE
 
    'オブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.Application")
    
    'IEを表示させる。Trueで表示
    objIE.Visible = True 
 
    '指定したURLを開く
    objIE.Navigate2 "https://news.google.com/news/?edchanged=1&ned=jp&hl=ja"
    '新しいタブで表示
    objIE.Navigate2 "https://weather.yahoo.co.jp/weather/", &H800
    objIE.Navigate2 "https://transit.yahoo.co.jp/", &H800
```




```vbs:ドラッグアンドドロップしたファイル名.vbs
Option Explicit        
 
    'ドラッグアンドドロップで取得したファイルパスを変数に入れる
    Dim GetPathArray
    Set GetPathArray = WScript.Arguments 
    
    'ファイルシステムオブジェクト
    Dim objFSO      
    Set objFSO = CreateObject("Scripting.FileSystemObject")              
    'イテレータ
    Dim pt
 
    'ファイルの数ぶんループする
    For Each pt in GetPathArray      
                        
        '取得したファイル名
        Dim FileName
        FileName = objFSO.GetFileName(pt)  
        
        'ファイルのフルパスをInputBoxで表示させる
        pt = InputBox("ドラッグアンドドロップしたファイル名 " & FileName,"ファイルのフルパスを表示", pt)        
    
    Next
    
    'オブジェクト変数をクリア
    Set objFSO = Nothing
```



```vbs:VBScriptでWEBスクレイピング！テーブル要素を取得してCSVファイルで書き出す.vbs
Option Explicit
 
    Dim objIE
    Dim objLink
 
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
 
    'IEを開く
     objIE.navigate "http://elze.tanosii.net/d/kenmei.htm"
     
    'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop    
    
    
    Dim objTr,objTh,objTd       
    Dim el
    
    'tr要素をコレクションとして取得して変数にセット
    Set objTr = objIE.document.getElementsByTagName("tr")          
    
    'テーブル要素をcsvファイルに書き出す
    For each el In objTr
        
        If instr(el.outerhtml,"<th>") > 0 then
            Set objTh = el.getElementsByTagName("th")
            OutputText objTh(0).innerText & "," & objTh(1).innerText & "," & objTh(2).innerText
        Else
            Set objTd = el.getElementsByTagName("td")
            OutputText objTd(0).innerText & "," & objTd(1).innerText & "," & objTd(2).innerText         
        End If        
    next 
 
'テキストファイルへ出力
Function OutputText(ByVal strMsg)
 
    Dim objFSO
    Dim objText
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    Set objText = objFSO.OpenTextFile("C:\work\テーブル要素の書き出し結果.csv", 8, True)
 
    objText.write strMsg    
    objText.write vbCrLf
 
    objText.close
    
    Set objFSO = Nothing
    Set objText = Nothing 
 
End Function
    Set objFSO = Nothing
```
Laravel Blade側でレコードの有無を判定

# Laravel Blade側でレコードの有無を判定


`isEmpty()`

controller側で投稿記事をDBから取得して、compaact('posts')としている。

blade側で、

    @if($posts->isEmpty())
        <h2>has no record</h2>
    @endif
これで、投稿がなければ「has no record」が表示される。
Intellij(JetbrainsのIDE)の参照機能で英語版ではなく、自動で日本語版サイトにアクセスする方法


#はじめに
IntelliJをはじめ、Jetbrains社のIDEを使用している方向けです。
いわゆる[shift+F1]の公式サイトへの参照機能ですが、通常は英語版サイトにアクセスされてしまいます。

これが英語弱者の私としては、結構面倒くさくて、日本語版の公式サイトにアクセスしてくれればよいのに。。
このモヤモヤを解決する方法をまとめてみました。

結論として、以下の方法です。

- デフォルトブラウザをChromeに変更
- Chromeのアドオン:Tampermonkeyをインストール
- 特定のURLを自動で一部書き換えて日本語サイトにリダイレクトする

公式サイトに日本語サイトが用意されていれば、pycharm、phpstorm、rubymineなど他のIDEでも有効な方法となります。
以下、私はintellijでpython開発、IDE自体を日本語化していますが、そちらをベースとして話を進めていきます。
みなさまの環境に読み替えて頂ければと思います。

#公式サイト参照機能のこと
「外部ドキュメント参照」のことで、
code上の調べたい関数などを公式サイトの任意の箇所にアクセスしてくれる機能のことです。

ズバリ、[shift + F1]ショートカットで実行できます。
メニューから辿れば、「メインメニュー > 表示　>　外部ドキュメント」となります。

#方法
###1 IntelliJのデフォルトブラウザをChromeにする。
IDEが直接開くブラウザにChromeを設定します。
「設定　>　ツール　>　Webブラウザ」から設定することができます。

###2 ChromeブラウザのアドオンにTampermonkeyをインストールする。
Chromeで以下のchromeウェブストアページににアクセス
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja
「Chromeに追加」ボタンをクリックしてTampermonkeyをChromeにインストールします。

###3 英語サイトURLと、日本語サイトURLの違いを確認
やりたい方法は
「英語サイトにアクセスしたら、その対応ページの日本語版にリダイレクト」するです。

ひとまずは英語サイト、日本語サイトのURLを確認してみます。
例として「int」 をshift + F1で公式サイトに参照してみました。

英語サイトが上のURL、下が日本語版のURLになります。
https://docs.python.org/3.7/library/functions.html#int
https://docs.python.org/ja/3.7/library/functions.html#int

お気づきだと思いますが、違いは 〜.org/　の後にja があるか無いかだけなのです。
つまり、`~org/~`を`~org/ja/~`とjaを挿入するだけです。
手作業でこれを毎回やってもいいのですが、結構めんどくさいので自動化してしまったほうがすごく楽です。　

ちなみに、pythonの公式ページを例として挙げていますが、実はこのような構造をしている公式ページは多いです。
ですので、一度慣れてしまえばpython以外のプログラム言語でも同じ方法を取ることができます。

###4 Tampermonkeyにコードを貼り付けて自動化する
では、ここからが本番。Tampermonkeyにコードを書いて自動化させます。

1. Chromeのメインメニュー右端のTampermonkeyのアイコンをクリック
2. 「新規スクリプトを追加」を選択
3. エディター内にjavascriptでコードを書く　※後ほど触れます
4. 「ファイル　>　保存」でスクリプトを保存する

以上。これだけでChromeでブラウジングする際に、様々な機能を実装することができます。
細かい使い方は割愛しますが、以下の記事がとても分かりやすいです。
https://rightcode.co.jp/blog/information-technology/tampermonkey-google-chrome-extended-function

私が追加したコードは以下になります。
「python公式ページ　英語→日本語版」

```js
//==UserScript==
// @name         Python English->Japanese
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Python official site is changed from English to Japanese
// @author       You
// @match        https://docs.python.org/*
// @grant        none
// ==/UserScript==
(function (){
 var newUrl = location.href;
 var regex = /https:\/\/docs.python.org\/ja\//;
 var result = regex.test(newUrl);
 console.log(result);
 if(!result){
   newUrl = newUrl.replace("https://docs.python.org/", "https://docs.python.org/ja/");
   if ( newUrl != location.href ) location.href = newUrl;
 }
})();

```

実際に、Intellijでshift+F1してみてください。
もしくは、上で触れた英語サイトURLを使って試してみてください。

Chromeで英語の公式ページにアクセスした直後に、自動で日本語版サイトにリダイレクトしてくれていると思います。
これで、素早く、クールにズボラ検索ができますねw

#まとめ
ちょっとしたことなんですけど、コレすっごく楽になります。
頻繁に「shift+F1」押す方は実感できるのではないでしょうか。

正直なところ、英語サイトがそのまま読めるのがベストだと思います。
ただ、それにこだわるあまりに、毎日の翻訳している時間がコーディングより長くなっていては。。本末転倒です。
要は使いどころかと考えています。
締め切りが近いなら翻訳して時間使うより、日本語でサクッと調べてコーディングに専念する。
それとは別に、英語は落ち着いてしっかりと勉強する。個人的にはそんな割り切りの方が良いかと考えています。

英語弱者の私に付き合って最後まで読んでいただきありがとうございました。
みなさまのコーディングが少しでも楽になりますようにお力添えできたら嬉しいです。
vim-dbext.vimでattachしたdbの補完をだす

# Summary

attachしたdbの補完を出す設定方法

##　こんな感じ

![Screen Shot 2019-10-16 at 7.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/ceb5722e-dbef-1863-d5a3-8ca1eac63458.png)
![Screen Shot 2019-10-16 at 7.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/fd3e3cde-21ac-5a4a-cd96-e0eb610f8486.png)

### 設定

vimrcに書く

```vim
"  ------------------------------------------------------
"                      main database
"  ------------------------------------------------------

  let s:dbname  = $HOME . '/Desktop/test_sqlite3/baz.sqlite'
  let g:dbext_default_profile_test = 'type=SQLITE:dbname=' . s:dbname

"  ------------------------------------------------------
"                     attach databases
"  ------------------------------------------------------

  let s:addDb01 = '"' . $HOME . '/Desktop/test_sqlite/foo.db" as foo'
  let s:sCmd01 = '-cmd ''attach ' . s:addDb01 . ''' '

  let s:addDb02 = '"' . $HOME . '/Desktop/test_sqlite2/bar.db" as bar'
  let s:sCmd02 = '-cmd ''attach ' . s:addDb02 . ''' '

  let g:dbext_default_SQLITE_cmd_options = s:sCmd01 .  s:sCmd02

"  ------------------------------------------------------
"                       set profile
"  ------------------------------------------------------

  let g:dbext_default_profile = 'test'

```

### 参考

sqliteのヘルプのcmdのところ

```bash

$ sqlite3 --help

```

dbext.vimのヘルプ

https://github.com/jonathanfilip/vim-dbext/blob/master/doc/dbext.txt#L2121
最強の技「グーチョキパー」は本当にグーとチョキとパーの全てに近いのか

## 序章

ある時、５歳の息子がこう言った。

「ジャンケンでお友達がこんな手をしてくるので勝てない」

息子の手は、少し手の開き気味のグーの形をしていた。
なんでも、これはグーの特性とパーの特性を合せ持つ技なのだと言う。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/5c340bcc-7c0b-07e8-ca84-21b881a859d7.png">


内心、「パーを出せば負けないよ」と思いつつも息子の言葉を思い出す。

**「勝てない」**

そう！息子はお友達に勝ちたいのだ！
社会に出て家庭を持ち、すっかり丸くなった己が恥ずかしい・・・

ここは父としてなんとか息子を勝てるようにしてあげたい。

しかし、どうやって？

私は思い出す。
子供の頃、私の地域（福岡）では**「グーチョキパー」と言う全ての特性を持った最強の技**があったことを。
その技を息子に伝授すれば良いのではないか。

しかし、今や私はエンジニア。
エンジニアとしてはエビデンス無しには最強とは語れない。
本当に最強であることを科学的に確認する必要がある。

## 最強の技を求めて

私は、強化学習のモデルを搭載したiPhoneアプリを開発し、手の映像をカメラで取りながらリアルタイムで類似度を表示することにした。

**「技術的には可能です」**

AIアプリの開発について相談された場合、5年前の私ならきっとそう答えていただろう。
しかし今の時代はとてもお手軽になった。

[AzureのCustom Vision](https://www.customvision.ai/)にジャンケンの各技の写真をアップロードし、トレーニングを実施、 CoreMLのファイルをダウンロード。
iPhoneアプリ内に埋め込み、CoreMLのAPIを呼び出すだけで簡単にリアルタイム画像処理ができるのだ。

<img width="1420" alt="1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/98476bbd-b19f-8dea-6ae9-6e3136a69504.jpeg">


アプリはXamarinで開発。
開発にあたっては以下の記事を参考に。

　**Xamarin.Forms で AI をアプリに組み込んでみよう(UWP, Android, iOS)**
　https://blog.okazuki.jp/entry/2018/12/18/164052

　**Xamarin.Formsでリアルタイム処理が可能なカメラプレビューのCustomRendererのサンプル**
　https://qiita.com/muak_x/items/c441e1e795ba22d597d6

サクッとアプリは完成。

早速、まずは認識率を確認してみる。
判定は rock（グー）、scissors（チョキ）、paper（パー）と old scissors（私の地元で田舎チョキ）の４種類の判定をするようにしている。
結果は・・・うむ、認識に問題はないようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/497c40e7-7c4d-35fc-9298-b8ce43ed6acc.png)



では次に息子が見せた「グーパー」の形をしてみる。

・・・なるほど。

**あえて言おう、これはグーであると！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/c86f0b85-03d1-2ac3-0e15-9d08d119aa1e.png)



では最後に究極技の「グーチョキパー」を出してみる。

**こ、これは・・・田舎チョキではないかっ！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/a1d6e850-fdfc-d67e-d351-68daacf1ff7d.png)


なんてことだ・・・最強と思っていた技はただのチョキだった・・・
いろんな手の形に変えてみるが、どれも良い評価にはならず、最強の技がわからない。
「チョキパー」や「グーチョキ」とは言えなくもない判定は出たが、「グーチョキパー」には辿り着かず・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/f8268b72-a43c-3b02-7b7b-c016616d3f14.png)




## 終章

「グーパー」を出してくるお友達にじゃんけんで勝てないという息子の悩みから始まったこの活動だが、結局、良い手段は見つからず父の威厳を示すことはできないままこの活動は終えることとなった。

そもそも、「グーチョキパー」などというゲーム性を著しく破壊する手段は使うべきではない。

私は息子にこう言う。

**「先生に言いなさい」**


## まとめ

Xamarin + AzureのCustom Vision で CoreML を使った機械学習を試してみました。
試してみると驚くほど簡単にでき、また端末内に学習モデルを入れているのでスタンドアローンで動作しますのでサーバーも不要です。

機械学習に詳しい同僚にこの記事を見せると「チョキと田舎チョキのラベルはわけない方が良いかも」というコメントをもらいました。
なぜそう思うのか、初心者には全くわからないですよね。
つまり、いわゆるAIというものは万能なものではなく、どういったアプローチが必要で、何ができるのかを判断するには正しい知識が必要ということなのだと思います。
とは言え、これだけ手軽に動かせるのであれば、まずは触れて興味を持ってみるのも良いのではないでしょうか。

今回のソースはGitHubにあげてます　→　https://github.com/uemegu/CustomViewSample
outlook vba flag compelet programatically test

#まずFlagをつけて送信
##Flagは送信の時設定しても受信したメールには効かないものがある
また送信済みアイテムには設定されていない。
何を設定したかわからない。
こんな時マクロで送っていると安心だ。

```vb

Sub test()
'https://gallery.technet.microsoft.com/office/85ed1a00-980d-4564-baa0-dfefed244a46
'http://www.ken3.org/vba/backno/vba161.html
'https://outlooklab.wordpress.com/2011/02/19/%E6%9C%AC%E6%96%87%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%8B%E3%82%89%E3%83%95%E3%83%A9%E3%82%B0%E3%81%AE%E6%9C%9F%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD/
'Outlook.OlFlagIcon Const olGreenFlagIcon = 3
Dim s As Outlook.Folder
Dim myitem As MailItem
Set s = Application.Session.GetDefaultFolder(olFolderDrafts)
Debug.Print s.Description
Set myitem = Application.CreateItem(olMailItem)
myitem.To = ""
myitem.Subject = "test"
myitem.Body = "testbody"
myitem.FlagStatus = olFlagMarked
myitem.FlagIcon = olGreenFlagIcon '受信したメールには有効に設定されていないので効いていない
myitem.FlagRequest = "testflag"
myitem.TaskStartDate = Now 'OutlookLabが使用
myitem.FlagDueBy = #10/17/2019 9:00:00 AM#   '三流君で使用　オブジェクトブラウザでは見つからない。しかし受信したメールには有効
myitem.Display
End Sub
```

###FlagDuebyはOutlook2016あたりでは隠しプロパティらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/6a5543af-f05f-b9b3-a0b4-62b2a712c1b9.png)
###flagstatusも隠しというかサジェストされない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/0d15528f-813a-aaa2-c66a-ee3830d582fd.png)

#開いたメールを完了にする
完全にクリアするというのはできないが、Statusを変えることができる

```vb
Sub FlagCompleteInspectorCurrentItem()
'Outlook 2016 Ok
Dim ain As Inspector: Set ain = ActiveInspector
Dim mItem As MailItem
'Dim s As Folder: Set s = Application.Session.GetDefaultFolder(olFolderInbox)
Set mItem = ain.CurrentItem
'mItem.ClearTaskFlag
mItem.FlagStatus = olFlagComplete
'mItem.FlagStatus = olNoFlag
mItem.Close olSave
End Sub
```

#explorerで選択したメールを完了にする

```vb
Sub ComploeteExplorerItem()
Dim aEX As Explorer: Set aEX = ActiveExplorer
Dim mItem As MailItem
Set mItem = aEX.Selection(1)
Debug.Print mItem.Subject
mItem.ClearTaskFlag
mItem.FlagStatus = olFlagComplete
'mItem.FlagStatus = olNoFlag
End Sub
```

プレビューとかを開いていると当初は聞いていないが、ほかのアイテムを選択すると（例えば一つずらす）コンプリートになる。

#ヒントは三流君とScriptGuy
www.ken3.org/vba/backno/vba161.html
この三流君のOutlookのヴァージョンは2000で2007くらいからできなくなったというのを見ていた。
しかしこの2010年のScriptGuy
https://gallery.technet.microsoft.com/office/85ed1a00-980d-4564-baa0-dfefed244a46
ここでScriptGuyがflagstatusで区別している
どうも動くらしい。たしかにFlagStatusはサジェストはされないが無効になっていないのか。
すこし確認して追記する。
複数行の文字列の書き方（ヒアドキュメント）

###ヒアドキュメントとは
文字列をソースコード中に埋め込むための方法の一つ。
ヒアドキュメントを使うことで複数行に渡る長い文字列をすっきり書くことができます。

###書き方

```
<<識別子
１行目
２行目
３行目
識別子
```
識別子は自由に付けることができます。
どのような文字でも構いませんが「EOS」などがよく使われているようです。(EOS=End of String)
（ただし、識別子と記述する文字列内の文字がかぶらないように注意してください。）


###利用例

```ruby

<<EOS
ヒアドキュメントを解説しています。
ヒアドキュメントをうまく使うと便利です。
EOS
#=> ヒアドキュメントを解説しています。
#=> ヒアドキュメントをうまく使うと便利です。
```
ヒアドキュメントは文字列と同じく変数へ格納することができます。
さらに開始ラベルの<<識別子は1つの式と見なされます。
そのため<<識別子をメソッドに引数として渡したり、<<識別子をレシーバとしてメソッドの呼び出しをすることができます。

###ヒアドキュメント内で式展開をする
ヒアドキュメントの中で式展開することができます。

```ruby
name = 'TEXT'
<<Text
EOSとは識別子が違います。
このヒアドキュメントの識別子は#{name}です。
Text
#=> EOSとは識別子が違います。
#=> このヒアドキュメントの識別子はTEXTです。
```

###ヒアドキュメント内の式展開を無効化する
<<'識別子'のように、識別子をシングルクオーテーションで囲んだ場合は、文字列をシングルクオーテーションで囲んだ時と同じ扱いとなり式展開が無効化されます。
一方で、<<"識別子"のようにダブルクオーテーションで囲んだ時は式展開が有効になります。

```ruby
name = 'TEXT'
<<'Text'
EOSとは識別子が違います。
このヒアドキュメントの識別子は#{name}です。
Text
#=> EOSとは識別子が違います。
#=> このヒアドキュメントの識別子は#{name}です。
```

### 「<<-識別子」と「<<~識別子」の違い
「<<-識別子」のように-を入れると「最後の識別子」の前の空白やタブが無視されるので、「最後の識別子」を自由にインデントさせることができます。

「<<~識別子」のように~を入れると「ヒアドキュメント内部文字列」の前の空白やタブが無視されるので、「文字列全体」を自由にインデントさせることができます。


###引用元

「プロを目指す人のためのRuby入門」から一部引用
ヒアドキュメントによる複数行文字列の作成から引用
https://www.javadrive.jp/ruby/string/index4.html
Option型がSomeであるときのみ特定の処理をするときのメソッド名が foreach なのか

# 前提

[Option型の変数で中身があるとき\(Some\)のみ特定の処理を実行したい](https://qiita.com/bigwheel/items/aa76676a2cb65e1e4b8c)ときは `foreach` メソッドまたはfor文を使うことを理解している。

# 問題

```scala
val nameOption: Option[String] = Some("bob")
nameOption.foreach(println)
```

Option型は0個または1個の要素を含むクラスなので、 それぞれに(each) 対して(for) というメソッド名は不自然に感じます。
なぜ上述のメソッドの名前が `foreach` なのでしょう。

# 回答

以下の回答にはいくらかの憶測が含まれています。
もし異論が有る方またはここが間違っているという点がありましたらコメント等で教えていただければ助かります。

## 短い回答

ざっくり言うと歴史的経緯

## 長い回答

* Scalaの言語仕様(とOption型を含む標準ライブラリ)はHaskellのfunctor, applicative functor, monad概念に強く影響を受けている
* ScalaではHaskell由来のMonad系の概念と既存の手続き型の概念(foreach, map)を両立させるため、名前を手続き型伝統の名前に寄せた
    * Haskellの `fmap` , `<$>` に対応するScalaでのメソッド名を `map` , `foreach`[^2] へ定めた
* 「Option型の変数で中身があるとき\(Some\)のみ特定の処理を実行したい」というメソッドはHaskellの `fmap` , `<$>` とほぼ同じ

以上のように、Option型上でのメソッドをモナド操作へ寄せたい欲求と関数型と手続き型の微妙なすり合わせが重なった結果名前と実際の挙動が一致しない奇妙なメソッドが生まれた、というのが真相のようです。
もし手続き型言語のforeachに寄せず、[Haskellの `do`](https://en.wikibooks.org/wiki/Haskell/Syntactic_sugar#Do_notation)に寄せていれば、Option型でも自然なメソッド名になっていたと思います。

[^2]: 関数型であるHaskellには返り値が存在しないforeachに当たるものがないため厳密には対応しているわけではないが、foreachのために糖衣構文があることからもScala側がモナドに寄せる目的でforeachを扱っていることは明白


[^1]: おそらくHaskellから強い影響を受けた結果
【deno】「An import path cannot end with a '. ts'extension.」のエラーを回避する方法

## 概要

以下の画像のように「An import path cannot end with a '.ts' extension...」というエラーが発生してしまう問題を回避したい。

![Screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240412/9ea0e95a-a917-d881-14a3-e9838dd2c971.png)

## 前提

Vim等のエディタを利用する場合を想定しています。
vscodeを利用する場合は、[vscode-deno](https://marketplace.visualstudio.com/items?itemName=justjavac.vscode-deno)プラグインを導入することで解決すると思います。

## 環境

- deno: v0.20.0
- [dem](https://github.com/syumai/dem): v0.2.0

```json:dem.json
{
  "version": "0.2.0",
  "modules": [
    {
      "protocol": "https",
      "path": "deno.land/std",
      "version": "v0.20.0",
      "files": [
        "/fs/path.ts"
      ]
    }
  ]
}
```

下記のようにtsconfig.jsonを用意したが、エラーが発生してしまった。

`types/deno.d.ts`は`$ deno types`の実行結果を格納している。

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "baseUrl": ".",
    "paths": {
      "deno": ["./types/deno.d.ts"],
      "https://*": [
        "../../../.cache/deno/deps/https/*"
      ],
      "http://*": [
        "../../../.cache/deno/deps/http/*"
      ]
    }
  }
}
```

## 解決策


以下手順で解決した。

- 1. [deno_ls_plugin](https://github.com/kitsonk/deno_ls_plugin)をインストールする。

```sh
$ yarn add --dev deno_ls_plugin typescript
```

- 2. tsconfig.jsonを編集し、deno_ls_pluginを読み込むように設定する。

```json
{
   "compilerOptions": {
     ... 省略 ...
    },
    "plugins": [{ "name": "deno_ls_plugin" }]
   }
 }
```

`"plugins": [{ "name": "deno_ls_plugin" }]`の行を追記したところ、解決した。

![Screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240412/ce7b7c70-76f6-6836-e73c-03929d832b60.png)

## 追記(2019/10/17)

denopkg.comからモジュールをダウンロードしようとしたところ、同様の事象が発生してしまった。
[typescript-deno-plugin](https://github.com/justjavac/typescript-deno-plugin)を導入することで解決する。

https://qiita.com/uki00a/items/8a055a9b27e69e0aec1d
Option型の変数で中身があるとき(Some)のみ特定の処理を実行したい

# 問題

Option型の変数に対して中身があるとき(= Someであるとき)のみ特定の処理をしたい場合どう書きますか？

```scala
val nameOption: Option[String] = Some("bob")

// nameOptionの中身があるならそれをprintlnしたい
```

# 解法

for文または `foreach` メソッドを使いましょう。

```scala
for (name <- nameOption) // for文のパターン
  println(name)

nameOption.foreach { name => println(name) } // foreachメソッドのパターン
nameOption.foreach(println) // 省略してこう書いてもOK
```

# 解説

問題で書いた処理を実現したいとき、Scalaビギナーが以下のようなコードが書くのをよく目にします。

```scala
if (nameOption.nonEmpty)
  println(nameOption.get)
```

```scala
nameOption match {
  case Some(name) => println(name)
  case None       => ()
}
```

しかし、これらのコードはどちらも問題があります。
前者は危険な可能性のあるgetを使っており[^1]、後者は何も処理をしないNoneのケースをわざわざ書いてやる必要があります。

実際には件の処理は foreach メソッドとしてデフォルトで実装されています。

[scala/Option\.scala at v2\.13\.1 · scala/scala](https://github.com/scala/scala/blob/v2.13.1/src/library/scala/Option.scala#L422-L438)

```scala
  /** Apply the given procedure $f to the option's value,
   *  if it is nonempty. Otherwise, do nothing.
   *
   * This is equivalent to:
   * {{{
   * option match {
   *   case Some(x) => f(x)
   *   case None    => ()
   * }
   * }}}
   *  @param  f   the procedure to apply.
   *  @see map
   *  @see flatMap
   */
  @inline final def foreach[U](f: A => U): Unit = {
    if (!isEmpty) f(this.get)
  }
```

## 備考

Scalaのfor文は単に `foreach` メソッドの糖衣構文であるため `foreach` メソッドが定義されていれば `foreach` メソッド呼び出しと同様に使用できます。

[6.19 For Comprehensions and For Loops \| Expressions \| Scala 2\.13](https://scala-lang.org/files/archive/spec/2.13/06-expressions.html#for-comprehensions-and-for-loops)

[^1]: getは変数がNoneの場合例外が発生します。もちろん上のコードではその直前でNoneでないことをチェックしていますが、チェックしてから実際に使用するまでの間にコードが挟まったり並列実行などで元の変数が書き換えられる可能性を考えると例外が発生する可能性は否めません

# 参考

* [Scala Standard Library 2\.12\.8 \- scala\.Option](https://www.scala-lang.org/api/2.12.8/scala/Option.html)
* [Option型がSomeであるときのみ特定の処理をするときのメソッド名が foreach なのか \- Qiita](https://qiita.com/bigwheel/items/ba2e8fa88823eb79d164)
git logをgrepして対象commitを抽出する

commitされた差分の中に悪いコードが紛れ込んでいたとして、それをローカルでgrepしたいとする。 `git log` にgrepオプションがあるのでそれを使う。

## grepオプション使ってハッシュだけ表示する

```shell
git log --pretty=%H -S"target"
```

## grepオプション使って差分の内容も表示する

```shell
git log -p -S"target"
```

犯人探しをする仕事はとてもつらい。
TableViewCellの疑問(Swift)

# 現状 
①結構最近まで`tableViewCell`は`tableView`とセットで使うものと思っていたが
`tableViewCell`単体で使いたいなと思うことがあった
②単体でcellが使えるなら枠線をつけたいなと思った(下線じゃなく枠線)
#### こんなUI作りたい
**図はあとで追記**
こういう感じの作るとき、`tableViewCell`の`accessoryType`を指定するだけでいい感じのやつができる、制約も
->だからViewじゃなくてtableViewCellを使いたい

#### tableViewいらないけどtableViewないとできないt？
セルタップしたときのアクションはdelgateで指定できる
->delegateはtableViewにしか使えない
->いらないけど使わなきゃいけない？
->cellの数１つにすればいけるかもしれないけどこのUIだけでtableViewとtableViewCellがごちゃごちゃするのも、、、

#### 枠線のやり方どうする？
storyboardで対象cellの`contentView`に対して以下のような`RoundedView`をカスタムクラスに指定する
->storyboardでbackgroundColorは反応するのにborderの変更は反映してくれない
->カスタムセル作って`contentView`のsubView作って`RoundedView`をカスタムクラスにしちゃえばいいか

contentViewはlayerいじれないってことなのかな->謎

あとで追記

# 参考
**・[UITableView の区切り線をカラフルにしたい！ - Qiita](https://qiita.com/taka4/items/362b0015ef21946415ea)**
**・[【Swift】枠線を任意の場所につける - Qiita](https://qiita.com/kojimetal666/items/d3c674244e5312ce8cfe)**
JDKのJAXB実装でインデントを半角スペース２文字にする方法

JDKのJAXB実装(JDK 10までJDKに内臓されている実装 = `com.sun.xml.bind:jaxb-impl`)を使ってインデント付きのXMLを出力しようとすると、デフォルトだとインデントは半角スペース４文字になります。

```java:モデル
@XmlRootElement
public class User {
  private String id;
  private String name;
  public void setId(String id) {
    this.id = id;
  }
  public String getId() {
    return id;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
}
```

```java:JAXBを使ったXML出力処理
User user = new User();
user.setId("001");
user.setName("Kazuki");

Marshaller marshaller = JAXBContext.newInstance(User.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
System.out.println(writer.toString());
```

```xml:出力されるXML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
    <id>001</id>
    <name>Kazuki</name>
</user>
```

# JDKのJAXB実装を使ってインデント文字列を指定する

JDKのJAXB実装を利用する場合は、`com.sun.xml.internal.bind.indentString`プロパティにインデント文字列を指定することができます。

```java:インデント文字列の指定例
User user = new User();
user.setId("001");
user.setName("Kazuki");

Marshaller marshaller = JAXBContext.newInstance(User.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("com.sun.xml.internal.bind.indentString", "  "); // 半角スペース2文字
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
System.out.println(writer.toString());
```

```xml:出力されるXML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
  <id>001</id>
  <name>Kazuki</name>
</user>
```

# まとめ

JDKのJAXB実装だと簡単にインデント文字数を変更することができました。他の実装はどうなのかな！？
mvn archetype:generate が失敗するときの対処法

**※Windows10での解消方法です。**
#初めての maven で行き詰る。
十数年ぶりにJavaを学びなおすことになり、まずはビルドツール「Apache Maven」から手を付けてみたところ、マニュアル通りでは全くうまく行かなかったので、メモとして残します。
※ちなみにWindowsコマンドプロンプトから実行してます。Eclipseで設定/実行した場合は、このような問題にはならず、サクッと動きます。


###Mavenインストール後、「mvn archetype:generate」を実行
Mavenのバージョンはうまく表示され、Pathも通っている状態。
>C:\>mvn -version
C:\
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-28T00:06:16+09:00)
Maven home: C:\java\apache-maven-3.6.2\bin\..
Java version: 1.8.0_222, vendor: Azul Systems, Inc., runtime: C:\Program Files\Zulu\zulu-8\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

ところが「mvn archetype:generate」がエラーになってまいます。
>[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate (default-cli) on project standalone-pom: Execution default-cli of goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate failed: A required class was missing while executing org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate: org/dom4j/DocumentException

###やってみた対処法
1. セントラルリポジトリにアクセスできることを確認
⇒ブラウザでアクセスできれば、ネットワーク上の問題はなし

2. $M2_HOME\conf\settings.xmlのProxy設定を変えてみる。
⇒Proxyを使っていないのであれば、<proxies>タグごとコメントアウト
⇒$M2_HOMEは、Mavenのインストールディレクトリ

3.WindowsコマンドラインのProxy設定解除
⇒Windowsファイアウォールで阻まれている可能性を疑う
**「Windowsの設定」⇒「ネットワークとインターネット」⇒「Windowsファイアウォール」⇒「ファイアウォールによるアプリケーションの許可」⇒「Windowsコマンドプロセッサを許可する（プライベート）」

これらの対処を行ったところ、うまく行くようになりました。（解決に2日も使ってしまった…）
ネットで検索しても、大半が**「Proxy設定をいぢりました。」**や**「1.のみ」**で終わってしまい、参考となる情報が意外となかったので、書いてみました。

不備等あればご連絡下しさいませ。
※雑多なメモ書きなので、今後の整理にこうご期待
Redshiftメモ

# Redshiftとは
* 列指向ストレージ
* データ圧縮
* ゾーンマップ（各ブロックごとに最大・最小を持っているため高速にアクセス）

### MySQLとの違い
MySQLでは、行を全て取ってくる。
その行をupdateするときは、ロックするため他のカラムが別プロセスで変更されない。
Redshiftのような列指向DBでは、別カラムが別プロセスによって変更される可能性がある。
ATOMIC性。

### キャッシュ
クエリは、リーダノードでキャッシュしている

### ANALYZE
分布状況やサイズによって、SQLのクエリプランを最適化。
テーブル統計を更新。

```
padb_fetch_sample: select * from テーブル名
```
が実行される。

### VACUUM
データ削除後の解放。SORTKEYによるソート。
行スペースの再利用、再ソート。
vacuumでは、ソートとマージをする。

```:スタート
Vacuum テーブル名 integrity check before vacuum execution
```
```:エンド
Vacuum テーブル名 integrity check after vacuum execution
```
テーブルロックはしないので、読み書きと並列実行される。

### Vacuum REINDEX
インターリーブソートキーを分析したあと、完全Vacuumを行う。
Vacuumよりも時間がかかる可能性。

### Vacuumでディスクが上がる
PostgreSQLでは、追記型アーキテクチャを採用しているため、データを更新すると更新した履歴が追加されていく。
この不要になったものを解放するのが、Vacuum。テーブルを新規にコピーして、Vacuum処理をするため。

## sortkeyについて
ソートキーは、where句で指定するものを選ぶ。
また、複数のソートキーを指定することができる。

## ソートキーが、-1
インターリーブソートキーインターリーブを使用した場合は、ソートキーが負の値を持つことがある。
その場合、ソートキーの絶対値が列の位置になる。
`SELECT * FROM pg_table_def WHERE tablename = 'テーブル名';`

## 参考
[PG_TABLE_DEF - Amazon Redshift](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_PG_TABLE_DEF.html)
[【新機能】Amazon Redshift の Interleaved Sorting機能を試してみた ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/redshift-interleaved-sorting/)
[Redshift の Interleaved Sort Key について解説してみる - Qiita](https://qiita.com/t11a/items/a0b175e66ebc623f5cbe)
【備忘録】require,require_once,includeの違い

#目的
require,require_once,includeの違いを知る

#共通点
指定されたファイルを読み込み、評価します。

#include
・ファイル探しに失敗した時は、warningを発行する

#require
・ファイルをファイル探しに失敗した時は、fatal erorrを発行し、スクリプトを停止する

#require_once
・ファイルをファイル探しに失敗した時は、fatal erorrを発行し、スクリプトを停止する。
・ファイルがすでに読み込まれているかどうかを PHP がチェックする。
・すでに読み込まれている場合はそのファイルを読み込まない。


#まとめ
本番で、システム運用するときは、include使った方がいいのかな








#参考資料
PHP公式ドキュメント
・[include](https://www.php.net/manual/ja/function.include.php)
・[require](https://www.php.net/manual/ja/function.require.php#function.require)
・[require_once]
(https://www.php.net/manual/ja/function.require-once.php#function.require-once)
Ubuntu 18.04にNginx mainline最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してUbuntu 18.04にNginx mainline最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Ubuntu)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、mainline最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid           [ unknown] nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.17.4

# apt show nginx
Package: nginx
Version: 1.17.4-1~bionic
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 2997 kB
Provides: httpd
Depends: libc6 (>= 2.27), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 854 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/mainline/ubuntu bionic/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 20 additional records. Please use the '-a' switch to see them.
```
vagrant java 構築

2019年3月から続けたruby類の勉強を一旦止め、今はjavaを技術書を用いて触っています。
最近、電子書籍用に10タブのarrows f-03gを中古で購入し、勉強が捗ってます。
java用に新しく仮想環境を用意したので、メモとして。rubyの時と殆ど同じだけど。

#ローカル環境
- ホストOS：Windows10（※[Windows Insider Program](https://insider.windows.com/ja-jp/about-windows-insider-program/)）
- エディタ：VSCode
- 実装RAM：16GB
- vagrant version：2.2.3

#用意したいもの
- virtualboxとvagrantの準備は割愛
- 仮想環境OS：Ubuntu（※bento/ubuntu-18.04）
- VSCode remote機能利用[ここ要参照](https://code.visualstudio.com/docs/remote/remote-overview)
- java類：openJDK11
- その他：git
- DB：PostgreSQL

#実内容
先述の通り、virtualboxとvagrant自体の準備は割愛。

```:terminal
#vagrantfileの作成
vagrant init
```

```vagrantfile.rb
# コメントアウト部分は殆ど省略
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"

  # vagrant name
  # 既に仮想環境"default"が１つ存在しているので、適当に名前変更
  config.vm.define "JvUbuntu"

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    # Customize the amount of memory on the VM:
    # 自分のPC等に合わせて
    vb.memory = "8192"
  end
  
  # 環境構築自動化させたいなら、下を弄ればいいのだろう。
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end
```
仮想環境の立ち上げ

```:terminal
vagrant up
```

##VSCode remoteの準備
必要な拡張機能は用意しとく
### sshログイン情報の確認
```:terminal
vagrant ssh-config

### こんなのが出てくる
Host JvUbuntu
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/Yudai/vm/MyVagrant/JvUbuntu/.vagrant/machines/JvUbuntu/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

### SSH Configuration file編集、接続
1. VSCode上で、表示＞コマンドパレット＞ Remote-SSH:Open Configuration Fileで開き、上のsshログイン情報をコピペ。
2. 同じくコマンドパレットで、Connect to HostでJvUbuntuを開く

##java, gitの準備
```:ssh内
sudo apt update
sudo apt install git
sudo apt install openjdk-11-jdk

# 一応確認
java --version
```

###Hello world
```
# hello.java作成
nano hello.java
```
#### コード
```hello.java
public class hello{
  public static void main(String[] args){
    System.out.println("Hello Java World!!");
  }
}
```
```:terminal
# コンパイル
javac hello.java
# => hello.class作成

# 実行
java hello
# => Hello Java World!!
```

##DB類
今回はPostgreSQLを準備

###postgresql
```:terminal
# install
sudo apt install postgresql

# admin作成
sudo -u postgres createuser admin -s

# adminでpostgresqlにログイン
sudo -u postgres psql
```
```:postgresql
# adminユーザのパスワード設定
\password admin

#　ポスグレからquit
\q
```

おわり。
証明書更新作業におけるメモ…_φ(･_･

だんだん寒くなってきたので篭って勉強しようと思います、、

クリアになっていないのでわかったところは随時更新
今回の更新作業の流れ


CSR(証明書要求)を作成、認証局へ送付
↓
認証局よりサーバーID(証明書ファイル)発行してもらう
↓
証明書ファイルのインポート、適用


CSR作成時の注意
更新前の証明書の情報を参考に情報を入力
一字一句間違ってはいけない(作成し直すことになるので)

サーバーID発行してもらう際の注意
x509用とIIS用がある

証明書インポート時注意
新しい証明書ファイルがインポートされているか確認してから
サービス再起動

キーストアファイルを生成したため
証明書ファイル確認や秘密鍵の取り出しに今回はkeytoolコマンドを使った

Opensslとの違いは？？

CSR、証明書ファイルはの確認用ツールのサイトがあるので
そこに貼り付けて情報が正しいか確認できる



用語集
ルート証明書
SSL
CA
秘密鍵
公開鍵
共通鍵
Openssl



眠くなったので後日追記予定。。。
Ubuntu 18.04にNginx stable最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してUbuntu 18.04にNginx stable最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Ubuntu)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、stable最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid           [ unknown] nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.16.1

# apt show nginx
Package: nginx
Version: 1.16.1-1~bionic
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 2995 kB
Provides: httpd
Depends: libc6 (>= 2.27), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 851 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/ubuntu bionic/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 6 additional records. Please use the '-a' switch to see them.
```
androidで四角いレイアウト

androidでkotlinでの四角いレイアウトの実装を示す。

https://stackoverflow.com/questions/12311346/how-to-set-fixed-aspect-ratio-for-a-layout-in-android

このスタックオーバーフローなどは情報が古くなっている。

```xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:showIn="@layout/activity_main"
        tools:context=".MainActivity"
        android:background="#000000">


        <FrameLayout
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginEnd="0dp"
                android:layout_marginStart="0dp"
                android:layout_marginTop="0dp"
                app:layout_constraintDimensionRatio="H,1:1"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:background="@android:color/background_light">
        </FrameLayout>


</androidx.constraintlayout.widget.ConstraintLayout>
```

app:layout_constraintDimensionRatio="H,1:1"のHをWにすれば制約内での最大の幅に合うようになる。また1:2なども可能である。

```kotlin
package com.example.myapplication

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity;

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

```

#出力

![geagaeg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369642/aaef521c-3b1d-4f4b-08a6-ec9523bfb873.png)
Ubuntu 16.04にNginx stable最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してUbuntu 16.04にNginx stable最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Ubuntu)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、stable最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   2048R/7BD9BF62 2011-08-19 [expires: 2024-06-14]
      Key fingerprint = 573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid                  nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.16.1

# apt show nginx
Package: nginx
Version: 1.16.1-1~xenial
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 3007 kB
Provides: httpd
Depends: init-system-helpers (>= 1.18~), libc6 (>= 2.17), libpcre3, libssl1.0.0 (>= 1.0.2~beta3), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 839 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/ubuntu xenial/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 13 additional records. Please use the '-a' switch to see them.
```
Ubuntu 16.04にNginx mainline最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してUbuntu 16.04にNginx mainline最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Ubuntu)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、mainline最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   2048R/7BD9BF62 2011-08-19 [expires: 2024-06-14]
      Key fingerprint = 573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid                  nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.17.4

# apt show nginx
Package: nginx
Version: 1.17.4-1~xenial
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 3014 kB
Provides: httpd
Depends: init-system-helpers (>= 1.18~), libc6 (>= 2.17), libpcre3, libssl1.0.0 (>= 1.0.2~beta3), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 841 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/mainline/ubuntu xenial/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 48 additional records. Please use the '-a' switch to see them.
```
JavaScript：簡単なビンゴゲーム作ったのでまとめてみた

## はじめに
タイトル通りJavaScriptでビンゴゲームを作ったので簡単にまとめてみます。
JSでアウトプットしたの初めてだったんで結構時間かかったから思い出補完的な感じで。。。
指摘あればコメントしてくれたら喜びます。

## 目標物の動作
・任意の範囲（今回は1～50)の数字からランダムに数字をピックアップ
・ピックアップされた数字が常に分かるようにする。
・一度ピックアップされた数字がピックアップされてはならない。
・全てピックアップされたら終わりの合図

### HTML
```html:bingo.html
<div id="result"></div>                                                  //ここにランダムに選ばれた数が表示される。
<ul>
  <li>1</li>                                                             //  当選番号の範囲番号を表で見えるようにする。
  <li>2</li>                                                             //  たぶんもっと短くかける？様な気がするけどスルー
　　　・
　　　・
　<li>50<li>
</ul>
<div class="btn-wrapper">
  <button class="button" id="button-start">                              //classは見た目のため。idはjsで要素取得のため
    START!
  </button>
</div>
```

### JavaScript 
```JavaScript:bingo.js
var result = document.getElementById("result");                          //IDがresultのdocumentを取得して変数resultに代入。
var forStart = document.getElementById("button-start");                  //IDがbutton-startを...
var list = document.getElementsByTagName("li");                          //liタグを配列風オブジェクトとして変数listに代入。
var arraylist = Array.prototype.slice.call(list);                        //配列風オブジェクトlistを配列に変換し変数arraylistに代入

forStart.onclick = ()=>{                                                 //forStartに代入された要素がクリックされたときの処理↓
  var random = arraylist[Math.floor(Math.random()*arraylist.length)];    //arraylistからランダムに要素を取得し変数randomに代入
  result.innerHTML = random.innerHTML;                                   //innerHTMLメソッドを使ってhtmlを書き込み。
  random.classList.add("hit");                                           //ピックアップされた数字に色付け用にclassを追加
  var index_num = arraylist.indexOf(random);                             //ランダムにピックアップされた要素のIndex番号を取得し変数index_numに代入
  arraylist.splice(index_num,1);                                         //arraylistから取得したindex番号を引数としspliceメソッドで削除                                              
  if (arraylist[0]) {                                                    
  }
  else{                                                                  //arraylist[0]が無い時"finished!"と表示する。
    alert("finished!");
  }
}

```
補足:
 1. getElementsByTagName等で取得したものは配列ではなく、配列風オブジェクトである。
 2. 配列風オブジェクトとは.lengthメソッドをもったオブジェクトである。
 3. 配列風オブジェクトから配列に変換するには Array.prototype.slice.call(変換したいもの);を使用する。
 　 ※[].protype.call();でも可能
 4. 変換しなければならない理由はそのままだとindex番号がないため？（ここが不明
 
##さいごに
全然説明できている気がしないです。人にわかるように説明するには3倍理解しないといけないですね。
かなり雑ですがこれにて
CSSで装飾された複数のラジオボタン群の2度押しで選択解除する(jQuery)

今更jQueryだけど、たまに困ることがあったのと、意外とすんなり書けたので書き残しておきます

[サンプルはこちら](https://codepen.io/garyuten/pen/JjjXzyL)


ラジオボタンをCSSで装飾すると、こんな感じのHTMLになることがありますよね。
こういったケースのラジオボタンの二度押しで選択解除したかったのですが、意外とサンプルなかったので書きました。

```html
<span class="btn-radio__wrap">
  <input type="radio" name="radio-1" id="radio-1-1" value="1">
  <label class="btn-radio" for="radio-1-1">スライム</label>
</span>
```

jQueryはこんな感じです

```js
$(function () {
  var nowChecked = [];
  $('.btn-radio').on('click', function () {
    // 対象のラジオボタンのID取得
    var radioID = '#'+$(this).attr('for');
    var radio = $(radioID);
    // 対象のラジオボタンのname取得
    var radioName = radio.attr('name');
    // 保存されてるIDとnameが同じだったら
    if(radioID == nowChecked[radioName]) {
      // チェックを外す
      nowChecked[radioName] = false;
      $('input[name="'+ radioName +'"]').prop('checked', false);
      // labelのクリック処理を終わらせてラジオボタンをチェックさせない
      return false;
    } else {
      // チェックした nameとIDを保存
      nowChecked[radioName] = radioID;
      return true;
    }
  });
});
```

nameが違う複数のラジオボタン群に対応するために、 nowChecked は連想配列でチェック状態を格納してます。


参考サイト）

- [ラジオボタンを2度押しで選択解除する（複数グループ） │ ノラWEB屋　野良人（のらんど）](https://norando.net/radio-cancel/)
- 【jQuery入門】ラジオボタン(radio要素)の取得・選択・checked操作！ | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト https://www.sejuku.net/blog/46739#false
Azure DevOps Services の .NET Framework デスクアプリ向け小ネタ集

（自分用の備忘録です😅）

# Windows Server の ANSI 文字コードは UTF-8

`ProcessStartInfo.RedirectStandardInput = true` で
`process.StandardInput.BaseStream` に生データを流すと UTF-8 のボムが付いてしまうという恐ろしい事象に遭遇💦

`Process.Start` をする前までに、
`Console.InputEncoding = Encoding.GetEncoding("latin1");` など、ボムが付かないエンコードに変更することで回避。

または… ボムをエミットしない UTF8Encoding に差し替えるなど:

```csharp
    if (Console.InputEncoding == Encoding.UTF8)
    {
        Console.InputEncoding = new UTF8Encoding(false);
    }
```

なぜ `Console.InputEncoding` なのかといいますと、ILSpy で System.dll を覘くとそうなっていたからです💦

```csharp
	if (startInfo.RedirectStandardInput)
	{
		standardInput = new StreamWriter(new FileStream(parentHandle, FileAccess.Write, 4096, isAsync: false), Console.InputEncoding, 4096);
		standardInput.AutoFlush = true;
	}
```

# ImageMagick をインストール

Chocolatey でインストール可能。
しかし [imagemagick](https://chocolatey.org/packages/imagemagick) に依存関係で付いてくる [vcredist2010](https://chocolatey.org/packages/vcredist2010) は、バージョン違いによりインストールに失敗する模様。
`--ignore-dependencies` で無視してしまう。

```yaml
- task: CmdLine@2
  displayName: "Install: ImageMagick (Install) 7.0.8.68"
  inputs:
    script: |
      choco install imagemagick --version 7.0.8.68 --ignore-dependencies
```
Debian 10にNginx mainline最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してDebian10にNginx mainline最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Debian)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、mainline最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid           [ unknown] nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.17.4

# apt show nginx
Package: nginx
Version: 1.17.4-1~buster
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 3005 kB
Provides: httpd
Depends: libc6 (>= 2.28), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 855 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/mainline/debian buster/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 4 additional records. Please use the '-a' switch to see them.
```
Debian 10にNginx stable最新版をインストール（公式repository）

# はじめに

公式repositoryを利用してDebian10にNginx stable最新版をインストール
親記事：[Nginxの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/df4a0baaaad9c932ea30)
参考：[nginx: Linux packages](https://nginx.org/en/linux_packages.html#Debian)

## サポート

本手法で導入した場合、nginxの開発が停止するまでサポートされると思われる。
特定のバージョンを指定しなければ、stable最新版が常に提供されると思われる。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y curl gnupg2 ca-certificates lsb-release
# echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

# apt-key fingerprint ABF5BD827BD9BF62
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid           [ unknown] nginx signing key <signing-key@nginx.com>
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y nginx
... 略
```

### 各種確認

```shell-session
# which nginx
/usr/sbin/nginx

# nginx -v
nginx version: nginx/1.16.1

# apt show nginx
Package: nginx
Version: 1.16.1-1~buster
Priority: optional
Section: httpd
Maintainer: Sergey Budnevitch <sb@nginx.com>
Installed-Size: 3003 kB
Provides: httpd
Depends: libc6 (>= 2.28), libpcre3, libssl1.1 (>= 1.1.1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Homepage: http://nginx.org
Download-Size: 850 kB
APT-Manual-Installed: yes
APT-Sources: http://nginx.org/packages/debian buster/nginx amd64 Packages
Description: high performance web server
 nginx [engine x] is an HTTP and reverse proxy server, as well as
 a mail proxy server.

N: There are 2 additional records. Please use the '-a' switch to see them.
```