OmniAICreator/Qiita-1.07M huggingface dataset:
Cucumberからwebdriversのgemを使ってブラウザテストを実行する

[chromedriver-helper](https://github.com/flavorjones/chromedriver-helper) が deprecated になって久しいので、いい加減 [webdrivers](https://github.com/titusfortner/webdrivers) に切り替えてみる。

[RSpec](https://github.com/rspec/rspec-rails) の [SystemSpec](https://relishapp.com/rspec/rspec-rails/docs/system-specs/system-spec) から [webdrivers](https://github.com/titusfortner/webdrivers) を使う例はよくみるけど、
[cucumber](https://github.com/cucumber/cucumber) から使う例は自分で探した限りあまり無かったので改めて書き留めておくなど。


## 前提

* CentOS 7 で実験した手順です
* Ruby 2.6.4 を使用します


## 手順

##### 1. 依存ライブラリをインストールしておく

もしインストールされていない場合はgoogle chromeとIPAフォントをインストールします

```shell
sudo tee /etc/yum.repos.d/google-chrome.repo <<'EOS'
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOS

sudo yum install -y google-chrome-stable ipa-*-fonts
```

##### 2. Gemfileに`webdrivers`を追加します

```ruby:Gemfile
# ----- 前略 -----
gem 'webdrivers'
gem 'cucumber' # Railsプロジェクトの場合は 'cucumber-rails' を使用する
gem 'capybara'
# ----- 後略 -----
```
   * `selenium-webdriver` や `chromedriver-helper` はもう記述する必要はありません（ `selenium-webdriver` は `webdrivers` によってインストールされます)

##### 3. `bundle install` を実行する

##### 4. `env.rb` に設定を記述する

```ruby:features/support/env.rb
require 'capybara/cucumber'
require 'webdrivers'

Capybara.configure do |config|
  config.default_driver    = :selenium_chrome_headless
  config.javascript_driver = :selenium_chrome_headless

  # Rails以外のアプリを試験する場合や、環境も含めたE2Eテストを実施する場合、下記の２行指定する必要がある
  # (直接Railsアプリを試験する場合は下記の２行は不要)
  config.app               = nil   
  config.run_server        = false
end
```
  * `env.rb` を汚したくない場合は `features/support/webdrivers.rb` 等のファイル名で作成してください
  * `:selenium_chrome_headless` は [capybara](https://github.com/teamcapybara/capybara) が準備しているドライバの１つ（https://github.com/teamcapybara/capybara/blob/3.29.0/lib/capybara/registrations/drivers.rb#L27-L36 )です。まだ更新される余地がありそうなので、自前で `Capybara.register_driver` はせずにこのまま活用します

以上でインストールと設定は完了です。
stepやfeatureはこれまで通り使えますが、CapybaraやWebDriverに直接オプションを指定している場合は動かないケースもありますので、その場合はオプションの指定を外してください。


## おまけ１：画面サイズの変更

ブラウザの画面サイズを変更する場合、SystemSpecでは `driver_for`のオプションで`screen_size`を渡したり、`Capybara.register_driver` でオプションを指定して設定する場合もあります。

ただしこの場合、cucumberでは画面サイズ毎にoptionを指定したドライバを `Capybara.register_driver` し、step内で`current_driver`を差し替えながら試験を進めないといけなくなります。

それよりは下記の方がLGTM(Looks Good to Me)です。

```ruby:stepファイル
When("ブラウザのウィンドウを {int}px × {int}px にリサイズする") do |width, height|
  page.driver.browser.manage.window.resize_to(width, height)
end
```

```cucumber:featureファイル
シナリオ: WebDrivers経由で画面表示をしスクリーンショットを撮る
  もし "https://google.com"を表示する
  かつ ブラウザのウィンドウを 1000px × 600px にリサイズする
  # 後略
```

## おまけ２：スクリーンショットを撮る

webdrivers経由でChromeを呼び出しても、これまで通りスクリーンショットは撮ることができます

```ruby:stepファイル
Then("スクリーンショットを撮って{string}に保存する") do |file_path|
  page.save_screenshot "tmp/#{file_path}"
end
```

```cucumber:featureファイル
* スクリーンショットを撮って"screen_shot.png"に保存する
```

## 参考

これらのファイルは[ここ](https://github.com/tk-hamaguchi/webdrivers_sample)で公開しています。参考になれば。
[Golang]Ginを使った、すっきりルーティングのサンプル

# はじめに

今回は、簡単な内容ですが、Ginでのルーティングファイルについて、共有させて頂きます。

# サンプルコード

以下のファイルは、それぞれ
`$HOME/go/src/github.com/myProject/myRepository/`直下にあるとします。
ghqでプロジェクト管理した感じを想定してます。

```golang:server/routes.go
package server

import (
	"net/http"
	"github.com/myProject/myRepository/handler"
	"github.com/gin-gonic/gin"
)

func defineRoutes(r gin.IRouter) {
	v1 := r.Group("/")
	{
		v1.GET("/test", handler.myFunction)
	}
}
```

```golang:handler/yay.go
package handler

import (
	"github.com/gin-gonic/gin"
)

func myFunction(c *gin.Context) {
	// ここに処理を書く
}
```

```text:実際にアクセスする際のURL
http://hogehoge.com/test
```

# 関数の定義でスッキリさせる

```golang:server/routes.go下方
func defineRoutes(r gin.IRouter) {
	v1 := r.Group("/")
	{
		v1.GET("/test", handler.myFunction)
	}
}
```

ここで`v1`を用意することで、URLが増えてきても、すっきり分かりやすく追加していける。
ちなみに、たくさんルーターを用意した場合、こんな感じになります。

```golang:ルーターが増えてきたときのイメージ
	v1 := r.Group("/")

	{
		v1.GET("/test", handler.myFunction)
	}
	{
		v1.POST("/test2", handler.myFunction2)
		v1.PUT("/test2/create", handler.myFunction3)
		v1.GET("/test2/hoge", handler.myFunction4)
		v1.DELETE("/test2/delete", handler.myFunction5)
	}
	{
		v1.GET("/test3/fuga", handler.myFunction6)
		v1.GET("/test3", handler.myFunction7)
	}
	{
		v1.GET("/test4/poon", handler.myFunction8)
	}
```

増えてきても、すっきりしています。
この辺りは、よくあるFWのルーティングファイルの書き方と似ていて分かりやすいですね。

# さいごに

今回は、解説なしで共有だけさせて頂きました。
いつか、理解を深めてがっつり解説したい。

最期まで、ありがとうございました。
Xmingで画面サイズを変更する方法

# 起こったこと
Windows10上のWSLに構築したArchLinuxでXfce4を起動したところ、画面をはみ出してしまったので方法を考えた

# 対処法
-sizeというオプションを付ければいいらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234470/5687f994-f390-b8d4-b5c7-5fb3e677960c.png)

この画面で`Addtional parameters for Xming`に

```
-size 0 1024x768
```

と書けば1024x768で起動する。

（One windowモードでしか検証してないので注意）

# 結果
いつかこれの構築の記事も書こうかな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234470/36127c9b-f1d4-3550-0b08-eac94ff7f816.png)
ITパスポートの受験と振返り（反省など）

## はじめに

- 新卒で機械メーカー勤務。IT関係の部署配属となったので、基本知識取得のため受験
- 大学では機械工学系を学んできたため、ITに関する知識（特にテクノロジ）は少しはあった



## ITパスポート

ITパスポートの試験詳細は公式サイトを参考。[iパスとは](https://www3.jitec.ipa.go.jp/JitesCbt/html/about/range.html)

2019年4月から試験範囲が変更（シラバスVer.4.0）になった。詳細についてはリンク先のシラバス等を確認してほしい。

内容としては、IoTやAI、ビックデータ、自動化技術などのテクノロジーが追加され、それに関係するsociety 5.0 やインダストリー4.0、情報セキュリティーなどのストラテジーが加わった。



## 勉強方法

最初に感想として、ITパスポートはCBT形式の試験なので過去問にウエイトを置きすぎはやや危険だったかも...

- **使用した参考書＆参考サイト**

> [1] [2019年度版 ITパスポート試験 対策テキスト&過去問題集 (よくわかるマスター)](https://www.amazon.co.jp/2019年度版-ITパスポート試験-対策テキスト-過去問題集-よくわかるマスター/dp/4865103740/ref=pd_sbs_14_6/357-0095219-7266714?_encoding=UTF8&pd_rd_i=4865103740&pd_rd_r=495530e3-3a9a-4292-bc2d-bf67b5486ea9&pd_rd_w=DehFh&pd_rd_wg=UxeQi&pf_rd_p=ad2ea29d-ea11-483c-9db2-6b5875bb9b73&pf_rd_r=BY0MNQTYW7N1BF0XRYPD&psc=1&refRID=BY0MNQTYW7N1BF0XRYPD)
> [2] [ITパスポート 過去問道場](https://www.itpassportsiken.com/ipkakomon.php)
> [3] [ITパスポート CBT疑似体験ソフトウェア](https://www3.jitec.ipa.go.jp/JitesCbt/html/guidance/trial_examapp.html)

- **学習の流れ**

1. 参考書[1]を1回読む（6h）

2. 過去問演習を6回分やりました（18h）
  　 <過去問演習の流れ>
   ​	　　　解答　&rarr;  採点（弱点分野把握） &rarr; 復習（参考書と合わせて）

3. 試験前に参考書[1]を軽く読む（全ページ、わかるところは飛ばした）(1h)

<br>
全体での学習時間は25時間程度でした。
過去問道場や参考書の付属アプリを用いると下図のように分析してくれて、一目で苦手箇所がわかりよかったです。
より本番に近い形式で解きたい場合は[3]もおすすめです。（1回利用しました）

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484840/226ed43f-7b1f-c5f9-a95e-ea092217616b.png"  width = 70% >

- **結果**

    偏ってますが合格でした！
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484840/fdf974ba-6e31-9ead-a0a0-0e0e8f3394f2.png" width = 60% >

## 反省点

- 思っていた以上に時事問題（新規追加範囲）が多く出題されていた
- 過去問演習に重きを置いたため、シラバスVer.4.0からの範囲の対策が不足していた



## まとめ

- PCに関する知識が多少ある状態で、25時間程度の勉強で合格できる

- 過去問に重きを置く際は、新規範囲の対策を忘れない

- 反省点を活かして、基本情報技術者試験の学習（2020年4月受験）を進める
長形（横に伸縮する）フォントの表示

長形フォントの描画に苦労したのでメモ

```html
    <div class="longtype-container">
        <p class="longtype-content">長形フォント</p>
    </div>
```

```scss
$scale: 0.5; //倍率
$font-size: 50px;

.longtype-container {
    width: 100px;
    margin: 0;
    background: grey;

    .longtype-content {
        font-family: "メイリオ"; //計算の簡単のため等倍フォント
        font-size: $font-size;
        line-height: $font-size; //font-sizeと同じ値を設定しない場合上下の位置がずれる
        text-align: left; //左寄せ
        transform: scaleX($scale);
        transform-origin: left; //拡大の起点を左端に
        width: 100% / ($scale); //行折り返し点の調整
    }
}
```

$scaleの値を変更すれば伸縮率を変更できる。
(今更)使い方によってはMapは超便利

#今更なMapの使い方

<img width="667" alt="スクリーンショット 2019-09-09 20.08.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/92d35776-ee99-3851-e44d-b49d6881c94c.png">

とりあえず1000レコード適当に用意しました。

```ruby:List
List<contact> contactList = new List<contact>();
List<Id> idsList = new List<Id>();

contactList = 
    [
        SELECT
        Id,
        FirstName
        FROM
        Contact
    ];

for (Contact c :contactList) {
    if ( c.FirstName == 'い793') {
            idsList.add(c.id);
    }
}
system.debug(idsList);
system.debug(limits.getCpuTime());
```

<img width="595" alt="スクリーンショット 2019-09-09 20.52.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/76e614cd-a08a-529e-edda-808a6abf85c6.png">


```ruby:Map
List<contact> contactList = new List<contact>();
Map<Id,Contact> contactMap = new Map<Id,Contact>([SELECT Id FROM Contact]);

Contact c = [SELECT Id FROM Contact WHERE FirstName = 'い793'];

system.debug(contactMap.get(c.Id));
system.debug(limits.getCpuTime());
```

<img width="595" alt="スクリーンショット 2019-09-09 20.52.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/cf46ecb9-57cc-9a08-b291-0fa9d7588464.png">

同じIdをとるのでも半分以下の時間で取ることができます。

まあ今更なんですけど、大量のデータを扱うような現場だとしっかりこの辺も意識できるといいのかなと思います。


```ruby:Map
Map<Id,Contact> contactMap = new Map<Id,Contact>([SELECT Id FROM Contact]);
```

これでIdがキーになるMapが生成されるのもわかりやすくていいですね。
JAVAでHTML解析（スクレイピング）

#はじめに
サイトリニューアルのとき、データ移行作業がよくあります。
手動作業はできますが、コストかかりますので、
バッチでHTML取得⇒解析⇒新システムに投入　というような機能が役に立つ場合があります。

Javaでは、jsoupというライブラリは有名です。
Pythonでは、beautifulsoup4 というライブラリは有名です。

jsoup: https://jsoup.org/
beautifulsoup4: https://pypi.org/project/beautifulsoup4/

#1 jsoup
jsoupはHTML解析のJAVAライブラリです。jquery-likeのセレクターで簡単にHTML解析できます。
WHATWG HTML5 仕様を対応しております。

##1-1 JAVAプロジェクト作成し、ライブラリ導入
Gradle例：

```gradle
// https://mvnrepository.com/artifact/org.jsoup/jsoup
compile group: 'org.jsoup', name: 'jsoup', version: '1.12.1'
```

##1-2 Yahooニュースのタイトルの取得例
###1-2-1 HTML構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/31e48a6a-3474-127e-ab80-1f8b089eb8a6.png)

###1-2-2 タイトルとURLを抽出するシンプルな解析コード
```java
package com.test.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupHtmlParser {

	public static void main(String[] args) throws IOException {
		Document doc = Jsoup.connect("https://news.yahoo.co.jp").get();
		// 各記事のaタグを取得。jQueryのセレクターと同じ感じで記載
		Elements newsHeadlines = doc.select(".topicsList li.topicsListItem a");
		for (Element headline : newsHeadlines) {
			System.out.println("title: " + headline.ownText() + ",  href: " + headline.absUrl("href"));
		}
	}
}
```

###1-2-3 解析結果
```text
title: 台風で記録的暴風、2人死亡,  href: https://news.yahoo.co.jp/pickup/6336014
title: 成田空港 1万人でごった返す,  href: https://news.yahoo.co.jp/pickup/6336017
title: 警備会社の3.6億円盗む 手配,  href: https://news.yahoo.co.jp/pickup/6336018
title: 計画運休 ダイヤの正常化課題,  href: https://news.yahoo.co.jp/pickup/6336013
title: バズる女子大生 炎上で50回涙,  href: https://news.yahoo.co.jp/pickup/6335993
title: バスケW杯5敗目 3P全部外す,  href: https://news.yahoo.co.jp/pickup/6336020
title: NPB プロスポーツ協会を脱退,  href: https://news.yahoo.co.jp/pickup/6336015
title: 吉沢亮「重圧尋常じゃない」,  href: https://news.yahoo.co.jp/pickup/6336022
```

##1-3 HTML文字列の解析
###1-3-1 解析サンプル

```java
package com.test.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class JsoupHtmlParser {

	public static void main(String[] args) throws IOException {
		String html = "<h1>HTML fragmentの解析</h1><div><p>P1</p>";
		Document doc = Jsoup.parseBodyFragment(html);
		
		// docのそのまま出力すると、html,bodyタグが付加されましたので、fragment解析の場合は要注意
		System.out.println(doc.html());
		
		System.out.println("==========================");
		
		// bodyの要素を出力
		Element body = doc.body();
		System.out.println(body.html());
	}
}
```

###1-3-2 解析結果
```html
<html>
 <head></head>
 <body>
  <h1>HTML fragmentの解析</h1>
  <div>
   <p>P1</p>
  </div>
 </body>
</html>
==========================
<h1>HTML fragmentの解析</h1>
<div>
 <p>P1</p>
</div>

```

そのほか、ファイルからHTML解析、データ抽出、データ修正などサイトにわかりやすいサンプルコードがあります。
https://jsoup.org/cookbook/input/load-document-from-file


以上
Trello のカードには Trello のカードを添付できる

何を言っているかわからねーと思うが(略

## Trello のカードには Trello のカードを添付できる

Trello のカードには、Trello のカードを、添付、できた

カードを開いて、"Attachment" ボタンから出てくる添付メニュー内には "Trello" って項目があり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45034/c6902dac-a436-acee-ef57-772fc6ce9456.png)

そっから添付したい Trello のカードを選ぶと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45034/04696b22-aaa9-658a-0a48-aea8568258e8.png)

カードに、カードが、添付、された

カードからカードへのリンクがされており、ワンクリックで対象のカードに飛べる。

元カードのタイトルを書き換えると、ちゃんと添付されたカードタイトルも反映される。ラベルやアサイン、期限日設定なんかも、添付された側で見えるようになっている。見やすい。

カード下部の "Connect cards" ってリンクを押せば、添付側のカードから添付元へのリンクも作ってくれる。つまり相互リンク。

複数のカードも添付できる。なのでカードの親子関係での管理とかも、やろうと思えばできる感じですね。
【AWS】API Gatewayでカスタムドメインを利用する方法が紹介された記事を「ドメイン」「DNSサーバ」「SSL証明書」に着目して整理してみた

# はじめに

API Gatewayでカスタムドメインを利用するにあたっては、AWS内のサービスもしくは外部サービスで以下の３つの要素を準備する必要がある。

- **ドメイン**（「contoso.com」などの独自ドメイン）
- **DNSサーバ**（ホスト名「apihost.contoso.com」からターゲットドメイン（カスタムドメインを利用したいREST APIに紐付いたホスト）への名前解決）
- **SSL証明書**（ホスト名「apihost.contoso.com」に対応したSSL証明書）

ググってもらえれば分かる通り、設定方法について紹介された記事はすでにいくつも出回っている。
しかし、上記３要素をAWS内・外のいずれで準備する手順となっているかが記事ごとに異なっており、AWS初心者にとってはそれが混乱のもとになりそうだと感じた。（少なくとも私はかなり混乱した）

# 整理してみた

そこで、API Gatewayでカスタムドメインを設定する方法が紹介された記事を「ドメイン」「DNSサーバ」「SSL証明書」の３要素がAWSの内・外のいずれのサービスで準備される手順となっているかに着目して、以下の通り整理してみた。

| No. | ドメイン管理 | DNSサーバ | SSL証明書発行機関 | 記事 |
| --- | :---: | :---: | :---: | --- |
| 1 | AWS<br>Route53 | AWS<br>Route53 | AWS<br>Certificate<br>Manager | [API GatewayをカスタムドメインでHTTPS化する](https://dev.classmethod.jp/cloud/api-gateway-custom-domain-ssl/) |
| 2 | 外部サービス | AWS<br>Route53 | 外部サービス | [AWSのAPI Gatewayで独自ドメイン名を使うの難しかった (Regional)](https://note.kiriukun.com/entry/20190226-how-to-setup-custom-domain-names-in-amazon-api-gateway) |
| 3 | (記載なし) | AWS<br>Route53 | AWS<br>Certificate<br>Manager | [API Gatewayでカスタムドメインを設定](https://www.wakuwakubank.com/posts/683-aws-api-gateway-custom-domain/) |
| 4 | 外部サービス | 外部サービス | AWS<br>Certificate<br>Manager | [API Gatewayでカスタムドメインを利用する（SSL証明書のみAWS機能で用意するパターン）](https://dev.classmethod.jp/cloud/aws/api-gateway-custom-domain/) |

※基本的には「API Gateway」「カスタムドメイン」でGoogle検索して１ページ目に表示される記事をピックアップしている。記載されている手順や仕様が明らかに古くなっている記事は省いている。

# おわりに

私はNo.4の記事のように「ドメイン」「DNSサーバ」は[ムームードメイン](https://muumuu-domain.com)、「SSL証明書」は[AWS Certificate Manager](https://console.aws.amazon.com/acm)で準備し、API Gatewayでカスタムドメインを利用する設定をした。

以上
めも

■セクション削除
WritePrivateProfileString("section", NULL, NULL, "Test.ini");

■キー値削除
WritePrivateProfileString("section", "key", NULL, ".\TestIni.ini");

■UniCodeによるiniファイルの読み書き
[DllImport("Kernel32.dll", CharSet=CharSet.Unicode, EntryPoint="GetPrivateProfileStringW")]
    public static string GetIniStringW(string section, string key, string defaultText, string fileName)
    {
        StringBuilder sb = new StringBuilder(300);
        uint ret = GetPrivateProfileStringW(section, key, defaultText, sb, 300U, fileName);
        return sb.ToString();
    }


[DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileStringW", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool WritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName
);

■テキストファイルをリストに読み込む  
    string line = "";
    ArrayList al = new ArrayList();

    using (StreamReader sr = new StreamReader(
        "readme.txt", Encoding.GetEncoding(utf16.EncodingName))) {

      while ((line = sr.ReadLine()) != null) {
        al.Add(line);


■テキストファイルへの書き込み
(書き加えるときは、System.IOのAppendを使用)
var fileName = @"c:\test.txt";
var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");
 
using (var writer = new System.IO.StreamWriter(fileName, false, encoding))
{
    for (int i = 0; i < 10; ++i)
    {
        var record = string.Format("{0}", i);
        writer.WriteLine(record);
    }
}


//先頭文字の取得
string s = "あいうえお";
//先頭から2文字を取得する。先頭の文字のインデックスは0。
string s1 = s.Substring(0, 2);
//1文字目の文字を取得する
char c1 = str[0];


//Unicodeテキストファイルの書き出し
  StreamWriter sw = new StreamWriter(@"D:\test1.txt", false, new UTF16Encoding(true));
  sw.WriteLine("東京都新宿区");
  sw.Close();


//文字コード(UniCode)
var utf16 = System.Text.Encoding.Unicode;

//ファイルの末尾にTextBox1の内容を書き加える
System.IO.File.AppendAllText(filePath, TextBox1.Text, utf16.EncodingName);

//"C:\test\1.txt"をUniCodeとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test\1.txt",
    utf16.EncodingName);
//内容をすべて読み込む
string s = sr.ReadToEnd();
//閉じる
sr.Close();
Splunkで集計結果をグラフにしたときに、グラフのある地点にコメント(annotation)をつける

# 概要
- この記事ではSplunk 7.xを使っています
  - annotationはSplunk 7系からの新機能だと思います
- 業務でも、Splunkをログに取り込んで分析することがあると思います
- Splunkでグラフなどで可視化する際に、例えばソフトウェアリリースのタイミングなどの情報をグラフにつける方法です

# 参考にしたサイト
- 以下のサイトの情報を参考に、Splunkのルックアップを使ってファイルからannotationをつける方法を整理しました。annotation全般については参考文献1と参考文献2が分かりやすいですが、実際にやったことは参考文献3をなぞっただけです。
  - [Splunk docs](https://docs.splunk.com/Documentation/Splunk/7.3.1/Viz/ChartEventAnnotations#targetText=Creating%20event%20annotations&targetText=To%20add%20an%20event%20annotation,for%20the%20dashboard%20panel%20above.) 参考文献1
  - [Splunk answers](https://answers.splunk.com/answers/736771/can-annotations-be-be-added-manually-without-timec.html) 参考文献2
  - [Splunk answers](https://answers.splunk.com/answers/252015/how-to-add-point-in-time-annotations-to-a-chart.html) 参考文献3

# やり方
- 参考文献3をマネして、annotationをつけたい時点のunixtimeとメッセージを書いたファイルを準備して、それを使っています。今回はソフトウェアリリースしたときのタグをSplunkにannotationしたいという状況を想定し、以下のようなファイルを準備しました。

```
$ cat note.csv
timestamp,tag
1564469657,v56
```
- [ルックアップについての公式ドキュメント](https://docs.splunk.com/Documentation/Splunk/6.2.3/Knowledge/Usefieldlookupstoaddinformationtoyourevents#Example_of_HTTP_status_lookup) を参考に "Upload the lookup table to Splunk Enterprise" -> "Define the lookup"まで済ませておく
  - 日本語だと`設定 > ルックアップ > ルックアップテーブルファイル`, `設定 > ルックアップ > ルックアップ定義`
  - <img width="1162" alt="スクリーンショット 2019-09-09 19.49.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488303/d263c1e4-6a48-db5f-2914-1679802d929f.png">
  - <img width="1217" alt="スクリーンショット 2019-09-09 19.50.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488303/c60cc41a-f42d-616f-a3a3-84ef777886ce.png">

- クエリそのものではなく、ダッシュボードを構成するxmlを編集する必要があるので、コメント(annotation)をつけたいクエリをダッシュボードに保存しておきます(「名前をつけて保存」 > ダッシュボードパネル)
- 適当なモックデータを作るためのクエリ(ほぼ参考文献1そのまま)
  - annotationしたい地点を含むように`gentimes`の範囲を指定しています

```
| gentimes start=7/26/2019, end=8/1/2019
| eval _time=starttime
| fields _time
| eval data=random()
| eval data=substr(data,1,2)
```

- このクエリをダッシュボードとして保存します。保存してから ダッシュボード > 編集 > ソースの編集 (XML)を選んでxmlを以下のように編集します。
  - searchタグの部分を修正

```
<dashboard>
  <label>sample_annotation</label>
  <row>
    <panel>
      <chart>
        <search>
          <query>| gentimes start=7/26/2019, end=8/1/2019
 | eval _time=starttime
 | fields _time
 | eval data=random()
 | eval data=substr(data,1,2)</query>
          <earliest>-15m</earliest>
          <latest>now</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <search type="annotation">
          <query> | inputlookup note.csv
| eval _time = timestamp
| eval annotation_label = tag</query>
        </search>
        (option指定した行がずっと続くので中略)
      </chart>
    </panel>
  </row>
</dashboard>
```
- すると、見事、annotationがグラフにつきます! やったね!
<img width="1274" alt="スクリーンショット 2019-09-09 20.00.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488303/32bee9a0-d09d-ac27-9732-0e14251db42b.png">
PythonクローリングにおけるUnicodeEncodeErrorの対応

Pythonでクローリングするにあたり、
requestsを使用したときに少しハマったので備忘録として記録。

##エラー内容
```python
# test.py
import requests

r = requests.get('今回のターゲットURL')
print(r.text)
```

このファイルを保存し、下記コマンドで実行してhtmlファイルに書き出す。
```$ python test.py > dp.html```

すると下記のエラーが発生する。
```UnicodeEncodeError: 'cp932' codec can't encode character '\xa9' in position 40629: illegal multibyte sequence```


##原因
なにがダメなのかググった結果、
どうやら著作権の©（\xa9）が悪さしているとのこと。

##対策
ということで、こいつを無理やり置き換えて出力すればうまくいくのではと思い下記の通り変更

```python
# test.py
import requests

r = requests.get('https://gihyo.jp/dp')
print(r.text.replace('\xa9',''))
```

##結果
うまくいった。
荒業かもしれないが、正直クローリングには関係ないところだったので、置き換えても何の問題もない。

ちなみに、htmlファイルに書き出さず、そのままprintするだけなら置き換えなくてもエラーが発生しない。
htmlファイルに書き出す際、文字コードを置き換えているみたいで、その際にエラーになってしまうみたい。
RxSwiftでsubscribeをネストされると困る

## はじめに

RxSwiftで`subscribe`をネストされると困るという話を最小限のコードで説明してみる。

例えば次のようなコードがあるとする、これはやってることはシンプルだがこのような書き方を普段しているようなら、処理が複雑になっていくにしたがって読みづらいコードになる。

```swift
textField.rx.text
  .subscribe(onNext: { text in
       GitHubRepo.search(from: text).subscribe(onNext: { result in
        ...
       })
      .disposed(by: disposeBag)
})
.disposed(by: disposeBag)
```

このコードをもう少しシンプルに再現しやすいサンプルでネストしないようにしてみる。

## シンプルなネストの例とその解決案

`Swift.Sequence`な1, 2, 3を文字列と結合する例を考えてみる。

```swift
Observable.of(1, 2, 3)
    .subscribe(onNext: {
        let observable = Observable.of("\($0)A", "\($0)B", "\($0)C")
        observable.subscribe(onNext: {
            print($0)
        })
    })
```


出力は次の通り

```
1A
2A
3A
```

これを解決するため、ネストさせたくなったらまずは`flatMap`系を思い出してほしい。これも出力は同じになる。

```swift
Observable.of(1, 2, 3)
    .flatMap {
        Observable.just("\($0)A")
    }
    .subscribe(onNext: {
        print($0)
    })
```

しかし、この例がそもそもシンプルすぎるからこんな簡単に置き換えられるわけだ。「1つのシーケンスをまた違う1つのシーケンスにしたいから`flatMap`で置き換えられているだけじゃないか」と思ったかもしれない。そのため例をもう少しだけ複雑にしてみる。

## ほんの少し複雑なネストの例とその解決案

`subscribe`でログ出力を行わないといけないことを考えた例にしてみる。

```swift
Observable.of(1, 2, 3)
    .subscribe(onNext: {
        Logger.log("log1:\($0)")
        let observable = Observable.just("\($0)A")
        observable.subscribe(onNext: {
            Logger.log("log2:\($0)")
            print($0)
        })
    })

// Loggerは適当に...こんなニュアンスだとしてやってください
struct Logger {
    static func log(_ message: String) {
        print(message)
    }
}
```

このような場合は`do`オペレータを使って副作用を分けてほしい

```swift
Observable.of(1, 2, 3)
    .do(onNext: {
        Logger.log("log1:\($0)")
    })
    .flatMap {
        Observable.just("\($0)A")
    }
    .do(onNext: {
        Logger.log("log2:\($0)")
    })
    .subscribe(onNext: {
        print($0)
    })
```

もちろんシーケンスを分岐して別々に処理を書いてもいい。この例ではわざわざ分岐する必要性はないが一応例を示す。


```swift
let observable = Observable.of(1, 2, 3)
observable
    .do(onNext: {
        Logger.log("log1:\($0)")
    })

observable
    .flatMap {
        Observable.just("\($0)A")
    }
    .do(onNext: {
        Logger.log("log2:\($0)")
    })
    .subscribe(onNext: {
        print($0)
    })
```

分岐をする必要性はないが、アイデアの一つとして知っておくと良いと思う。

とにかくシーケンスの副作用の実行をまとめて一箇所の`subscribe`でやろうとするからコードが読みづらくなってしまうので、それを避けるために考えを巡らせたい。

## おわりに

上記の例はCold Observableを使ってとてもシンプルな例としたが、実際のアプリ開発ではこのようなシンプルなコードではないためコードの処理を追いづらい。他には`Subject`や`Relay`に値を`onNext`していたりしてキツイ。一つのシーケンスの処理を追っていたら複数イベントが発火し、それがそこだけの問題なのか判断ができないままコードを追いかけないといけない。

そういうときにこそオペレータを駆使したりRxを調べたりして宣言的にコードを書くことを思い出してほしい。じゃないとRxを使ってるだけの読みづらいコードになってしまうわけですよね。
[漏洞预警]CVE-2019-5475/Nexus Repository Manager远程命令执行

### 漏洞描述
近日国外研究人员cbagdude披露了Nexus Repository Manager 2.X存在远程代码执行漏洞.漏洞存在于其内置的Nexus Yum存储库插件.该漏洞需要具有部署权限的账号,登录后方可触发.
### CVE编号
CVE-2019-5475
### 漏洞威胁等级
高危
### 影响范围
Nexus Repository Manager OSS <= 2.14.13
Nexus Repository Manager Pro <= 2.14.13
### 漏洞验证
使用payload进行任意命令执行或任意命令回显

![任意命令执行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/3dc84904-86f7-a4d6-caf0-30fb38504c09.png)

![任意命令回显](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c2ba06e9-e910-7be8-6f75-eb3df36c879b.png)
### 漏洞简单分析
漏洞主要成因为`org.sonatype.nexus.yum.internal.capabilities.YumCapability`中的路径参数可控.该路径未对其接收到的value做过滤,导致任意value都可以带入exec中直接执行.而其后加入的`--version`会导致任意的命令加入最终执行的命令体中,但在linux bash可以使用一特殊字符进行组合绕过该限制,导致最终RCE实现.

![漏洞成因](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/47953f90-6746-7e38-5d8d-8cdb7dd0b855.png)
### 修复建议
升级至2.14.14或其以后版本
### 鸣谢(排名不分先后)
Alibaba Cloud    pyn3rd
ADLab    balisong
asiainfo-sec    Sommous
### 时间轴
[0] 2019年8月12日 cbagdude提交该漏洞
[1] 2019年9月3日 NVD发布该漏洞
[2] 2019年9月9日 亚信安全网络攻防实验室发布预警公告
### Reference
https://nvd.nist.gov/vuln/detail/CVE-2019-5475
Splunkで手入力で複数件のモックデータを作る

# 概要
- この記事ではSplunk 7.xを使っています
- 業務でも、Splunkをログに取り込んで分析することがあると思います
- Splunkでクエリを書くときに、デバッグに役に立つテクニックを紹介します

# 背景
- Splunkの`makeresults`コマンドを用いると、モックデータ(ダミーデータ)を生成することができます
  - モックデータを1つつくるには[公式ドキュメント](https://docs.splunk.com/Documentation/Splunk/7.3.1/SearchReference/Makeresults#1._Create_a_result_as_an_input_into_the_eval_command)の`| makeresults | eval newfield="avalue"`のようにします
- 正規表現を使って集計しているクエリの動作確認するために、手動で複数件モックデータを作りたいときに、やり方が分からずつまったので、まとめておきます
  - 別途、ファイルをアップロードして、それをモックデータとして使うこともできますが、今回は手軽に数件のモックデータを作りたいときのやり方です

# 例
- 動物の数をログに落としていて、それを種類ごとに集計するクエリを書きたいため、このようなモックデータが欲しい

```
message:num_dogs=1, num_cats=0, num_humans=2, num_unicorns=0
message:num_dogs=1, num_cats=1, num_humans=0, num_unicorns=0
```
- そのためのクエリ
  - `makeresults`は通常クエリの一番最初にかかないといけませんが、`append`コマンドでつなげることができます -> 参考: [公式ドキュメント](https://docs.splunk.com/Documentation/Splunk/7.3.1/SearchReference/Append)
 
```
| makeresults 
| eval message_field="message:num_dogs=1, num_cats=0, num_humans=2, num_unicorns=0" 
| append 
    [| makeresults 
    | eval message_field="message:num_dogs=1, num_cats=1, num_humans=0, num_unicorns=0"]
```
- クエリ実行結果
<img width="852" alt="スクリーンショット 2019-09-09 19.45.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488303/79a0a25b-64aa-c843-bd10-3f0602d1b72c.png">


# つくったモックデータを使って動物の数を集計してみる
- クエリ

```
| makeresults 
| eval message_field="message:num_dogs=1, num_cats=0, num_humans=2, num_unicorns=0" 
| append 
    [| makeresults 
    | eval message_field="message:num_dogs=1, num_cats=1, num_humans=0, num_unicorns=0"] 
| rex field=message_field "num_dogs=(?<num_dogs>\d+)" 
| rex field=message_field "num_cats=(?<num_cats>\d+)" 
| rex field=message_field "num_humans=(?<num_humans>\d+)" 
| rex field=message_field "num_unicorns=(?<num_unicorns>\d+)" | bucket _time span=30m
|  stats sum(num_dogs) as tot_dogs, sum(num_cats) as tot_cats, sum(num_humans) as tot_humans, sum(num_unicorns) as tot_unicorns by _time
|  fields _time, tot_dogs, tot_cats, tot_humans, tot_unicorns
```

- クエリ実行結果 -> 想定通りきちんと集計できていますね！
<img width="1277" alt="スクリーンショット 2019-09-09 19.46.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488303/c8e21369-9f7a-99cd-a3dd-a16ceb354fff.png">
ReactNative Expo で Android App Bundlesを使用したい時

## はじめに
Androidの通常のビルドであれば以下のコマンドで可能です。

```bash
expo build:android
```

Expo SDK33からは `Android App Bundles` が使用出来る様になりましたので以下のオプションを追加する事により`Android App Bundles`ファイルが生成されます。(拡張子 .aab)


```bash
expo build:android -t app-bundle
```

#### APKの場合、54.2MB
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18721/ce49985d-3b76-1016-bb36-35fcb34b2618.png)

#### AABの場合、31.2〜32.6MBに最適化される。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18721/a59a0d63-0d8e-bb1f-282e-7419bdac528a.png)


## APK最適化されていないと表示された場合は試してください！
「APKが最適化されていません」と表示されますので、APKではなくAABファイルを生成しましょう。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18721/62ddbf32-481d-d470-fe15-8a637c820e5d.png)


##### 参考URL
- 64-Bit Support and Android App Bundles
https://blog.expo.io/64-bit-support-and-android-app-bundles-fe0c6a28669

- Android App Bundlesについて
https://developer.android.com/guide/app-bundle/
Project Euler 010を解いてみる。「素数の和」

# Project Euler 010
[010](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010)
>10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.
200万以下の全ての素数の和を求めよ.


->[次の問題]
## Sympyにありました。

```Python
n = 200 * 10000
# sympy.primerange(a, b)でa以上b未満の素数を生成するgeneratorを返す
prime_generator = sympy.primerange(2,n+1)
print(sum(prime_generator))
```
ただ、この書き方だと下記のエラトステネスの篩のほうが早いです。

## 考え方
シンプルな問題ですね。
エラトステネスの篩で200万以下の素数を計算して合計すれば良さそうです。
篩のプログラムは以前に作って`math_functions.py`に入れてあるのを使います。
なにかに応用できるかなと思ってboolean配列で返す関数と素数列で返す関数に分けてあります。
配列の数字を付け加えたり消したりといった処理やifによる分岐は重くなるようなので、boolean配列のTrue, Falseを切り替えることで値を表し、最後に数列に変換しています。
また、2,3以外の素数は6k±1であるので、少し探索範囲を減らしています。

```Python
boolean_arr[4::2] = False
#これはboolean_arrインデックス4から2個ずつ(4,6,8,...)をFalseにするという処理。
#bookean_arr[i*2::i] = Falseとすることでiより大きいiの倍数のインデックスをFalseにできる=非素数を消せる
#if文を使わないので多分早い
```

## コード
```Python:math_functions.py
import numpy as np


def get_prime_arr_bool(n: int) -> np.ndarray:
    """
    自然数n未満の素数をboolean配列で返す関数
    2,3,5 -> [False, False, True, True, False, True]
    :param n: int
    :return: numpy.ndarray
    """
    boolean_arr = np.ones((n,), dtype=np.bool)  # n個の要素をもつのboolean配列(0~n-1に対応)を生成、全てTrueとする
    boolean_arr[0:2] = False  # [0,1]をFalseとする
    boolean_arr[4::2] = False  # 2以外の偶数をFalseとする
    boolean_arr[6::3] = False  # 3以外の3の倍数をFalseとする
    for i in range(5, ceil(sqrt(n)), 6):  # iは初項5、公差6の等差数列とする
        if boolean_arr[i]:  # 6k-1に対応。iに一致する要素がTrue=素数のとき
            boolean_arr[i * 2::i] = False  # iの倍数の要素(非素数)をFalseとする
        if boolean_arr[i + 2]:  # 6k+1に対応。
            boolean_arr[(i + 2) * 2::(i + 2)] = False
    return boolean_arr  # boolean配列を返す


def get_prime_arr(n: int) -> np.ndarray:
    """
    自然数n未満の素数の配列を返す関数
    :param n: int
    :return: numpy.ndarray
    """
    return np.arange(n)[get_prime_arr_bool(n)]  # 0~n-1の配列を生成、boolean配列でTrueとなっている数のみを返す
```

```Python:euler010.py
import numpy as np
from math_functions import get_prime_arr


def main():
    n = 200 * 10000
    prime_arr = get_prime_arr(n+1)  # 素数配列を生成(n未満を生成なので一応+1しておく)
    print(np.sum(prime_arr)) # 合計


if __name__ == '__main__':
    main()
```

`結果
142913828922
main処理時間: 0.020266056060791016 sec.
`
できればforループの中のifもなくしたいところですが、どうやったらifなしで実現できるのか思いつかないので現状はこれが精一杯です。
JavaScript:querySeletor,querySeletorAll

<h2>querySeletorメソッド説明</h2>
DOMはHTMLの構造、その中のタグからJavaScriptで一つ選べるメソッドはquerySeletorがある。

<h3>HTML</h3>
以下の例はclassとid両方がある。

```querySeletor.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="css/style.css">
    <title>Document</title>
</head>
<body>
    <h1 class="titleClass"><em>apple</em></h1>　<!-- el !-->
    <h1 id="titleId"><em>orange</em></h1>      <!-- el2 !-->
    <script src="js/all.js"></script>
</body>
</html>
```
<h3>JavaScript</h3>
まず、documentはHTMLの内容そしてquerySelectorを引き続いで目標のタグを指定される、便利になる為に、変数代入することは必要である。

```queryse.js
var el = document.querySelector('.titleClass em');
el.textContent ='yellow';
var el2 = document.querySelector('#titleId');
el2.textContent='red';

````

それでは、変数保存した内容メソッドはtextContentを引き継いで、変更したいの内容を代入できます。ちなみに、classの指定符号は『.classname tagname』、idは『#idname』を使われる。

<h2>querySeletorAllとは</h2>
querySeletorは便利けれども、二つ以上の条件はできません。

```not_effect_query.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="css/style.css">
    <title>Document</title>
</head>
<body>
    <h1 class="titleClass"><em></em></h1>　
    <h1 class="titleClass"><em></em></h1>      
    <script src="js/all.js"></script>
</body>
</html>
```

以上は同じタグを選びたい、一応querySeletorを試す。

```not_effect_query.js

var el = document.querySelector('.titleClass em');
el.textContent ='yellow';

```
その結果は一つタグを表示された。
<img width="956" alt="螢幕快照 2019-09-09 19.12.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475097/150ee4c7-6e57-1b5c-42cf-058a3e681be4.png">
```
<h3>修正後</h3>

この状況を会ったら、querySelectorAllはなおしてみると、複数クラス指定できた。

```querySelectorAll.js
var el = document.querySelectorAll('.titleClass em');


el[0].textContent = '123';
el[1].textContent = '123';

var elLen = el.length;

for(var i = 0;i<elLen;i++){
    el[i].textContent = i+'123';
}

```
実際はquerySelectorAllに指定したものは配列になる、それでは配列のインデックスで内容を操作できる、ちなみに、配列は長くなればループを使わればはもっと便利になる。
プログラム言語ランキング

#はじめに
プログラム言語数多くあります。
プロジェクトの言語選択、新しい言語勉強などランキングを見て、プロジェクトに応じて、自分が興味ある言語を選択したほうがよいかもしれません。

ランキングはいくつかありますが、定期的に最新情報を確認し、動向を把握しましょう
各ランキングの指標は違いますので、一番よいとか判断しにくいです。参考情報として利用すればよいかと思います。

- PYPL PopularitY of Programming Language
- Stack Overflow
- IEEE Spectrum 
- TIOBE Index

#PYPL PopularitY of Programming Language
The PYPL PopularitY of Programming Language Index is created by analyzing how often language tutorials are searched on Google.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/33abdce9-0bb5-8dad-71d6-f89c637e66c3.png)

URL: http://pypl.github.io/PYPL.html

#Stack Overflow
##Most Popular Technologies
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/78a21fcd-b867-3b2e-3297-48e5ce3956a7.png)

URL: https://insights.stackoverflow.com/survey/2019#technology

##Most Loved, Dreaded, and Wanted Languages
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1a2ad157-fe7a-62c5-27ff-569c72d4e358.png)

https://insights.stackoverflow.com/survey/2019#most-loved-dreaded-and-wanted

#IEEE Spectrum 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/0baec52b-115f-0384-f087-bc21ad30a6ec.png)

URL: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2019

#TIOBE Index
計算用の集計データはGoogle, Bing, Yahoo!, Wikipedia, Amazon, YouTube, Baidu からのものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/14adf44f-ad1f-524e-b04f-e58e991ee045.png)

https://www.tiobe.com/tiobe-index/

#まとめ
上記のランキングをみると、JAVA、C、Python、JavaScriptはTOP4のようなイメージです。
これらを確実把握したらプロジェクトに使う機会は多いと思います。

更にランキングのトレンドをみて、変化の激しい言語に注意しましょう。
上昇：勉強する必要があるかもしれません。
低下：新しい言語として勉強したい場合は再検討

以上
【Windows】社内WebシステムをAD連携してシングルサインオンにする(統合Windows認証)

Active Directory + IIS で、社内(イントラネット)Webサイトをシングルサインオンにできる。

# 統合Windows認証を使える条件

[よくあるご質問：統合Windows認証の設定方法を教えてください。│グループウェア desknet's NEO](https://www.desknets.com/neo/faq/result/1107/)

※ある製品のサポートページだが、統合Windows認証が使える条件が詳しく書かれている。

サーバー側

*   Windows Server および IISを使用する。
*   Active Directoryドメインに参加している。

クライアント側

*   PCがActive Directoryドメインに参加していて、ログオンユーザーもドメインユーザーである。
*   インターネットオプションで、サーバーをイントラネットもしくは信頼済みサイトと認識している。

# イントラネットサイトの判別

統合Windows認証が通るかどうかは、接続先がイントラネット内にあるかどうかで決まり、その判断はクライアントのブラウザによって行われる。

[IE のセキュリティ ゾーンについて – Japan IE Support Team Blog](https://blogs.technet.microsoft.com/jpieblog/2016/05/27/ie-securityzone/)

端的にいうと、Webサイトのページのプロパティを見て「ゾーン」が「ローカルイントラネット」になっていれば良い。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/76156eb3-9b0c-2dc7-21bd-e7dd70819cd5.png)

ローカルサイトかどうかは、設定は色々あるが、まずURLで判定されている。URLにドットが含まれていない場合は、ローカルサイトとみなされる。  
つまり、以下のような感じ：

*   `http://server/`　→　ローカルサイト
*   `http://192.168.1.1/`　→　インターネットサイト
*   `http://server.co.jp/`　→　インターネットサイト

その他、プロキシ除外に指定したサイトはローカルイントラサイトとみなしたりする。

参考：
[IE 限定じゃない統合Windows認証－Chrome / Edge / Firefox でも！ | 鉄飛テクノロジー](https://www.teppi.com/column/fileblog_update/update0008/)


# 統合Windows認証を使う

[ASP.NET で Windows 認証および Windows 承認を実装する方法](https://support.microsoft.com/ja-jp/help/323176/how-to-implement-windows-authentication-and-authorization-in-asp-net)

## IIS の設定補足

上記サイトを見れば大体は分かるが、IIS設定部分が分かりづらかったので画像を載せた。

IISマネージャーを開き、対象のWebサイト → 認証 を押す。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/4501d492-f726-1e53-1b10-c91741f09026.png)

「Windows認証」のみ有効にする。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/94cb6849-7a67-9b65-78ce-d934658f08c9.png)

# これを調べたきっかけ
社内のあるWebシステムで統合Windows認証を利用していたが、プロキシサーバーの利用をやめた途端、認証を求めるダイアログが表示されるようになった。
私の入社前から稼働していたシステム＆外部ベンダー製ということもあり、何も知らないので少し調べてみた記録がこの記事。

プロキシサーバー利用時に何故統合Windows認証が有効だったかというと、「インターネットオプションのセキュリティ設定で、プロキシサーバーを使用しないサイトをイントラネットに含める設定になっていて、かつ、プロキシ例外に`192.168.*`が入っていたから、イントラネットと判定された」ことが理由っぽい。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/18bfc3e2-67bc-480a-9c6c-f9dc287d2514.png)

件の社内システムのURLはIPアドレスだったので、これを試しにサーバー名(ドット無し)に変えてみたところ、イントラネットサイトと認識され、認証がすんなり通った。
対応方法としては、インターネットオプションを変更し、IPアドレスをイントラネットサイトに含めるのも良いと思う。
MacOS MojaveにPHP7.3をinstallする方法

# MacOS MojaveにPHP7.3をinstallする方法

brewでphp7.3にupdateしようとしたらつまずきました。
curlでインストールしたところうまくいきました。

#### curlでphp7.3をinstall
```
curl -s http://php-osx.liip.ch/install.sh | bash -s 7.3
```


#### PATHを追加
zsh user は ~/.zshrcに追加

```~/.bash_profile
export PATH=/usr/local/php5/bin:$PATH
```


That's it!
Ruby on Rails ページ 作成 する コマンド

# 目的

- Ruby on Railsを使用したWebアプリ作成で新しいページを作成する際にコントローラファイルとアクションを新規作成するコマンドを知る

# 抑えるポイント

- 紹介するコマンドはコントローラファイルが存在しない状態で新しくページを作成する際に使用できる。
- コントローラファイルが既に存在していて、ビューファイルを作成したいときはコマンドでの作成はできない。

# 書き方の例

- 下記コマンドを使用して新規ページを作成する。

```
rails g controller コントロールファイル名 記載されるアクション名
```

# より具体的な例

- uersコントローラファイルの中にeditアクションを新規追加したいときのコマンドを入力する。

```
rails g controller uers edit
```
DB2(9.7)でCHAR型の列のサイズを変更する

DB2(9.7)でCHAR型3桁の列のサイズを4桁にする必要があったのでコマンドをメモします

ALTER TABLE ALTER COLUMN　SET DATA TYPEを使用して

```
ALTER TABLE {スキーマ名}.{テーブル名} ALTER COLUMN {カラム名} SET DATA TYPE CHAR(4);
```

再編成が必要な場合

```
REORG TABLE {テーブル名}
```

# 参考
ALTER TABLEの細かい仕様については以下のURLを参照しました。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000888.html

REORGの細かい仕様については以下のURLを参照しました。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001966.html
VSCodeでArduino開発環境の準備

#VSCodeでArduino開発環境の準備

シリアルモニタの文字化けやincludeのリンク切れがあったので解消メモ

##手順
1. ArduinoIDEのダウンロードとインストール
2. VScodeのプラグインをインストールとArduinoIDEへのパス設定
3. VScodeのsetting.jsonと.vscode/c_cpp_properties.jsonの設定


### 1. ArduinoIDEのダウンロードとインストール

#### arduino-1.8.9-windows.exeのダウンロードとインストール

**Windows Installer, for Windows XP and up** からダウンロード
何も考えず「次へ」的なボタンを押してすすめる
https://www.arduino.cc/en/Main/Software
![NoName_2019-9-9_17-26-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0446bd66-7579-e1a4-ef23-eea14add7b04.png)


### 2. VScodeのプラグインをインストール

#### Arduinoプラグインをインストール
Marketplaceで「**Arduino**」検索で出てくるプラグインをインストール
![NoName_2019-9-9_17-28-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/a53d6d0a-d0b0-fc35-3f28-551abfa9efd8.png)

#### Arduino:Pathを設定
VScodeの左下歯車の「**設定＞拡張機能＞Arduino configuration**で「**Arduino:Path**」を設定
![NoName_2019-9-9_17-31-11_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/63c5c2d3-bdda-e081-c042-ded9be3bd210.png)


### 3. VScodeのsetting.jsonと.vscode/c_cpp_properties.jsonの設定

パスを拾うようにするためにこれらを設定すると良いらしい
(設定しなくてもビルドできたけど、コンソールでエラー出てるの気になるから。。)

#### VScodeのsetting.json
ヘッダー名を探してくれるようになる？

```
"C_Cpp.intelliSenseEngine": "Tag Parser"
```

#### .vscode/c_cpp_properties.json
**#include**関係のパスが通ってないので設定を追加する

```
#c_cpp_properties.json
{
  "env": {
    "PACKAGES_PATH": "C:/Program Files (x86)/Arduino",
    "USER_PATH": "C:/Users/username/Documents/Arduino"
  },
  "configurations": [{
    "name": "Win32",
    "includePath": [
      "${workspaceFolder}"
    ],
    "browse": {
      "path": [
        "${workspaceFolder}",
        "${env:PACKAGES_PATH}/tools",
        "${env:PACKAGES_PATH}/hardware",
        "${env:PACKAGES_PATH}/libraries",
        "${env:USER_PATH}/libraries"
      ]
    },
    "forcedInclude": [
      "C:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Arduino.h"
    ],
    "intelliSenseMode": "msvc-x64",
    "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
    "cStandard": "c11",
    "cppStandard": "c++17"
  }],
  "version": 4
}

```

|  プロパティ名  |  説明メモ  |
| ---- | ---- |
|  env  |  json内の環境変数  |
|  PACKAGES_PATH  |  TD  |
|  USER_PATH  |  TD  |
|  ${env:PACKAGES_PATH}/tools  |  Arduinoが元々持っているライブラリ  |
|  ${env:PACKAGES_PATH}/hardware  |  Arduinoが元々持っているライブラリ  |
|  ${env:PACKAGES_PATH}/libraries  |  Arduinoが元々持っているライブラリ  |
|  ${env:PACKAGES_PATH}/libraries  |  Zipなどで追加したライブラリ  |

###参考サイト
- ArduinoIDEをアップデートしたらVSCodeのArduino出力で文字化け<br>
https://qiita.com/nori-dev-akg/items/e0811eb26274910cdd0e
- Visual Studio Code for Gamebuino/Arduino with IntelliSense<br>
https://github.com/bfxdev/Arduino/blob/master/VSCode/README.md
- Visual Studio Code extension for Arduino で電子工作<br>
https://another.maple4ever.net/archives/2328/
【ExcelVBA】ColumnsとEntireColumnの違い

# はじめに

Excel VBAでは、列の選択方法に「Columns」と「EntireColumn」という2つの方法があります。
同じ操作をするのに、なぜ2つの方法が存在するのかが分からなかったので、両者を少し調べてみました。

# Columnsプロパティ

* Columnsは「"レシーバ"で指定された範囲の内、指定された列範囲を返す」という処理です。
 * 以下のコードだと、B列が`ary2D`に代入されます。

```vb:ColumnsSelector.bas
Sub SelectByColumns()
    Dim ary2D As Variant
    ary2D = ThisWorkbook.Worksheets(1).Range("B:F").Columns(1)
End Sub
```

# EntireColumnプロパティ

* EntireColumnは「"レシーバ"で指定された範囲を含む列全体を返す」という処理です。
 * 以下のコードだと、レシーバで指定されているB列からF列までの5列が`ary2D`に代入されます。
* [MicrosoftのAPI](https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.entirecolumn)によると、EntireColumnは「読み取り専用」と書かれているため、用途が限られると思われます。

```vb:ColumnsSelector.bas
Sub SelectByEntireColumn()
    Dim ary2D As Variant
    ary2D = ThisWorkbook.Worksheets(1).Range("B:F").EntireColumn
End Sub
```


# その他

* @KotorinChunChun さんからのご指摘を踏まえて、記事を全面的に見直しました。
AWS Amplify+IAM未認証ユーザでAppSyncを使う（Androidアプリ）

# 参考

Web版があったので、こちらを参考にさせてもらいました。
https://qiita.com/youn4101/items/9bca97083f07d1b9af12

# Android Studioのプロジェクトを新規作成
Basic Activityを作成し、ここに従う。
https://aws-amplify.github.io/docs/android/start

# amplifyの設定
```
amplify configure
amplify init
amplify add api

? Please select from one of the below mentioned services GraphQL
? Provide API name: amplifyguestaccess
? Choose an authorization type for the API API key
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? Yes
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)
? Do you want to edit the schema now? Yes
Selected default editor not found in your machine. Please manually edit the file created at /Users/.../schema.graphql
? Press enter to continue 
```
ひとまず先述のURL（ https://aws-amplify.github.io/docs/android/start
 ）をもとに、API Key でToDoのサンプルが動作するようにする。

# Cognito, IAM
ここでは、 Cognito サービスにて、 `amplify_guest_access` というID プールを作成。
`認証されていない ID に対してアクセスを有効にする`　にチェックを入れる

作成されたロールを確認し、 `認証されていないロール` （`Cognito_amplify_guest_accessUnauth_Role `）をIAMにて編集し、AppSyncへのアクセスを許可する。

``` json
{
    "Effect": "Allow",
    "Action": [
         "appsync:GraphQL"
    ],
    "Resource": "*"
}
```

## awsconfiguration.json

``` json
    "CredentialsProvider": {
        "CognitoIdentity": {
            "Default": {
                "PoolId": "ap-northeast-1:b2bddc1a-f3bb-41fb-a93d-975f92457207",
                "Region": "ap-northeast-1"
            }
        }
    },
    "AppSync": {
        "Default": {
             (中略)
            "AuthMode": "AWS_IAM"
        }
    }

```

## MainActivity.kt

``` kotlin
        val credentialsProvider = CognitoCachingCredentialsProvider(applicationContext, AWSConfiguration(applicationContext))

        mAWSAppSyncClient = AWSAppSyncClient.builder()
            .context(applicationContext)
            .awsConfiguration( AWSConfiguration(applicationContext))
            .credentialsProvider(credentialsProvider)
            .build()

        runMutation() // 任意の場所で

```

上記が実行されると、DynamoDBのTableにItemが追加される。
HTML5にpptxを挿入します

# pptxファイルをフォルダに入れる
何もない

# bxSliderをダウンロードする
ホームページ：
https://bxslider.com/
installボタンを押して、インストールページにアクセスする。

# 最も簡単な方法でやる
「The Easy Way」が書かれた部分のコードをコピーして、headとbodyをそれぞれHTML5ファイルに記載する。

# body部分を修正する
```html
  <div class="slider">
    <div>I am a slide.</div>
    <div>I am another slide.</div>
  </div>
```
上記コード、真ん中の2行をpptxファイルの情報に書き換える。srcの部分を、pptxのディレクトリに書き換える。
例：

```html
  <div class="slider">
    <div><img src="/stats/pic/P1.png" width="750px" height="400px"></div>
    <div><img src="/stats/pic/P2.png" width="750px" height="400px"></div>
  </div>
```
imgタグは、別の属性もある。ネットで調べて出てくる。

# HTML5にiframeタグを使ってやりたい時
HTML5ファイルに挿入したい場所でiframeタグを書く。
例：

```homepage.html
<html>
<head>
...
<iframe src="slideshow.html" width="750px" height="480px"></iframe>
...
</head>
</html>

```
 
```slideshow.html
<html>
<head>

  <link rel="stylesheet" href="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>

  <script>
    $(document).ready(function(){
      $('.slider').bxSlider();
    });
  </script>

</head>
<body>

  <div class="slider">
    <div><img src="/stats/pic/P1.png" width="750px" height="400px"></div>
    <div><img src="/stats/pic/P2.png" width="750px" height="400px"></div>
  </div>

</body>
</html>
```
# iframeタグを使ってできたやつ
### (これはキャプチャ)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344598/dcd7c9fd-50fe-2117-f50a-813b196f3a5d.png)
【AndroidStudio】RelativeLayoutの使い方

#RelativeLayoutとは？
View（LayoutとWedgetの総称）を相対的に配置するためのレイアウトです。

AndroidStudioのレイアウトのText文を見ると
（場所は、プロジェクト配下のapp/src/main/res/layout/activity_main.xml）

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="horizontal" 
tools:context=".MainActivity">
```
２行目に”android.support.constraint.ConstraintLayout”って書いてありますね。

現在使用しているAndroidStudioでは(現在使用中のバージョンは3.4.1)
自動でこのConstraintLayoutモードで編集してくれるみたいですが、
このレイアウトが何なのか？はさておき（いまいちよく分かってない泣）

この一文すべて消して、RelativeLayoutって書き換えます。

※RelativeLayoutのレイアウトではandroid:orientationの項目使用しないので、消しちゃいましょう。

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 

android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity">
```

ここで、Design画面に移ってAll Attributes（下記画像の右側の文字ずらーって並んでるところ。）を見直してみると、

![0701Layput05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446126/1cc816bf-346e-9857-8aa6-12d8587dc508.png)

layout_align何とかって項目達が追加されています！

ここで追加された、このRelativeLayout特有の項目について以下説明します。

##RelativeLayout特有の項目

- 親レイアウトを基準とする項目
 
| 項目名      　　　　　　　　| 配置    　　　　  　　　　| 
|:--------------------------|:------------------------|
| layout_alignParentLeft   | 親レイアウトの左端に配置  |         
| layout_alignParentRight   | 親レイアウトの右端に配置  |
| layout_alignParentTop     | 親レイアウトの上端に配置  |
| layout_alignParentBottom  | 親レイアウトの下端に配置  |
| layout_centerInParent     | 親レイアウトの中央に配置  |

- 指定Viewを基準とする項目

| 項目名      　　　　　　　　| 配置    　　　　  　　　| 
|:--------------------------|:------------------------|
| layout_toLeftOf   | 指定 View の左側に配置  |         
| layout_toRightOf	 |指定 View の右側に配置 |
|layout_above	|指定 View の上側に配置  |
| layout_below	|指定 View の下側に配置  |
| layout_alignLeft	|指定 View の左端ラインに合わせて配置  　　　|
| layout_alignRight	|指定 View の右端ラインに合わせて配置  |
| layout_alignStart	|指定 View の左端ラインに合わせて配置  |
| layout_alignEnd	|指定 View の右端ラインに合わせて配置  |
| layout_alignTop	|指定 View の上端ラインに合わせて配置  |
| layout_alignBottom	|指定 View の下端ラインに合わせて配置  |
| layout_alignBaseline	|指定 View のテキストのラインに合わせて配置 |

- 共通項目

| 項目名      　　　　　　　　| 配置    　　　　  　　　| 
|:--------------------------|:------------------------|
|layout_marginLeft   |現在位置の左側に指定幅の余白を設定  |         
|layout_marginRight	 |現在位置の右側に指定幅の余白を設定 |
|layout_marginTop	|現在位置の上側に指定幅の余白を設定  |
|layout_marginBottom	|現在位置の下側に指定幅の余白を設定  |
Windowsマシン上でsftpコマンドの-iオプション使うときのパス指定について

なんかあんまりググっても見つからなかったので自分用のちょっとしたmemoとして残す。
Windowsマシン上において、コマンドプロンプト上でsftpコマンドの-iオプション（鍵を指定するオプション）で、任意のファイルを指定するときのパスセパレータは「/」を使う。
``sftp -i ./.ssh/id_rsa_test``とか``sftp -i C:/Users/test/.ssh/id_rsa_test``みたいな感じ。
Manjaro Linux 自分用インストールメモ

今回初投稿ですので至らない点があったらご指摘ください
#インストールに使用したPC
manjaroのインストールにはthinkpad x230を使用しました
ちなみにthinkpadの改造はネットに大量の記事があるのでそちらを参照してください

#manjaroのディスクイメージ
[こちら](https://manjaro.org/download/)からダウンロード
今回はXfceでダウンロードしました

#Live USBの作成
[Rufus](https://rufus.ie/)を使用しました
手順としては
1.  デバイスを選択（今回はUSBを指定）
2.  選択からmanjaroのディスクイメージを指定
3.  スタート
これでしばらく待てばLiveUSBが作成されます

#ThinkPadのBIOS設定
F12キーを押してブートメニューからUSB HDDを選択するとUSBで起動ができます

#BOOT画面
1.UTC => Asia/Tokyoを選択
2.lang => 日本語を選択
3.keybord => jpを選択
4.boot

#デスクトップ画面起動後
ようこその画面が出てくるのでインストーラーを起動を選択

#インストーラー画面
言語は日本語を選択
地域はAsiaゾーンはTokyo
キーボードはJapaneseでデフォルトを選択
パーティション分割は今回はしません（ほかの方の記事を参照してください）
ディスクの消去を選択
名前PWを設定する。ここで管理者アカウントと同じPWを使用するを選択するといろいろ便利

#Manjaroを日本語入力できるようにする
只今編集中です
[ManjaroWiki](https://wiki.manjaro.org/index.php?title=%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E8%A8%AD%E5%AE%9A)から参照する。
```sudo pacman -Syy
sudo pacman -S fcitx```

```sudo pacman -Syy
sudo pacman -S fcitx```