OmniAICreator/Qiita-1.07M huggingface dataset:
JSFの画面を表示したらjavax.el.ELException: Not a Valid Method Expression:となった時の対応方法

- 環境
    - Windows10 Pro 64bit
    - Eclipse Version: Oxygen.3a Release (4.7.3a)
    - (プロジェクト用)java version "1.7.0_79"
    - (Eclipse用)java version "1.8.0_231"

# 事象 : .xhtmlに試しにボタンを追加して表示したら怒られた
```log
javax.el.ELException: Not a Valid Method Expression: 
    at com.sun.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:311)
    at com.sun.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:96)
    at org.jboss.weld.util.el.ForwardingExpressionFactory.createMethodExpression(ForwardingExpressionFactory.java:43)
    at org.jboss.weld.el.WeldExpressionFactory.createMethodExpression(WeldExpressionFactory.java:53)
    at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:240)
...
```

# 原因 : ボタンのアクション属性を指定していないから
[javax.el.ELException: Not a Valid Method Expression: (JSF forum at Coderanch)](https://coderanch.com/t/622792/java/javax-el-ELException-Valid-Method)

```xhtml:追加したボタン
<h:commandButton action="" value="ボタン" />
```

## 対応 : ボタンのアクション属性を指定する
```xhtml:追加したボタン
<h:commandButton action="{ponController.go}" value="ボタン" />
```
複数人で新規Railsプロジェクトを立ち上げる時の落とし穴

## 概要

複数人でRailsプロジェクトに携わる際に、最初にハマった落とし穴の備忘録

## 環境

macOS 10.13.6
Rails 6.0.0
Ruby 2.6.5
docker desktop 2.1.0.3
docker-compose 1.24.1

## 発生した問題

1. 別の人が `rails new` コマンドで新規プロジェクトを作成し、Gitのリポジトリにpush
1. 自分がそのリポジトリをcloneし、 `docker-compose build`
1. `docker-compose up` したところ ``ArgumentError: Missing `secret_key_base` ``エラーが発生

## 試した内容

* エラー文に `` set this string with `rails credentials:edit` ``とあるので、何も考えずにコマンドを実行  
結果、railsコマンドの使い方知らねーの？って怒られる

```
    Usage:
      rails new APP_PATH [options]
      (以下略)
``` 
* エラー文でググったところ、`config/master.key`がないためと判明。何も考えずに別プロジェクトの`config/master.key`をコピーしてみる
結果、`ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage`エラーが発生
少し考えれば、別プロジェクトの`master.key`で通るわけもなく。。。

## 問題の原因

ここまでやって、ようやく少し考えながら調べました。
Rails 5.2から`secrets.yml`に代わり、`config/credentials.yml.enc`という暗号化したファイルで取り扱うことに。  
このファイルを複合するために`config/master.key`か`` ENV['RAILS_MASTER_KEY'] ``が必要になりました。  
つまり暗号化したファイルを複合するための鍵がないからエラーになっていたというわけです。
  
`config/master.key`と`config/credentials.yml.enc`は`rails new`のタイミングで生成されますが、ここで落とし穴。  
`config/master.key`はデフォルトで`.gitignore`に含まれています。  
つまり、プロジェクト作成者がこの事を知らずにpushした場合、`config/master.key`が含まれないことになります。  

## 問題の回避方法

ここまでわかればあとは簡単です。  
プロジェクト作成者に`.gitignore`の`config/master.key`部分をコメントアウトしてもらって、改めて`config/master.key`をpushしてもらえば解決です。  
`` ENV['RAILS_MASTER_KEY'] ``を`.env`で設定する方法もあるかと思いますが、`config/master.key`をpushしてもらう方が楽だと思います。

## まとめ

何も考えずに行動するのは、だいたい時間の無駄になるので気をつけましょう。
【jQuery】クリックした画像を表示切り替えできるようにする方法

# はじめに

某フリマサイトの模写作成中の備忘録です。
このように簡単に表示切り替えをつける方法を紹介します！
[![Image from Gyazo](https://i.gyazo.com/1c0bfeaefe17f32bc62807dee66410b4.gif)](https://gyazo.com/1c0bfeaefe17f32bc62807dee66410b4)

# 解決方法
[~.html.haml]
[![Image from Gyazo](https://i.gyazo.com/6995518078f67374301162e9a6b86f32.png)](https://gyazo.com/6995518078f67374301162e9a6b86f32)
こちらは、コントローラーで「@images = @product.images」を定義して
DBからデータを取得し配列の[0]番目を大きい枠の表示にし、下の小さい枠にeachを使い順番に表示させています。



[~.js]
[![Image from Gyazo](https://i.gyazo.com/82bd06eb4f364f08366fdfea33cbfe99.png)](https://gyazo.com/82bd06eb4f364f08366fdfea33cbfe99)
こちらで、class:"details__photo__under__image"をクリックすると
$(this).attr("src");　でクリックされた要素を取得する
("img#mainphoto").attr({src:ImgSrc});　で表示させる
$("img#mainphoto").hide();
$("img#mainphoto").fadeIn(); で要素を隠しながらふわっと表示するように見せています。

jQueryはアニメーションが色々できるので面白いですね〜☆
機種依存文字について

メモ帳などに入力しているときに
「自分だけが見るときは良いけど、WEB上で他の人が見るのに①とか使っていいのかな？:thinking:」
と思ったので調べてみた。

#機種依存文字とは
ある特定の環境上(WindowsやMacintoshなどのOS)でしか正常に表示されない文字

###機種依存文字の例
- 丸で囲んである文字(① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳)
- ローマ数字(ⅠⅡⅢⅣⅤⅥ Ⅶ Ⅷ Ⅸ Ⅹ)
- 単位(㎜ ㎝ ㎞ ㎎ ㎏ ㏄ ㍉㌔ ㌢ ㍍㌘ ㌧ ㌃ ㌶ ㍑ ㍗ ㌍ ㌦ ㌣ ㌫ ㍊ ㌻)
- 省略文字(㈱ ㈲ ㈹ ㍾ ㍽ ㍼ ㍻ № ℡)

他にもありますがこちらに載っています→https://mect-japan.com/2019/guide/izon.html

#文字化けする理由
分かりやすく説明しているサイトがあります→https://www.asobou.co.jp/blog/web/izonmoji

#文字化けをしないために
文字化けしないようにするにはhtmlファイルで

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
...
</head>
```
というように文字コードを**utf-8**にしてあげればいい(大文字**UTF-8**も可)。
開発環境によってはutf-8以外を使うこともあると思いますが…
メールコーディングでうまく行かない時に読むページ

# メーラバグについて
この頃はメールコーディングを中心にお仕事をしているのですが、とにかくバグが多い。
ブラウザでうまく表示されていても、メール配信テストをしてみると崩れているということは日常茶飯事。地道に一つずつ検証を重ねることで、メーラーでのレイアウト崩れを解消するナレッジが少し溜まってきたので、こちらにまとめておこうと思います。

# 検証メーラー
- Outlook365（ブラウザでなくアプリケーション版のOutlookメール）←バグ多し
- Yahoo!メール
- iPhone、Androidの標準メーラー
 
※Gmailは割と優秀

# バグと対処法
## Outlook365
### 行の高さがline-heightで設定している値よりも大きくなる
<発生原因>
outlook特有のバグ。

<回避方法>
line-heightとセットにして
```mso-line-height-rule:exactly; ```
をCSSスタイルに設定する。


### 文字の上部が切れて表示される
＜発生原因＞
outlook特有のバグ。line-heightの値がテキストサイズ以下だとテキストの上部が見切れる。

＜回避方法＞
line-heightの値を**font-sizeよりも最低2px大きい値**にする。


### 中央と右寄せのa要素がリンクの範囲外でもクリックできてしまう
＜発生原因＞
outlook特有のバグ。リンクエリア外を押しても遷移してしまう。

＜回避方法＞
aタグの前に```&nbsp;```を入れる。



## Yahoo!メール
### Yahooメールでstyle内のheightがmin-heightに書き換えられてしまう
＜発生原因＞
Yahooメールの仕様と思われる。max-heightなどの記述は書き換えられない。

＜回避方法＞
styleでheight指定をせず、HTML属性のheightで指定すること。

○良い例

```html

<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="3" >&nbsp;</td>
</tr>
</table>
```

☓悪い例

```html
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="height:3px;">&nbsp;</td>
</tr>
</table>
```



## iOSメール
### iOS標準メールアプリなど、本文に自動でリンクが貼られる
＜発生原因＞
iOSなど端末の仕様。
本文中の日時などを検知し、カレンダー登録などができるように自動でリンクタグが貼られる。
（自動で```<a>```タグが挿入されている…驚き）

＜回避方法＞
CSSスタイル追加
以下を```<head>```でスタイル記述し、該当箇所にクラス付与する。

```CSS
.link_disable a {
  color: inherit;
  text-decoration: none;
  pointer-events: none;
}
```

## その他
### 長いURLやテキストを入れると画面幅が広がってしまう
＜発生原因＞
英数字の途中で自動改行が起こらないため、画面幅が広がる。

＜回避方法＞
該当箇所に以下の折返しスタイルを記述する。

```HTML
<span style="word-wrap:break-word; word-break:break-all;">該当するURL・テキスト</span>
```
Sidekiqのジョブライフサイクル [翻訳]

# Sidekiqのジョブライフサイクル

最終更新 2018/03/28 編集者 Stefan Wrobel

[Web UI](https://github.com/mperham/sidekiq/wiki/Monitoring#web-ui)を最初に見たとき、ページ上部にジョブのカウンターがあることに気付くと思います。このドキュメントでは、それぞれの状態にどのような意味があるのか、ジョブが各状態間をどのように遷移するのかを解説します。

<img width="1426" alt="スクリーンショット 2019-10-17 17.40.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/da0c62fd-968d-bb9e-9c89-ab19ee731409.png">


- **完了（Processed）** ジョブが正常に完了した数。それ以上何かが起きることはありません。
- **失敗（Failed）** 実行されたジョブで例外が起きた（≒失敗した）回数。デフォルトのリトライ回数は25回のため、1つのジョブは最大で25回失敗する可能性があります。
- **実行中（Busy）** 現在実行中の数。
- **待機状態（Enqueued）** キューの中で実行される順番を待っている数。（キュー毎にプッシュされた時間順にリストされています）
- **再試行（Retries）** 失敗したものの、将来のどこかで[自動的に再試行](https://github.com/mperham/sidekiq/wiki/Error-Handling#automatic-job-retry)される数。（プッシュされた時間順に並べられて）
- **予定（Scheduled）** 将来のどこかで実行するよう[指定された](https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs)数。（指定時刻がくるとエンキューされます）
- **デッド（Dead）** 完全に失敗してしまった数。手動で再試行できるように[保存されます](https://github.com/mperham/sidekiq/wiki/Error-Handling#dead-job-queue)。

※ 注意点として、1回以上失敗しその後に成功したジョブは、Processed（完了）とFailed（失敗）の両方にカウントされることがあります。

![29632389-ddedb250-8810-11e7-8574-b94601ef2d8d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/f5e30888-a9ad-f5ad-9a3b-1f0245335166.png)


## ライフサイクルを変更する

再試行の設定をワーカーまたはジョブに指定することで、再試行を完全に無効化（ジョブは「デッド」に直接送信）したり、「デッド」に送られることすら無効化（失敗したジョブは破棄）したりすることができます。もし、「失敗」の数が増えているのに「再試行」または「デッド」のカウントが増えない場合は、再試行の設定を見直してみてください。（自分で無効にしていないかどうか）

```ruby
class SomeWorker
  # 「再試行」または「デッド」のどちらにも送られません
  sidekiq_options retry: false

  # 最初の失敗後にすぐ「デッド」へ送られます
  sidekiq_options retry: 0
end
```
Java結合とWordドキュメント内の表のセルの分割

ここでは、JavaアプリケーションでWordドキュメント内の表のセルの結合と分割を紹介します

セルの結合:

Spire.Doc結合セルは、水平結合と垂直結合の2つに分類されます。水平結合の場合applyVerticalMerge(int a , int a ,int a) 列の指定、結合したい開始行と終了行. 垂直結合時に、applyHorizontalMerge(int a, int a, int a) 行の指定、結合したい開始列、終了列を指定します。

```java

import com.spire.doc.*;

public class MergeTableCell {
    public static void main(String[] args) throws Exception {

        String output = "output/MergeTableCells.docx";

        //新しいwordの例
        Document document = new Document();

        // 4*4のテーブルを追加します
        Section section = document.addSection();
        Table table = section.addTable(true);
        table.resetCells(4, 4);
        
        //水平結合
        table.applyHorizontalMerge(0, 0, 3);

        // 垂直結合
        table.applyVerticalMerge(0, 2, 3);

        // 文書を保存
        document.saveToFile(output, FileFormat.Docx);
    }
}
```
![Merge cells.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/692511f6-0ee2-1c02-6590-3c6228f49aea.jpeg)

セルの分割：
セルを分割するには、まずセルを取得し、セルの分割された列の数と行の数を指定します。
import com.spire.doc.*;

```java
public class SplitTableCell {
    public static void main(String[] args) throws Exception {

        String output = "output/SplitTableCells.docx";

        //新しいwordの例
        Document document = new Document();

        //4*4のテーブルを追加
        Section section = document.addSection();
        Table table = section.addTable(true);
        table.resetCells(4, 4);

        //セルの分割
        table.getRows().get(3).getCells().get(3).splitCell(2, 2);

        //文書を保存
        document.saveToFile(output, FileFormat.Docx);
    }
}
```
![Split cell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/cc1181ae-e553-71ea-6b99-e4d4de763f1b.jpeg)
Ruby, Ruby on Railsの学習を始めます。

<h1>自己紹介</h1>
現在大学5年生（色々あり留年しました）です。
Rubyに関しては4年生の秋頃、某プログラミングスクールで1ヶ月半学んでいましたが
持ち前の行動力と勢いだけで初めてしまったため最終課題のオリジナルアプリ制作を
達成する事なく卒業しました。
なので基本的な知識については頭の中に薄く残っている状態です。

<h1>このアカウントの目的</h1>
<ul>
<li><h2>勉強内容のアウトプット</h2></li>
誰かに伝えられるレベルまで理解をする事を目的とします
<li><h2>重要な部分の記録</h2></li>
一度立ち止まった内容を繰り返さない事を目的とします
<li><h2>インプットの量を増やす</h2></li>
エンジニアの皆様の情報に触れる機会を増やしモチベーションの維持を目的とします
<li><h2>オリジナルアプリの開発に向けて</h2></li>
現在作りたいWebアプリがあるため、それに向けた制作状況の記録を目的とします。
（就活などで少しでもアウトプットがある事の証明のためでもあります。）
</ul>

<h1>記載内容</h1>
<ul>
<li>学習時間</li>
<li>学習内容</li>
<li>学習中疑問に思った事</li>
<li>次回気をつける事のまとめ</li>
</ul>
＊内容は今後学習状況により変わっていくと思われます＊

基本的にはRubyやRuby on Railsの学習内容を記載していくつもりですが
なにぶん飽き性なため、HTMLやCSS、JavaScriptなどの覚書も
書いていく自分のためのブログになります。
今回は初めて投稿するので堅苦しくなっていますが、先人の書き方を取り入れて
よりグレードアップしていきたいと思います。
よろしくお願いいたします。
[Swift] お前らのNSFetchRequestの使い方は完全に間違えてる [CoreData]

### 序

`NSFetchRequest`にGenericsが導入されてキャストの嵐から解放されて久しいですが、どうもGenericsの使い方が全く分かっていないサンプルコードがあふれかえっているようなので、ここで改めて正しい`NSFetchRequest`の使い方を紹介しておきます。

### エンティティサンプル

エンティティは特に何でもよいのでごく単純な以下のものを使います。
エンティティ名はクラス名と同じです。

```swift
class Company: NSManagedObject {
    @NSManaged var name: String
}
```

### 悪い例

僕が怒り心頭の悪い例はこちらです。

```swift
func fetchAllCompanies() -> [Company] {
	let context: NSManagedObjectContext = ...

	let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Company")
	do {
		guard let companies = try context.fetch(request) as? [Company] else {
			fatalError("Can not cast fetch result.")
		}
		return companies
	}
	catch {
		print("Fetch error:", error)
		return []
	}
}
```

`NSFetchRequest`の型パラメータを`NSFetchRequestResult`としています。
これが完全な誤りです。
使い方を誤っているために本来必要ない`[Company]`へのダウンキャストの必要性が発生しています。

### 正しい例

こちらが正しい使い方です。


```swift
func fetchAllCompanies() -> [Company] {
	let context: NSManagedObjectContext = ...

	let request = NSFetchRequest<Company>(entityName: "Company")
	do {
		return try context.fetch(request)
	}
	catch {
		print("Fetch error:", error)
		return []
	}
}
```
`NSFetchRequest`の型パラメータに`Company`を用いることで、`NSManagedObjectContext#fetch(_:)`の戻り値の型は`[Company]`に確定します。
**ダウンキャストは不要**なのです。

### おわりに

某所で`NSFetchRequest<NSFetchRequestResult>`を使っているサンプルを発見してしまい、なんとなく検索してみると同様のサンプルがいまだに数多く残っていたので怒りに任せて書きました。
簡単にするための機構をあざ笑うかのようなこの所業はさすがに見逃せなく、煽りタイトルとさせていただきました。
僕はただ、正しい使い方を広めたかっただけです。
罵りは甘受します。
Jetson TX2 で Hostname Username が自動で設定される（JetPack 3.3.1/Ubuntu 16.04）

## 問題
* Jetson TX2 に **JetPack 3.3.1(Ubuntu16.04)** をインストールする際に `username`, `hostname` が勝手に設定されてしまう．（2019/10/16時点）
* **JetPack 4.2.2 (Ubuntu 18.04)** では，Jetson の方で初期設定（`hostname`, `username`, キーボード設定など）が聞かれ，そこで設定できる

[JetPack 公式インストールサイト](https://developer.nvidia.com/embedded/jetpack)

## やること
古いインストーラ (JetPack 3.3 以前) も試したが，Ubuntu 16.04 の入る JetPack では一旦自動で初期設定がされるので，後で変更する．

### Hostname の変更
二箇所のファイルを書き換えて再起動

```
sudo vi /etc/hostname
```

で `old_username` → `new_username` とする.

```
sudo vi /etc/hosts
```

で `old_username` → `new_username` とする.

### Username の変更
#### ユーザーの追加

```
sudo adduser new_username
```

対話形式で色々聞かれるので，適当に埋める．
`Full Name` などは Enterキー 連打で良い.

#### sudo 権限の付与

```
sudo usermod -a -G new_username
```

#### video グループに追加

```
sudo usermod leus -a -G video
```

これがないと再起動時に GUI がバグる（Jetson特有？）.
具体的には左側の Dock が消え，ウィンドウの外枠が表示されなくなった．

### その他
初期設定で行う，キーボード設定・地域設定なども「システム設定」から変更する．

## 参考文献
* [Ubuntu16.04でホスト名を変更する方法](https://ygkb.jp/3974)
* [ubuntu ユーザを追加して sudo 権限をつける](https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)
* [Issues with user accounts on TX2](https://devtalk.nvidia.com/default/topic/1025498/issues-with-user-accounts-on-tx2/)
IBM CloudのDb2にCLIでログインする時パスワードを""で囲む

IBM CloudのDb2 on CloudへDb2 CLIコマンドを用いて接続する時、パスワード指定の仕方でハマった事を共有させてください。
#結論
タイトル通りなのですが、CLIを用いてDb2にログインする時に

```
db2 connect to データベース名 user ユーザー名 using "パスワード"
```
のようにパスワードに""を付けて実行しないとエラーになる場合（私の事です）があるので""つけてコマンド実行してください。　と、言う事です。

いつものようにパスワードに""を付けずに実行すると以下のようなエラーになる場合があります。

```
SQL30082N  セキュリティー処理は、理由 "24" ("USERNAME AND/OR PASSWORD INVALID")により失敗しました。
SQLSTATE=08001
```

互換性がある、と私が勝手に思って以前から使っているIBM CloudのDb2 Warehouse（旧dashDB）では""を付けずに接続していたので気が付きませんでした。
いろいろまとめ

なんとなくまとめたいなと思ったものを載せていきます。

---

# 基本統計学

<img width="375" alt="B197E294-BE0E-4188-8D31-682DEDC96DE5.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/69940cff-7379-9b5b-7e7d-e9428e8fc828.jpeg">

https://www.amazon.co.jp/基本統計学-第4版-宮川-公男/dp/464116455X



分かりやすいのでオススメです。

特に、6 - 9章はよいです。

「7.6章 t分布」にある不偏分散ではなぜn-1で割るのかに関するくだりは、とても腑に落ちてわかりやすいです。

# AWS SDK for Python である boto の名前の由来は？

[AWS SDK for Python である boto という名前の意味と由来 - reboooot․net](https://reboooot.net/post/why-boto/)

これによると、どうやらアマゾン（地名）に住むアマゾンカワイルカの英語名に由来するそうです。

# AWS System manager から AWS SNS に書き込む権限を持つrole を作成する方法

maintenance window 用に作ることがあるかもしれません。

公式ドキュメントにまとめてありました。

[AWS Systems Manager の Amazon SNS 通知の設定 - AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/monitoring-sns-notifications.html)

# Azure VM（CentOS）で、Rails + Nginx にアクセスしようとすると、403 Forbidden が出る

```
open() "/var/www/rails/myapp/public/assets/xxx.css" failed (13: Permission denied)
```

みたいなエラーが出る時。
これの原因は、このページの⑤だったりするかもしれない。

[Nginxで403 Forbiddenが表示された時のチェックポイント5選](https://engineers.weddingpark.co.jp/?p=1765)

# さくさくやるために

ライブラリとかフレームワークとか、とりあえず使うものについては、みんな使っていて安定していて何が出来るかちゃんと分かっているものを使う。``ここまでについてはみんなやってるし、特に問題なく出来るだろう``という感じで、エラーが出る可能性が低く、エラーが出たとしても知見が多いからすぐに解消できる。その枠内でやっていれば、さくさく出来るはず。

一方で、あまり行われていないものを使うと、エラーが多すぎたりとか面倒な事が起きたり、ライブラリとして実装されていなくて自分で作るか、そもそもその状況では実現が難しすぎて無理みたいな感じになって詰み感が出る。ので、そういうものは使わない方向で行きたい感がある。

``要するに、みんな使ってて問題なさそうなやつをやっていればいいって感じなのかな。さくさくやるには。``

後、「もっと良い方法があるかもしれない」``「今後どこかのタイミングでもっと良い方法にしないといけない」``んだけど、現状それが見つからない場合は、``妥協して今あるのでやるのが良かったりする（とりあえずとして）。``
【Logstash】FileBeat Modulesとの併用

# 概要

Filebeat ModulesとLogstashを併用する構成を考えます。
ログのパースを行う場所をどこにするかによって構成が変わります。

一番簡単なのはログのパースをIngest Pipelineで行う構成ですが、LogstashのFilterを使う構成だとIngestPipelineではできない処理（フィールドの削除等）が可能になります。

# Filebeat Modulesの仕組み

FileBeat ModulesはIngest Pipelineを作成します。
ログの整形・加工はElasticSearchのIngest Nodeが担当します。

pipelineは以下のコマンドで作成できます。

```
filebeat setup --pipelines --modules nginx,system
```

確認は以下のコマンド

```
GET _ingest/pipeline/*
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427238/00485c47-38ee-2a8c-4713-46d7029d1277.png)

# 構成
## 構成1:パースをIngest Pipelineで行う

パースはESのIngest Pipelineで行う構成です。
LogstashのConfigにはFilterは入れず、Input, Outputのみです。

https://www.elastic.co/guide/en/logstash/current/use-ingest-pipelines.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427238/cf9b91e6-9ba3-0a8a-3123-7fa236aac237.png)

## 構成2:パースをLogstashで行う

パースはLogstashのFilterで行う構成です。
IngestPipelineではできない処理（フィールドの削除等）が可能になります。

ただしModuleの定義はCollect部分（どのパスのファイルを収集するか等）しか使わないため、Filterは自分で定義する必要があります。

https://www.elastic.co/guide/en/logstash/current/logstash-config-for-filebeat-modules.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427238/a59bfa0a-1216-dce1-719c-3754d2db304e.png)
金融工学と最適化

```{r}

#金融工学と最適化　p.41

library(dplyr)

R_bar=c(14,8,20);sigma=c(6,3,15)

p=matrix(c(1,0.5,0.2,0.5,1,0.4,0.2,0.4,1),ncol=3)

R_f=5

cov=t(t(sigma))%*%t(sigma)*p

Z=solve(cov)%*%c(R_bar-R_f)

X=Z/sum(Z)

R_p=t(X)%*%t(t(R_bar))

sigma_p=(t(X)%*%cov)%*%X

C=solve(cov)

C0=C%*%R_bar

C1=-C%*%rep(R_f,length(R_bar))



```

```{r}


#p.68


R_bar=c(14,8,20);sigma=c(6,3,15)

p=matrix(c(1,0.5,0.2,0.5,1,0.4,0.2,0.4,1),ncol=3)

cov=t(t(sigma))%*%t(sigma)*p;C=solve(cov)

D1=C%*%rep(1,nrow(C));D2=C%*%R_bar;r_E=10

a11=sum(D1);a12=sum(D2);a22=sum(D2*R_bar)

mat=matrix(c(a11,a12,a12,a22),ncol=2)

lambda=solve(mat/2,c(1,r_E))

X=(lambda[1]/2)*C%*%rep(1,nrow(C))+(lambda[2]/2)*C%*%R_bar


```

```{r}

#p.79

R_it=c(10,3,15,9,3);R_mt=c(4,2,8,6,0)

beta=sum((R_it-mean(R_it))*(R_mt-mean(R_mt)))/sum((R_mt-mean(R_mt))^2)

alpha=mean(R_it)-beta*mean(R_mt)

sigma_ei=sum((R_it-alpha-beta*R_mt)^2)/length(R_it)

R2=cor(R_it,R_mt)^2

```

```{r}

#数理計画入門　p.26

B=t(matrix(c(3,2,1,2),ncol=2));N=t(matrix(c(2,1,2,0),ncol=2))

b=c(12,8);c=c(-1,-1)

x_b=solve(B)%*%b

B%*%x_b




```

```{r}



#p.51　内点法

C=-sample(1:60,18,replace=T)

A=matrix(sample(1:60,prod(length(C)^2),replace=T),ncol=length(C))

B=sample(1:60,length(C),replace=T)

s=rep(100,length(C));w=rep(100,length(C));x=rep(100,length(C))


ite=10000;

alpha=0.0001

for(j in 1:ite){
  
mu=sum(x*s)/(length(C)^2)  
  
if(mu>10^(-5)){  
  
x_pre=x;w_pre=w;s_pre=s;  
  
s_mat=diag(s);x_mat=diag(x);e=rep(1,length(C)) 
  
p=rep(mu,length(C))-(x_mat%*%s_mat%*%e)

q=B-c(A%*%x);

r=C-c(t(A)%*%w)-s

delta_w=solve(A%*%solve(s_mat)%*%x_mat%*%t(A),q-A%*%solve(s_mat)%*%(p-x_mat%*%r))

delta_s=r-t(A)%*%delta_w

delta_x=solve(s_mat)%*%(p-x_mat%*%delta_s) 

if(sum(x+alpha*c(delta_x)>0)==length(x) & sum(s+alpha*c(delta_s)>0)==length(s)){

x=x+alpha*c(delta_x);w=w+alpha*c(delta_w);s=s+alpha*c(delta_s)
 
print(sum(abs(x-x_pre)+abs(w-w_pre)+abs(s-s_pre)))

}else{
  
print("stop")  
  
}

}else{
  
print("stop")  

  
}


}

```
vagrant で Internet Explorer の検証環境を構築する 2019年版（Microsoft Edge Developer）

## 参考記事

ほぼ以下の内容と一緒です

[Mac × VagrantでWindows7 × IE11の環境をつくる！](https://qiita.com/ushi_d/items/508e7dcf01ed7bd8e85a)

## 手順

### vagrant, VirtualBox をインストール

```bash
$ brew cask install vagrant
$ brew cask install virtualbox

# virtualbox のインストールに失敗する場合は不要なリポジトリを untap する
#   ref: https://github.com/Homebrew/homebrew-cask/issues/66037
#
#$ brew untap caskroom/cask caskroom/versions
```

### 対象の box イメージをダウンロード、unzip

以下の例では Win7 IE11 をダウンロードしています。

```bash
# Vagrant - Win7 IE11
$ curl -OL https://az792536.vo.msecnd.net/vms/VMBuild_20190311/Vagrant/MSEdge/MSEdge.Win10.Vagrant.zip
$ unzip IE11.Win7.Vagrant.zip
```

直リンクで取れなかったら以下から vagrant → 任意の OS、ブラウザを選んでダウンロードする

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

### 作業ディレクトリ作成、VagrantFile を準備

```bash
$ mkdir win7_ie11; cd $_
$ vagrant init
$ cat > Vagrantfile
```

以下の内容をコピーペーストして Ctrl + D

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # vagrant box addで追加したbox名を指定
  config.vm.box = "win7_ie11"

  # GUIの使用とメモリの設定
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "2048"
  end

  # ゲストOSを指定
  config.vm.guest = "windows"

  # SSHの設定
  config.ssh.username = "IEUser"
  config.ssh.password = "Passw0rd!"
  config.ssh.insert_key = false
  config.ssh.shell = 'sh -l'
end
```

ssh のID/パスワードが変わっていたら [View installation instructions](https://az792536.vo.msecnd.net/vms/release_notes_license_terms_8_1_15.pdf) で確認して正しいものを入力する

### 起動

```bash
$ vagrant up
```

## 補足

- 共有フォルダはデフォルトで `host:<作業ディレクトリ>` → `guest:C:\vagrant\` に設定される。<br>変更したい場合は `config.vm.synced_folder` を設定する
LookMLで型変換した場合はtypeも変換しよう


LookML内のSQL記述で型変換した場合、typeも合わせて変換しないとエラーになるという話。

**利用DB:bigquery(Legacy SQL)**

## CASE文で型変換をする
LookMLでCASE式を使って型変換を行い、LookMLを保存する。
![スクリーンショット 2019-10-17 16.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/2f52ad4b-2727-7323-f14a-738e203b1059.png)

フィルタに変換後の値を指定すると、以下のようなエラーが発生する。
![スクリーンショット 2019-10-17 16.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7498f3d7-08fa-ac14-b7eb-e5621e426ad6.png)


## 対策方法
LookMLでCASE式を使って**型変換を行う場合は、typeも同時に変更**する。
![スクリーンショット 2019-10-17 16.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/3834bc7e-e6fe-17a2-84f9-4bd7295ee587.png)

上記対策後は、エラーが発生しなくなる。
![スクリーンショット 2019-10-17 16.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/77ef0ade-a610-c867-d49b-80aa5213459f.png)

## まとめ
・LookML内にSQLを指定することで、様々な加工が行えるが、その際、必ず**データの型も意識した修正対応が必要**です。
※試してはないのですが、Mysqlなどであれば型の違いをDBが吸収してくれる場合もありますので、別のDB使ってる場合は上記現象発生しないのかもしれません。（試された方がいたら共有頂けると嬉しいです。）
覚えておいたほうがよさげなgitコマンド一覧

とりあえず随時追加、編集

##01. ディレクトリ以下でどんなファイルが変更されたか確認
- **git log --stat**  
どんなファイルが変更されたのか確認できる

```
$ git log --stat
commit 27ac00e743ff129a6f5af5aaa298c3e1baab56c1 (HEAD -> master, origin/master)
Author: K <a@com>
Date:   Thu Oct 17 16:31:57 2019 +0900

    tmp

 com/a.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 8e137cd24e473640845c0ca390ee33fe917d9808
Merge: 8cdde46 ff2ce10
Author: K <a@com>
Date:   Thu Oct 17 16:28:11 2019 +0900

    Merge branch 'master' of ssh://a.com:/home/git
    not sure

commit 8cdde463a12a2aef0625f8d998e395d6df1d3363
Author: K <a@com>
Date:   Thu Oct 17 16:16:07 2019 +0900

    add a.txt

 dev | 1 +
 1 file changed, 1 insertion(+)
```

##02. 現在のブランチの確認
- **git branch**  
いまどこのbranchにいるのかは`*`がついているかどうか。  
例はmasterしかないがbranchがあればどんなbranchがあるのかもわかる。

```
$ git branch
* master
```

##03. ファイル名だけを抽出し、変更ステータスを確認
- **git diff --name-status remote/branch**  
ファイル名だけで、コミットによって変更(M)、削除(D)、追加(A)されたのかわかる

```
$ git diff --name-status origin/master
M       test
```

##04. 特定ユーザーを指定しコミットログを確認する
- **git log --author=XXXX** もしくは **--committer=XXXX**  
XXXXというユーザー名のコミット履歴のみ表示する。

```
$ git log --author=XXXX
^[[33mcommit xxxxxf3dc9931ca8f4941e286afb139c4bc16682^[[m
Author: XXXX <XXXX@jp.com>
Date:   Tue Dec 17 17:28:12 2019 +0900
```

##05. 特定ファイル名を指定しコミットログを確認する
- **git log --ファイル名**  
指定したファイルのみ、履歴を表示する。

```
$ git log --XXXX
^[[33mcommit xxxxxf3dc9931ca8f4941e286afb139c4bc16682^[[m
Author: XXXX <XXXX@jp.com>
Date:   Tue Dec 17 17:28:12 2019 +0900
    Commit Message 02

^[[33mcommit yyyyyf3dc9931ca8f4941e286afb139c4bc16682^[[m
Author: XXXX <XXXX@jp.com>
Date:   Tue Dec 17 17:20:12 2019 +0900
    Commit Message 01
```

##06. 特定のコミットメッセージを検索してgit logを表示

```
$ git log --grep=検索文字列
```

##07. 空白、改行コード、空行を無視して特定ファイルのdiffを表示
- **git diff -w --ignore-blank-lines ファイル名**  
diffが少し見やすくなる。

```
$ git diff -w --ignore-blank-lines XXXX.java
 ```

##08. 直前のcommitメッセージを変更

```
$ git commit --amend -m "fooを修正"
```

##09. 直前ではないcommitメッセージを変更
例: 例えば2個前のメッセージを変更したい  

```
$ git rebase -i HEAD~2
```
viエディタが起動するので、最上部にターゲットのcommit詳細があり、左に`pick`という単語があると思われる  
変更したいcommitに対して`edit`に書き換える  
`wq`でviエディタ終了  

```
$ git commit --amend -m "new commit message"
// 次の変更をしたい、もしくはrebaseを終了したいとき
$ git rebase --continue
```

**No.8/9は共にremoteにpush済みの場合は**

```
$ git push --force branch_name
```
を行う。

##10. git resetを取り消す方法
`xxxxxx`や`yyyyyy`はhash値

```
$ git reflog
xxxxxx HEAD@{0} abcdefgh....
yyyyyy HEAD@{1} abcdefgh....

$ git reset --hard yyyyyy 
```

##11. git resetした内容をリモートブランチにも反映する

```
$ git reset --hard HEAD^
$ git push -f origin HEAD^:branch_name
```

##12. Branch名を変更したい
そもそもローカルのbranch名も間違っててリモートにpushしてしまってあほすぎ、、となった際

- 一旦間違えたbranchに移動  

```
$ git checkout wrongBranchName
// ローカルのbranch名変更
$ git branch -m newBranchName
// リモートの間違えた名前のbranchを削除
$ git push origin :wrongBranchName
$ git push origin newBranchName
```

##13. git mergeをやめたい
コンフリクトしたしいろんな事情でconflictをfixするモードから抜けだしたいとき

```
git merge --abort
```
Rspecの設定はrails_helper.rbにだけ書けばよい

今までRspecを使うときは、漫然と先人のコードをコピペして、設定をrails_helper.rbに書いたりspec_helper.rbに書いたりしていましたが、「**rails_helper.rbにだけ書けばよい**」という結論に至りました。

次のStack Overflowの回答を参照。spec_helper.rbは、Railsを読み込まずにRspecだけで何かしらRubyのコードをテストするのに使うらしい。

[ruby on rails - How is spec/rails_helper.rb different from spec/spec_helper.rb? Do I need it? - Stack Overflow](https://stackoverflow.com/questions/24145329/how-is-spec-rails-helper-rb-different-from-spec-spec-helper-rb-do-i-need-it)

Rspecが生成するrails_helper.rbのテンプレートの先頭は次のようになってます。まず、spec_helper.rbを読み込み、その後でRails（`config/environment`）を読み込みます。

```ruby
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
```

テストスクリプトの先頭でrails_helper.rbを読み込めば、RailsとRspecが使えます。

```ruby
require 'rails_helper'
```

代わりにspec_helper.rbを読み込めば、RailsなしでRspecが使えます。

```ruby
require 'spec_helper'
```

といっても、普通のRailsアプリケーションで、Railsを使わずにテストをする、というケースは考えにくい。なら、rails_helper.rbにだけ設定をまとめたほうが分かりやすくていいんじゃないでしょうか（spec_helper.rbのほうは自動生成されたものを放置すればいい）。

今いじっているプロジェクトのrails_helper.rbは次のような感じにしました（長いコメントは除く）。

```ruby:rails_helper.rb
# simplecovは最初に
require 'simplecov'
SimpleCov.start 'rails'

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'

# spec/supportの下読み込み
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

# Capybara設定
Capybara.server = :puma, { Silent: true }

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

RSpec.configure do |config|
  # FactoryBotのメソッド使う
  config.include FactoryBot::Syntax::Methods

  # DBきれいにする
  config.before :suite do
    DatabaseRewinder.clean_all
  end

  # system specでheadless chrome使う
  config.before(:each) do |example|
    if example.metadata[:type] == :system
      driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
    end
  end

  # config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!

  config.filter_rails_from_backtrace!
end
```
PySparkで文字列をsplitする際にjava.util.regex.PatternSyntaxExceptionが出る

# 起きたこと
下記のようなことをしたところ、

```python
from pyspark.sql import functions as F

split_col = F.split(df["hoge"], "?")
```

下記のようなエラーが起きた

> java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0

# 対処

どうやら`?`が正規表現の記号と捉えられてしまっているようです。

回避するには`?`を`\\?`とすれば良いそう。

```python
split_col = F.split(df["hoge"], "\\?")
```

# 参考

下記のページを参考にしました。ありがとうございます。

[エラー『Dangling meta character '?'』の回避方法](https://qiita.com/nbkn/items/04dc017e119d947285fe)
DBeaverでSSHトンネルしようとすると[invalid private key]になるときの対処法

# 現象

SQLクライアントにTable Plusを使っていたんですが、無償版はタブが２つまでしか開けないのがいい加減不便になってきたので、よく話に聞くDBeaverを使ってみようと思いました。
RDSの本番環境にはSSHトンネル経由で接続するので、いつもの通り、Hostや秘密鍵を設定して接続しようとしましたが、タイトルの`invalid private key`エラーが出て接続できませんでした。

# 原因

どうやらDBeaverはOPENSSH形式の秘密鍵に対応していないようです。
Sequel ProやTable Plusでは対応しているので、最初に困惑するかも知れません。

RSAには対応しているようなので、変換すればOKです。

# 対処

以下のコマンドで、サポートされている形式にキーを変換できます。

```terminal
$ ssh-keygen -p -m PEM -f key_name

-p: 対話形式でパスフレーズを更新する
-m {形式}: 変換形式を選択。PEMなど選べる。
-f: ファイルの指定
```

上書きされるので、実行前に`cp`でバックアップしておくことをおすすめします。
Linux コマンド テキストエディタ Vim

#はじめに
基本的なLinuxの使い方からテキストエディタの基本まで。
こちらは新しいLinuxの教科書で学んだ内容になります。
##Linuxコマンド
###pwd(カレントディレクトリを表示する)

```
$ pwd
```
###cd(カレントディレクトリを移動する)

```
$ cd 移動したいパスやディレクトリ名
```
###ルートディレクトリに移動

```
$ cd /
```
###ls(ディレクトリ内のふぁいる)

```
$ ls
```
###ls -a(隠しファイルの表示オプション)

```
$ ls -a
```
###Tabキー
パス名やディレクトリ名が補完され自動入力される便利な機能です。

```
例えばこのような状態でTabキーを押すと予測でディレクトリを表示してくれる
$ cd u
```
###mkdir(ディレクトリを作成する)

```
$ mkdir ディレクトリ名
```
###mkdir -p(深い階層のディレクトリ作成オプション)

```
階層3までのディレクトリを一気に作成する
$ mkdir -p kaisou1/kaisou2/kaisou3
```
###touch(新規ファイル作成)

```
$ touch
``` 

```
一回のコマンドで複数ファイルを作成することも可能
$ touch file file1 file2
```
###rm(ファイル削除コマンド)

```
$ rm
```
###rmdir(ディレクトリ削除)

```
$ rmdir
```
###rm -r(ディレクトリ内のファイルごと削除するオプション)

```
$ rm -r
```
###cat(ファイルの中を表示する)

```
$ cat
```
###less(ファイルをスクロール表示する)

```
$ less
操作を終了する場合には q キーで抜けることが可能
```

```
lessで表示したファイル内で指定文字検索をする場合
/
```
###cp(ファイルをコピーする)

```
$ cp
```
###mv(ファイル名の変更及び移動)

```
ファイル名を変更する場合 例：file1をfile2に変更する
$ mv file1 file2
```
###find(ファイルを検索する)

```
$ find
```
[ファイルなどを検索する！findコマンドの詳細まとめ](https://eng-entrance.com/linux-command-find)
###catのマニュアルを表示する(man cat)

```
$ man cat
```
##テキストエディタ
###テキストファイルとバイナリファイル
テキストファイルとは、htmlなどの文字列で書かれたファイルのことです。一方バイナリファイルとは画像ファイルや音声ファイルのことです。仮に表示しても何が書かれているか理解することはできません。
###Vim(デフォルトのテキストエディタ)

```
vimがインストールされているか確認する
$ vim --version
```
何も表示されなければインストールする必要があります。
###vimを使ってファイルを編集する

```
$ vim ファイル名
viでも同じ操作になります
```
###Vimを抜ける様々な方法

|  コマンド  |  内容  |
| ---- | ---- |
|  :w  |  変更内容を保存  |
|  :q  |  Vimを終了する  |
|  :q!  |  変更内容を保存せずに終了する  |
|  :wq  |  変更内容を保存して終了する(使用頻度は高め)  |
###Vimの基本的なコマンド

|  コマンド  |  内容  |
| ---- | ---- |
|  x  |  カーソル位置の文字を削除する  |
|  i  |  カーソル位置の左に文字を追加する  |
|  a  |  カーソル位置の右に文字を追加する  |
###Vimの便利なコマンド

|  コマンド  |  内容  |
| ---- | ---- |
|  w  |  前方に単語一つぶん移動する  |
|  b  |  後方に単語一つぶん移動する  |
###Vimのチュートリアルの起動方法

```
$ vimtutor
```
AWS Cloud9 まとめ

### 使用する上での利点（メリット）
- ブラウザのみでコード記述
- リアルタイムに共同でコーディング
-- 共同作業中にチームメンバーは互いのタイピングをリアルタイムで確認でき、IDE 内から即座にチャットを開始することが可能
- 環境構築不要で始めることができる
- 利用環境を選ばない
- 作って壊せる（環境の破棄や再構築がワンクリックで可能）
- インストール不要
- 豊富な機能を備えている（GitHubやBitbucket、Herokuなど、大手ツールとの連携が可能）
- AWS のサービスに直接ターミナルアクセス
-- Amazon EC2 インスタンスに対する sudo 権限を含むターミナルが付属しており、すばやくコマンドを実行して AWS のサービスに直接アクセスすることが簡単。
- サーバーレスアプリケーションを簡単に構築
-- AWS Lambda 関数をローカルでテストおよびデバッグするための環境を利用可能。これにより、コードを直接反復処理して時間を節約し、コードの品質を向上させる。
- 追加料金はかからない


### 使用できる主な言語40
- Node.js
- Python
- PHP
- Ruby
- Go
- C++
[その他のサポート言語](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/language-support.html)

### 使用できるブラウザ
常に最新バージョンで完全サポート。
- Google Chrome
- Safari
- Firefox
- Microsoft Edge

### アプリケーション実行の際
ユーザーは使用できるポートは、8080, 8081, 8082となる。
>IDE 内でプレビューするアプリケーションは AWS Cloud9 開発環境 ですでに実行している必要があります。IP として 127.0.0.1、localhost、または 0.0.0.0 を使用し、ポートとして 8080、8081、または 8082 を経由して HTTP を使用します。

[AWS Cloud9 Integrated Development Environment (IDE) で実行中のアプリケーションをプレビューする](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html)

### 考えられるデメリット
- 環境構築のノウハウを知らないままなってしまう恐れあり
- スペックが低い、PCによっては動作が重い
- インターネットに接続してないと使えない

参考リンク：
[AWS Cloud9（Cloud IDE でコードを記述、実行、デバッグ）\| AWS](https://aws.amazon.com/jp/cloud9/?sc_ichannel=ha&sc_icampaign=acq_cloud9_general_jp&sc_iplace=ed&sc_icontent=acq_cloud9_general_jp)

[クラウドIDEを使うメリットとデメリット - Qiita](https://qiita.com/tsuemura/items/7540211aa73f22e3cbe1)

[クラウドIDE「Cloud9」とは？特徴や基本的な使い方](https://kumaweb-d.com/service/cloud9-ide/)
CSSのtouch-actionプロパティでハマった話

CSSのtouch-actionプロパティを設定しているサイトでjQueryプラグインを使ったときにハマった話です。

## touch-actionプロパティとは

タッチデバイスにおいてユーザーの操作を制御できるプロパティです。
詳しい内容についてはこちらを参照してください。

* [touch-action - 開発者向けのウェブ技術](https://developer.mozilla.org/ja/docs/Web/CSS/touch-action)

## ハマったときの状況

タッチデバイスへの対応として、CSSで以下のようにtouch-actionプロパティを設定していました。

```css
body {
  -ms-touch-action: manipulation;
      touch-action: manipulation;
}
```

その上で、[Swipebox](https://brutaldesign.github.io/swipebox/)を設置しました。
スマートフォンで表示を確認すると・・・

![Screenshot_2019-10-17-15-58-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/14ac5dc8-cf1f-1a66-a955-a0653b6e68a0.png)

画像が拡大表示されたとき、フォーカスが外れず画面全体が青くなってしまいました。
ちなみにSwipebox以外のlightbox系プラグインをいくつか試しましたが同じでした。

## 解決策

body全体にtouch-actionプロパティを設定していたのが原因のようで、以下のように要素を限定すると問題なく動作します。

```css
a,area,button,[role="button"],input:not([type=range]),
label,select,summary,textarea {
  -ms-touch-action: manipulation;
      touch-action: manipulation;
}
```

## 参考になったサイト・ブログなど

* [touch-action - 開発者向けのウェブ技術](https://developer.mozilla.org/ja/docs/Web/CSS/touch-action)
* [2018年おすすめのCSSリセット！「Reboot.css」の特徴と使い方を解説](https://coliss.com/articles/build-websites/operation/css/new-reset-rebootcss.html)
* [北海道美唄市の飛行場で野外映画と日本遺産の観光フリー素材 - ぱくたそ](https://www.pakutaso.com/bibai.html)
写真はこちらからお借りしました。
Gulpで.sassファイルを保存したときにlintが検知してくれるようにする

## 注意事項

[こちら](https://github.com/sasstools/sass-lint)を見ればわかる通り、sass-lintは2017年10月から、メンテされていません。

今現在使っても一応動きはしましたが、可能ならSCSS構文にしてstylelintでlintをかけたほうが良いと思います。

## 使うライブラリ

- [gulp-sass-lint - npm](https://www.npmjs.com/package/gulp-sass-lint)

```
yarn add gulp-sass-lint --dev
```

## タスク

### lintタスクをつくる(一部抽出)

```javascript
const paths = {
  sass: {
    watch: [
      `${developSrcRoot}/sass/**/*.sass`,
      `${developSrcRoot}/components/**/*.sass`
    ]
  }
}


gulp.task('lint-sass', () => {
  return gulp.src(paths.sass.watch)
    .pipe(sassLint())
    .pipe(sassLint.format())
})

gulp.task('lint', gulp.parallel('lint-sass'))
```

## watchタスクでsassコンパイルと並列実行する

```javascript
  gulp.watch(paths.sass.watch, gulp.parallel('sass', 'lint-sass'))
```

こんな感じ、sassタスクは普通にコンパイルしてgulp.destしてます。

watchの第二引数にtaskでなくpararellで複数タスクを指定するだけなので簡単でした。

## sass-lint.ymlを書く

ドキュメントルート直下に `.sass-lint.yml` を置く

[sample](https://github.com/sasstools/sass-lint/blob/develop/docs/sass-lint.yml)

ルール一覧は[こちら](https://github.com/sasstools/sass-lint/tree/develop/docs/rules)

0が無視、1が警告、2がエラーのはず。

## Vscode拡張機能

- [sass-lint](https://marketplace.visualstudio.com/items?itemName=glen-84.sass-lint)

入れるとターミナルとかが表示されているところの[PROBLEMS(問題)]タブでlintが検知してくれる。

## lint事項の自動修正について

sass-lint自体には自動修正機能はない。（Issueを見る限り、featureブランチにはあるようだ)

[sass-lint-auto-fix](https://www.npmjs.com/package/sass-lint-auto-fix)というものがあり、使ってみたりもしたがsassファイルがぶっ壊れるだけで終わったので終了

なお、sass-lint-auto-fixは最新版ではなぜかnode_modules配下にdistフォルダが含まれておらず、0.17.0を指定でインストールしたら動くところまではいきました(ファイルは壊れたが)


## 最後に

scssのほうが良いと思います。
matplotlibで色をグラデーションにする

# 等間隔のグラデーションを作る

```python
import matplotlib.pyplot as plt

# test data
x=[2,3,5,7,11,13,17]
y=[0,0,1,1,2,2,3]

# グラデーションを作る
cm=plt.get_cmap('Blues')  # 他にも'jet'など
cm_interval=[ i / (len(x) - 1) for i in range(len(x)) ]
cm=cm(cm_interval)

# plot
ax=plt.figure(figsize=(3, 3)).add_subplot(111)
ax.scatter(x=x, y=y, c=cm)
plt.savefig('prime_num.pdf')
```

#### for構文を使うとき: 色は2D-arrayで指定

```python
import matplotlib.pyplot as plt

# test data
x=[2,3,5,7,11,13,17]
y=[0,0,1,1,2,2,3]

# グラデーションを作る
cm=plt.get_cmap('Blues')
cm_interval=[ i / (len(x) - 1) for i in range(len(x)) ]
cm=cm(cm_interval)

# plot
ax=plt.figure(figsize=(3, 3)).add_subplot(111)
for x_val, y_val, col in zip(x, y, cm):
    ax.scatter(x=x_val, y=y_val, c=[col]) # 色は2D-arrayで指定
plt.savefig('prime_num.pdf')
```

![prime_num.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/b67dcf5b-c702-1f3c-a2fd-3dacc19c859c.jpeg)


# 数値に応じたグラデーションを作る

```python
import matplotlib.pyplot as plt

# test data
x=[2,3,5,7,11,13,17]
y=[0,0,1,1,2,2,3]

# plot
ax=plt.figure(figsize=(3, 3)).add_subplot(111)
ax.scatter(x=x, y=y, c=y, cmap='Blues')  # ここで指定
plt.savefig('prime_num.pdf')
```

![prime_num.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/8e2daae2-7e77-b2c8-44d1-39c84b5a420b.jpeg)

# 注意点
'Blues'などの白色を含むcmapを使用すると、始めの値が白になるので、見えなくなる。'jet'を用いると問題はない。データの可視化の際には注意。

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/50d29559-9026-0cb2-ff90-6ec2684d0a76.jpeg)

↓ 'Blues'を用いるときの白色回避方法: 

```python
import matplotlib.pyplot as plt

# test data
x=[2,3,5,7,11,13,17]
y=[0,0,1,1,2,2,3]

# グラデーションを作る
cm=plt.get_cmap('Blues') 
cm_interval=[ i / (len(x)) for i in range(1, len(x)+1) ]  ## ここを変える !!!!!!
cm=cm(cm_interval)

# plot
ax=plt.figure(figsize=(3, 3)).add_subplot(111)
ax.scatter(x=x, y=y, c=cm)
plt.savefig('prime_num.pdf')
```

![prime_num_blues.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/558b1c2e-630b-2304-9490-5aa2a1586782.jpeg)

# 環境
Ubuntu 18.04
Python 3.7.3
matplotlib 3.1.0
sslscanって何すか

#はじめに
TLS1.0と1.1を無効にすべく設定をポチポチ確認していたのですが、ツール使ったほうがいいよ！と先輩に勧められたので試しに動かしてみました。
本当はもう少し理解が進んでから記事化しようかなと思ったのですが、よくわからなさすぎたのでもうupしますw

こちらのブログ記事を参考にさせていただきました。ありがとうございますの一言！
https://ozuma.hatenablog.jp/entry/20150320/1426841511

#作業環境
mac
クラウドに構築したオンプレのサービス

#作業開始
##読んで作業手順を作成
リンクでご紹介したブログ記事を読む。
１周目→理解度10%くらい
２周目→あんま変わらん

ので、とりあえず動かしたいw

ブログでもリポジトリのREADMEでも書いてあるとおり、以下でstaticなライブラリを使ってビルドできるようです。

```
$ make static
```

リポジトリはこちら！
https://github.com/rbsec/sslscan/

で、ビルド後のスキャン実行は

```
$ sslscan ”スキャン対象サーバのIP”
```

らしいので、ローカルに落としてそこから実行できるんじゃね？と勝手に推測。
よってもうとりあえずえいやでやる判断をここでします。
※最初各サーバに落としてlocalhostとか指定して実行するもんかと思ってました

##ローカルにビルド

ホームディレクトリに適当なフォルダを作成し、git clone→make staticまでガッと実行。
ほげえええええ！ビルドなげええええ！て感じでしたが目立ったエラーなく完了。
これステージングとかで試してたら冷や汗出てたと思います。実際ビルド中はmacちゃんのファン全開やったし。

##スキャン実行
ステージングのサーバ（社内のグローバルのみ許可）で実行してみました。
つらつらとログは出る、色も分かれてて良い感じ！ただログの見方がわからんw

というわけで、サービスのUIでTLSを制御できるサーバでテストしてみました。
TLS1.0〜1.2が有効化されているサーバだと以下のような出力になります。
※かなり省略してます

```
$ ./sslscan ”サーバのIP”
  Supported Server Cipher(s):
Accepted  TLSv1.2
Accepted  TLSv1.1
Accepted  TLSv1.0
```

サービスのUIからTLS1.0,1.1を無効化して。。
もう一度実行。

```
$ ./sslscan ”IP”
  Supported Server Cipher(s):
Accepted  TLSv1.2
```

おお！てことは設定変更した後にsslscanしてこの箇所を見れば良さそうですね。

#おわりに
確認手順はこれでよさげなので、次はTLSを有効/無効にする手順の調査。
sslscanの使い方が間違っている可能性もなくはないのでw、また追記しますね。

本記事がどなたかのお役にたちますように:)
php artisan migrate でずっこけたとき

php artisan migrate しようとするとエラーとなる。


```
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

  at /home/kusanagi/yoyaku/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
    661|         // If an exception occurs when attempting to run a query, we'll format the error
    662|         // message to include the bindings with SQL, which will make this exception a
    663|         // lot more helpful to the developer instead of just the database's errors.
    664|         catch (Exception $e) {
  > 665|             throw new QueryException(
    666|                 $query, $this->prepareBindings($bindings), $e
    667|             );
    668|         }
    669|

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes")
      /home/kusanagi/yoyaku/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:459

  2   PDOStatement::execute()
      /home/kusanagi/yoyaku/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:459

  Please use the argument -v to see more details.
```

対策として色々あるけど私は下記を行う
\laravel\app\Providers\AppServiceProvider.php
下記2行を追記する


```
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;  <----追記

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);  <----追記
    }
}

```

あと忘れずに、migratした時のDBテーブルを削除する。
そして再度

```
$ php artisan migrate
```
javascriptでWeb神経衰弱を作ったー。

初めて投稿します。中野と申します。

僕は、現在絶賛javascriptを勉強中です...

今日は最近作った神経衰弱について話そうかと思います。

##web神経衰弱？

神経衰弱は皆さんご存知のとおりトランプのゲームです。

けど、今回作ったのは「トランプの神経衰弱」ではありません。

「勉強できる神経衰弱」です。

###「勉強できる？」

そうです。勉強できるんです。

[web神経衰弱のリンク](https://nakano1120.github.io/dokaben/sinkei.html)

ステージを選択して、ボタンを押すと分かると思いますが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515312/765d7ebc-e07b-82ed-8d8f-02c934af387f.png)

なんも文字が出てこないと思います。

そこで、マスをクリックすると、文字が出てきます。

その文字を神経衰弱の要領で、年号や、訳を出せば正解となります。

##コードの一部

```js
const jc1={"是":1,"〜である":1}///配列は長いので省略
function kaishi(player){        
        let num2 = document.getElementById("classes").selectedIndex;///ステージ取得
        let num = document.getElementById("level").selectedIndex;///レベル取得
        now=num2*10+num-10///ステージが10の位、レベルが1の位。
        if(num==0 || num2==0){///0の場合戻らせる
            alert('ステージが不正です')
            return
        }
        reset()
        if(now==1){
            odaidic=jc1///使用する連想配列を取得
            odailist=Object.keys(jc1)///キーだけ取得してシャッフルに使う
        }
```

コードですが、連想配列を使用しています。

`const jc1={"是":1,"〜である":1}`

この後に、

`if(問題の連想配列[問題のリスト[2枚目に引いたマス]]==問題の連想配列[問題のリスト[最初に引いたマス]])`

とすることで、同じvalueを持ったkeyが正解という判定が出ます。
コードはこんな感じです。

##今後の展望
- UIの向上
- デザイン性
- 問題数の増量
etc...
Androidエミュレータでキーボード入力が正常にできなくなった

原因を調べてみたもののそれらしいものは見つからずわからないままですが、僕がしたことを書いておきます。スクリーンショットをとっていなかったので画面を共有できず申し訳ありません。

# 問題
FlutterでAndroidアプリを作成していた時に、仮想・物理キーボードからの入力が正常に受け取られなくなりました。

# 症状
英語/日本語で入力しても、英語のアルファベットまたはひらがなではない文字が表示されるようになりました。常時特殊文字が入力されるようになってしまっていたのでしょうか。僕がなにかしらのショートカットを押してしまった可能性も疑いましたが、答えが見つかりませんでした。

# 対処方法
Stack Overflowで(おそらく)同じ症状が出た方が質問をしていて、「shift+alt+oを試してみろ」とのことでしたがそれでも解決できず、問題が発生しているエミュレータをAVD Managerから一度削除し、再度作成したところ正常に動くようになりました。


# 参考
- [[Stack Overflow] Physical keyboard inputs wrong characters on Android Emulator](https://stackoverflow.com/questions/51527677/physical-keyboard-inputs-wrong-characters-on-android-emulator)
【Python+SendGrid】ZIPファイルを添付

# はじめに

Python+SendGridで送信するメールに、zipファイルを添付したくて実装してみました。


# 環境

* Python 3.6.5
* SendGrid api v3


# コード

### import部分

```python
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from sendgrid.helpers.mail import Attachment
```

### 送信部分

一部抜粋

```python
    # create mail object
    with pathlib.Path(Utils.getAbsolutePath("./mail_body.txt")).open(mode="r", encoding="UTF-8") as f:
        mail = Mail(from_email=mail_from, to_emails=mail_to,
                    subject=subject, plain_text_content=f.read())
    # attachment zip file
    with pathlib.Path(Utils.getAbsolutePath("./" + zip_name)).open(mode="rb") as zf:
        encoded = base64.b64encode(zf.read()).decode("UTF-8")
        attachment = Attachment(
            file_content=encoded, file_name=zip_name, file_type="application/zip")
        mail.add_attachment(attachment)
    # send mail start
    sg = SendGridAPIClient(api_key=self.__mail_config.apikey)
    response = sg.send(mail)
```

以上
[Swift5] 画像の色を変更する

# やりたいこと
![changeColor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/ad871441-29f8-f7e3-eeae-e682922bcfbd.png)
この黒い電球を...
<img width="55" alt="スクリーンショット 2019-10-17 14.56.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/d48176bc-61fd-0a2c-74d3-a9f737967c68.png"> <img width="49" alt="スクリーンショット 2019-10-17 14.55.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/3182a42b-b727-de9d-4bf9-57474d5ad972.png">

こんな感じに色を変えたい！！


## やり方
### コードなし
1.Assets.xcassetsを開き、画像を選択する
![スクリーンショット 2021-05-27 14.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/c390dae4-37e3-0c94-6205-5c5e8ecd283e.png)


2.attribute inspectorのRender Asを[default -> Template Image] に変更する
![スクリーンショット 2021-05-27 14.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/3eaa6dfb-58c8-06fd-e78c-95f479b91009.png)


3.Storyboard上でimageViewのTint Colorを好きな色に変更する
![スクリーンショット 2021-05-27 14.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509577/d3537cea-00ec-b3e1-3e66-99803ca6055c.png)


### コードで実装
```swift
import UIKit

class ViewController: UIViewController {
    
    // imageのRenderingModeをalwaysTemplateに変更
    let image: UIImage = (UIImage(named: "light")!.withRenderingMode(.alwaysTemplate))
    let imageView: UIImageView = UIImageView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        // 画像の大きさと位置を調整
        let screenWidth: CGFloat = view.frame.size.width
        let screenHeight: CGFloat = view.frame.size.height
        let imgWidth: CGFloat = image.size.width
        let imgHeight: CGFloat = image.size.height
        let scale: CGFloat = screenWidth / imgWidth
        let rect: CGRect = CGRect(x: 0, y: 0,
                                  width: imgWidth * scale,
                                  height: imgHeight * scale)
        imageView.frame = rect
        imageView.center = CGPoint(x: screenWidth / 2, y: screenHeight / 2)
        
        // imageViewにimageを代入
        self.imageView.image = self.image
        // imageViewのtintColorを好きな色に変更
        self.imageView.tintColor = .orange
        // imageViewを表示
        self.view.addSubview(self.imageView)
    }
}

```

## 備考
記載内容を2021年仕様に更新しました。

### 参考記事
https://i-app-tec.com/ios/uiimageview.html
ショートカット(iOS)の「ssh経由でスクリプトを実行」を使ってファイル送受信

# 概要
iOSのバージョンが13になり、ショートカットで鍵認証のsshが使えるようになりました。これでようやく安心して外出中に自宅へssh接続出来ます。このページにはsshを経由してファイルをサーバーとやり取りする方法をまとめます。自宅raspberry piに接続されているカメラから写真を受け取るなど夢が広がります。

# 用意するもの
- sshサーバー(linux)
- iOS13が搭載されたデバイス

# ショートカットでsshを使う
「ショートカット」->「スクリプティング」->「ssh経由でスクリプトを実行」を使います。iOS13から項目の「認証」でSSHキーを選択出来るようになっています。ホスト、ポート、ユーザをサーバに合わせて設定して下さい。

# ファイル受信
「ssh経由でスクリプトを実行」はスクリプトの実行結果を出力するため、catコマンドを用いてファイルを受け取る事ができます。次のスクリプトを設定して下さい。

```
cat [ファイルのパス]
```

受け取ったファイルはクイックルックで見る事ができます。

# ファイルの送信
受信と同じ要領でファイルの送信も可能です。ただし、「ssh経由でスクリプトを実行」はファイルを直接入力する事ができないため、ファイルを「Base64エンコード」を通してから渡します。Base64オプションの行区切りは「なし」に設定します。「ssh経由でスクリプトを実行」の「入力」にエンコードした結果を設定し、次のスクリプトを設定して下さい。

```
base64 -d > [ファイルパス]
```

サイズが大きい場合は圧縮してから送ると時間短縮になるかもしれません。.tar.xzでアーカイブを作成し、それをBase64でエンコードします。その場合、スクリプトを次のように変更します。

```
base64 -d | xz -dc | tar -O -xf - > [ファイルのパス]
```

# メモリ制限回避
共有からスクリプトを選択すると使用可能なメモリが制限されます。大きなファイルを扱う際には「"ショートカット"Appで続行」を設定しましょう。

# 利用例
## 自宅のRaspberry piカメラで静止画を撮る
ラズパイカメラモジュールが接続されたRaspberry piにssh接続できる環境を用意して下さい。「ssh経由でスクリプトを実行」のスクリプトを次のように設定して下さい。

```
raspistill -o tmp.jpg
cat tmp.jpg
```

出力された画像は「クイックルック」で表示出来ます。

## PDFをサーバーで圧縮する
ghostscriptを使ってpdfを圧縮します。前述したファイル送信と同じ要領でPDFファイルをBase64でエンコードします。「ssh経由でスクリプトを実行」の入力にBase64でエンコードしたテキストを設定し、スクリプトに次を設定して下さい。

```
input=$(mktemp)
output=$(mktemp)
base64 -d > ${input}
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=${output} ${input} &> /dev/null
cat ${output}
```

出力は「クイックルック」で確認できます。dPDFSETTINGSは好みで変更して下さい。
Re：ゼロから始める機械学習生活（深層学習もあるよ）

#本文概要
現状の予定では「Re：ゼロから始める機械学習生活（深層学習もあるよ）」をシリーズとして行っていきます。
私の狙いとしては、「AIとか機械学習とか深層学習とか言葉は聞いたことあるし、興味あるけど、何から学んでいいかわからない」という方向けの入門書みたいなものを作り上げていけたらなと思っています。
投稿した記事を順番に読むことによって、AIの技術である機械学習等（深層学習を含む）を基礎から学べる上、機械学習や深層学習を行うことのできるライブラリの使い方も学べるようになっているようになっていたらなと思っている。

#目次のようなもの（2021/8/25更新済み）
①[openCVとNumPy環境におけるグレースケール画像生成](https://qiita.com/KengoKudou/items/e3a4d49c5d34ac48cd18)
②[openCVとNumPy環境におけるグレースケール画像を用いた画素値判定](https://qiita.com/KengoKudou/items/d9bd9e44a74896049681)
③[閾値による二値化処理を用いた疑似アスキーアート生成器](https://qiita.com/KengoKudou/items/91e78f22f4656d7c8a18)
④[ライブラリNumpyを用いた正規分布に基づくゴマ塩ノイズ付加処理と除去処理☆彡]
(https://qiita.com/KengoKudou/items/49a25c5bdbdb1a4f6047)
⑤[機械学習を用いたカラーイラスト線画の自動生成](https://qiita.com/KengoKudou/items/b101cef271cc17fddd2d)
がんばるぞい（^ω^）b

#最近の興味
・GANでほげふがしたい(^ω^)b
・midiと画像処理と音響信号処理の総合格闘技をしたい（している）
fibonatch 数列の５０番目を出力するプログラムをC# で書いてみました。

以前会社でチーム内で誰が早くフィボナッチ数列の計算をプログラミングで行えるか
という遊びの中で書いたやつです。
チームメンバーは各々得意な言語を使って行いましたが、私の場合はElixirでの環境を用意できず。C#で書かせていただきました。

ルールは
フィボナッチ数列５０番目の数字を100000回計算させてその後出力させる。

というやつでした。

面白いので皆さんチーム内でやってみてはいかがでしょうか。

# c＃
```c#
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();

            for (int i = 0; i < 100000; i++) {
                fib(50);
            }
            watch.Stop();
            Console.WriteLine("time" + watch.Elapsed);
            Console.WriteLine(fib(50));


            Console.Read();
        }
        static UInt64 fib(int n)
        {
            UInt64 fib01,fib02;
                fib01 = 0;
                fib02 = 1;
            for (int i = 1; i < n; i++)
            {
                UInt64 a = fib01 + fib02;
                fib01 = fib02;
                fib02 = a;
            }
            return fib02;
        }


    }
}

```

# Elixir
Elixir で５０番目を求めるまでやった時のコード
実際に環境を用意できなかったけれども書いては見ました

```elixir

defmodule Memorize do
  def fib 0 do
    0
  end

  def fib 1 do
    1
  end

  def fib x do
    case Agent.get(:fib_memo, &Map.get(&1, x)) do
      nil ->
        v = fib(x - 1) + fib(x - 2)
        Agent.update(:fib_memo, &Map.put(&1, x, v))
        v

      v -> v
    end
  end

  def start_agent do
    Agent.start_link &Map.new/0, name: :fib_memo
  end
end


Memorize.start_agent
IO.inspect Memorize.fib 100000

```

チーム内での結果としてはC++が予想通り速く、案外早かったのはPHP7でした。
厳密にやると色々変わってきそうですがお遊び程度で制限時間を作ってやってみると面白いかもしれません。

ではまた

僕のギスト
https://gist.github.com/ProblemaResolt/716d7a5ed466e72cd80e1edf1cc2e5b9