OmniAICreator/Qiita-1.07M huggingface dataset:
[iOS] 地図（MKMapView）にピンが表示されないときに確認すること


## これはなに

Stack Overflow の [mapkit](https://stackoverflow.com/questions/tagged/mapkit) タグを購読していると、「地図にピンが表示されないよ助けて！」という質問をよく目にします。大抵以下の3パターンが原因なので、確認すべき点をまとめてみます。

## 1. delegate をセットしているか

意外と `MKMapViewDelegate` をセットし忘れているケースが多いです。

まずはデリゲートプロトコルを宣言しているか確認。

```swift
class ViewController: UIViewController, MKMapViewDelegate {
```

つぎに `delegate` プロパティに処理を委譲する対象をセットしているか確認。

```swift
mapView.delegate = self
```

Storyboard でセットする場合。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/b340a643-6a3f-ab06-6ea3-8b7e997f85a6.png)


そして、デリゲートメソッドを実装しているか確認。

```swift
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation {
        return nil
    }

    let reuseId = "pin"
    var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
    }
    else {
        pinView?.annotation = annotation
    }

    return pinView
}
```

これでピンが表示されるはず！

## 2. MKAnnotationView を使っていないか

ピンを表示する場合は `MKAnnotationView` ではなく `MKPinAnnotationView` を使わないと何も表示されません。

ちなみに `MKAnnotationView` はピンに画像を使いたいとき等に使用します。

```swift
pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView?.image = UIImage(named: "Laugh")
```

## 3. 緯度経度が間違っていないか

たまに緯度（latitude）と経度（longitude）が逆になっているケースも見かけます。`CLLocationCoordinate2D` を返す

```
public func CLLocationCoordinate2DMake(_ latitude: CLLocationDegrees, _ longitude: CLLocationDegrees) -> CLLocationCoordinate2D
```

を多用することになりますが、それぞれの引数にセットする値を間違えないように注意しましょう。

例えば

* 緯度: 35.658034
* 経度: 139.701636

の場合は

```swift
let coordinate = CLLocationCoordinate2DMake(35.658034, 139.701636)
```

となります。
Solidity 0.4.22 以上でのコンストラクタの書き方

# Solidity 0.4.21 までのコンストラクタの書き方
* Solidity 0.4.21 までは、コントラクトと同じ名前の関数がコンストラクタでした。
* ただ、この仕様だと、コントラクト名を変更したときに、コンストラクタだけ変更されずに、意図した初期化処理が行われない可能性がありました。
* なお、Solidity における「コントラクト」は、一般的なプログラミング言語の「クラス」と考えて差し支えないと思います。

## 例: Piyo という名前のコントラクトの場合
* コンストラクタはコントラクト名 Piyo と同名の関数となります。

```js
pragma solidity 0.4.21;

contract Piyo {
    string public message;
    
    // コンストラクタ
    function Piyo(string _message) public {
        message = _message;
    }
    
}
```

# Solidity 0.4.22 以上でのコンストラクタの書き方
* `constructor` という宣言キーワードを使用した無名関数を使用します。
* 注意: `function constructor(args) {...}` とはせず、 `constructor (args)  {...}` とします。

## 例: Piyo という名前のコントラクトの場合
* コンストラクタはキーワード `constructor` を使用した無名関数です。

```js
pragma solidity 0.4.22;

contract Piyo {
    string public message;
    
    // コンストラクタ
    constructor (string _message) public {
        message = _message;
    }
    
}
```

# その他の注意点
* Solidity 0.4.22 で導入されたこの仕様は、意図しないバグを防ぐためのものでしたが、Solidity 0.4.22 では 0.4.21 以前の方法でもコンストラクタを書くことができてしまうというバグがあります。
* Solidity 0.4.22 でコンパイルしたコードに、コントラクト名と同名の関数を使用したコンストラクタと、`constructor` キーワードを使用したコンストラクタの両方が存在した場合、どちらか1つのコンストラクタのみが使用されるようです。実験してみたところ、最初に呼ばれたコンストラクタが使用されるようです。
* この問題は Solidity 0.4.23 で修正されているので、特別な理由がない限りは Solidity 0.4.23 以上を使用すべきかと思います。

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Solidity_0.4.22_以上でのコンストラクタの書き方
UNITYの基本

**基礎的過ぎて見る人はそこまでいないと思うのですが、自分が忘れないように、そしてscriptが苦手な人向けにこの記事を書かせてもらいます。**

*まず、scriptについて*



![bandicam 2018-05-14 12-06-21-575.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/d1dbe712-7db8-9652-352b-5ae2a7ebb110.jpeg)


scriptを生成すると、このようなscriptの画面が出てきます。(五行目のtestというのは仮の名前で、scriptにつけた名前がここには入る。)

*まず、usingから*
usingとは、後ろに書かれているものを使って行きますよという**宣言**で、これに加えて何か使うものがあるなら付け足さねばなりません。
(ex.  using UnityEngine.UI;   using UnityEngine.SceneManagement;  など)

*次に、publicの使い方*
【MonoBehaviour｛　】　から　【void　Start】までのあいだにpublicを使ってなにか打つことがあります。
![bandicam 2018-05-14 14-00-59-272.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/839cda64-01db-dcf3-76b6-069b84438907.jpeg)

publicはその後ろにfloat や GameObject とつなげて、script上に*宣言*し、以下で使うことができる。

*voidについて*
voidの後に、startや、updateなどをつけて、実際にゲームが動いている時に処理をしてもらう所です。
startは、ゲームが始まった瞬間に一回だけ処理したい場合。
updateは、ゲーム中常に何回も処理したい場合。
に、使っていく。

（他にも当たった時。などもある。）

*その他*
ゲーム中のエラーを確認することができる機能があり、Debug.Logという。
スクリプト内に、Debug.Log（確認したい所）
と書いて動かすと、consoleでどこにエラーが発生しているかがわかる。
SharePoint Workspace 2010 や Groove2007 で、データーを綺麗に削除する方法

※ これやってもなにも解決しませんでした・・・。一応記録として残しておく。



* [SharePoint Workspace 2010 で一時データおよび永続データを削除する方法](https://support.microsoft.com/ja-jp/help/982279/how-to-delete-temporary-and-permanent-data-in-sharepoint-workspace-201)

```
32 ビットOSの場合
%SystemDrive%\Program Files\Microsoft Office\Office14\Groove.exe /clean /all
```

```
64 ビットOSの場合
%SystemDrive%\Program Files (x86)\Microsoft Office\Office14\Groove.exe /clean /all
```

## Groove 2007

* [Groove データを削除するのには GrooveClean.exe を使用する方法](https://support.microsoft.com/ja-jp/help/907854/how-to-use-grooveclean-exe-to-delete-groove-data)

```
C:\Program Files\Microsoft Office\OFFICE12\GrooveClean
```
CapsLockキーとCtrlキーを入れ替え、さらに半角・全角キーとESCキーを入れ替える

[元ネタ](http://www.salutesound.com/~oss_keyswap.html)

元ネタのページがなくなっても大丈夫なように。まぁ

01) ［スタート］ボタンをクリック
02) ［ファイル名を指定して実行］をクリック
03) ［regedit］と打ち込み、エンター
04) ［HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout］を開く
05) ［編集］→［新規］→［バイナリ値］とクリックし、値の名前を「Scancode Map」にする
06) Scancode Mapを右クリック→［バイナリデータの編集］をクリックし、16進で以下の値を入力する

```
00 00 00 00
00 00 00 00
05 00 00 00
1d 00 3a 00
3a 00 1d 00
01 00 29 00
29 00 01 00
00 00 00 00
```
07) レジストリエディタを終了する
08) 再起動する
Dockerでリバースプロキシを構築

内容されているTomcatで動くSpring BootをNginxで動かしたいと思ったのをきっかけにリバプロについて学んだ時の備忘録。

# リバプロって

リバースプロキシの略。
ユーザにWebアプリを見せるとき代理で応答する機能。主にApacheやNginxで設定できる。

## イメージ

![New Wireframe 1 (2).png](https://qiita-image-store.s3.amazonaws.com/0/230829/02ea339a-ff19-b46f-a941-355670d2781a.png)

### リバプロを詳しく解説しているサイト

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典：
http://wa3.i-3-i.info/word1755.html

# リバプロって何がいいの

* Webサーバーの存在を隠ぺいすることができる
* アクセスの負荷分散DoSやDDoSなどの一般的なWebベースの攻撃から保護することができる
* 応答をキャッシュや圧縮することでパフォーマンス向上
* Webアプリが落ちてもsorryページを表示できる

### リバプロのメリットについて詳しく記載しているサイト

90秒の動画で学ぶITキーワード：リバースプロキシ（Reverse Proxy）
http://www.atmarkit.co.jp/ait/articles/1608/25/news034.html

# DockerでWebアプリとNginx使ってリバプロ

* 前提条件

Docker Composeをインストールしていること

* Nginxでリバプロを実行するには設定ファイル(.conf)が必要

```conf:/nginx/conf.d/app.conf
server {
    listen 80;
    # 以下に別にエラーページを設定しておく
    root /usr/share/nginx/html;
    error_page 500 502 503 504 /error.html;
    location /error.html {
        internal;
    }

    location / {
        proxy_pass http://app:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        access_log   off;
        expires      30d;
        alias /app/static;
    }
}
```

* Docker Conmponentを作成

```yaml:docker-compose.yml
version: '3.3'

services:

# リバプロのnginx起動
  nginx:
   container_name: some-nginx
   image: nginx:1.13
   restart: always
   ports:
     - 80:80
     - 443:443
   volumes:
     - ./nginx/conf.d/:/etc/nginx/conf.d
     - ./nginx/html/:/usr/share/nginx/html

# アプリ起動
  app:
    restart: always
    build: . #アプリを起動するDockerFile用意
    ports:
       - "8080"
#      - "8080:8080" Webアプリの8080ポートを隠す
    depends_on:
      - nginx
```

* Docker起動

```
docker-compose up
```

* 起動確認

```
http://localhost
```


### ※Spring BootとNginxでリバプロを構築するときに参考にしたサイト
https://hellokoding.com/docker-compose-with-spring-boot-nginx/
Management3.0 にでてくる Melly Shum hates her job の Melly Shumさんってナニモノ？

###はじめに
Management3.0 にでてくる [Happy Melly](https://www.happymelly.com/management-3-0-licensing/)の Mellyさんがなにもの？何ででてくるの？よくわからなかったので、調べてみた。

###わかったこと
google先生にきいてみた。
最初、オランダ語のリンクしかでてこず戸惑ったが、さらに調べてみると、英語の記事が見つかった。下記のリンクですね。
[Melly Shum hates her job](https://www.sculptureinternationalrotterdam.nl/en/collectie/melly-shum-hates-her-job-en)

- Sculpture International Rotterdam（ロッテルダムにある国際彫刻） のうちの一つ。芸術作品(Artwork)
- Ken Lumさん という方の作品、1990年
- Melly Shum という人が実在するかどうかは不明。
一見、幸せそうな顔をしている写真と対照的に "Melly Shum hates her job"という文(logo)ものせたところもふくめ 芸術作品。芸術作品なので、見た人の想像を任せるやり方。
- ということで、Ken Lumさんは、何も作品の解説・コメントしているわけではない。
- 上記の解説文では「20年たっているけど、今日的な問いかけをしている作品だよね」と結んでいる。

###というわけで。
- オランダ~~ひいてはヨーロッパ~~では、それなりに社会的なインパクトがあった作品なのだろう*1。たぶん。
- 日本でも 高橋まつりさん事件 という痛ましい事件があったが、たとえば、それを思い起こすような作品 ととらえればよいのかな。

####注記
*1 Stefanさんの話では、ヨーロッパで有名な作品ということもなさそうなので、取り消し線をひいておく。
ねこちゃん。ネト

#概要
「ねこちゃん。ネト」のご紹介。
簡単に言うと、irixカーネルで、linux資産を利用しようと言う、プロジェクト。
自分は、origin2000に、Blenderをインストールした事がある。

#リンク
http://www.nekochan.net/weblog/archives/irix-software/


以上。
【Swift】@IBOutlet weak var label: UILabel?   ん?

ある動画を見ていて、「あれ？こんなことできるの？」と思ったことがあったのでメモします。
(もしかして当たり前でしょうか？だとしたら知らなかった自分は大いに反省します。)

storyboard上に２つのViewControllerを表す画面があり、ソースとしては同じViewControllerクラスを参照します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/219965/abd363d9-24d8-3c82-207f-172e0b68ea4a.png)

※「次へ」ボタンは次の画面に移動できるようにセグエでつなげているだけなので気にしないでください。


参照するクラスは共通なのですが、

左の画面では　
ViewController1用ラベルを表示したいがViewController2用ラベルはいらない

右の画面では
ViewController2用ラベルを表示したいがViewController1用ラベルはいらない

といった場合に普通に値を設定しようとすると下記のようなエラーになります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/219965/0147956e-cdf2-b961-80b0-37f98e084754.png)


この場合どうすれば良いのかというと、@IBOutletの変数をOptionalにすれば良いようです。

![スクリーンショット 2018-05-19 7.28.01（2）.png](https://qiita-image-store.s3.amazonaws.com/0/219965/3a1a0d51-29bd-1d31-058b-779e53784c05.png)

こうすると、

![Simulator Screen Shot - iPhone X - 2018-05-19 at 07.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/219965/f2094260-436f-269a-0f31-0e3145bdd54c.png)

![Simulator Screen Shot - iPhone X - 2018-05-19 at 07.28.30 2.png](https://qiita-image-store.s3.amazonaws.com/0/219965/d11eacd9-ad1f-58c9-9ffa-a7da89cdc290.png)

のように上手く画面に合わせて表示を切り替えることができました。


あんまりやりすぎると画面それぞれで不要な変数が増えてしまったり、場合分けが出てきてしまうことがあるかもしれませんが、
単純に処理は全く一緒だけれども表示内容が少しだけ違うといった場合に有効なことがあるのかもしれませんね。


Xcodeが自動で生成しているものなので何も考えずに使っていましたが、新しい発見をすることができました。
iOSアップロードエラーについて その4

2018年4月からApp Storeに提出される新規アプリは、Xcode 9以降に含まれる`iOS 11 SDK`を使用してビルドする必要があります。
また、iPhone Xのディスプレイにも対応する必要があります。

詳しくは、Appleで公開されている[ドキュメント](https://developer.apple.com/ios/submit/)を参照してください。

2018年5月以降は、新規アプリだけではなく、既存アプリのアップデートの際にもiOS 11 SDKが含まれていない場合、下記のようなエラーでiTunes Connectへのアップロードが失敗するようになっています。

```
ERROR ITMS-90725: "SDK Version Issue. This app was built with the iOS '10.3' SDK. All new iOS apps submitted to the App Store must be built with the iOS '11.0' SDK or later, included in Xcode [9.0] or later. Please update Xcode and rebuild your app."
```

# MonacaのiOS 11 SDK対応について

MonacaでiOS 11 SDKを使用してビルドを行う場合は、Cordova7.1プロジェクトを使用する必要があります。
そのため、Cordova7.1以下のプロジェクトでビルドを行なった場合は、iTunes Connectへアップロードすることができません。

Cordova7.1未満のプロジェクトでApp Storeへ公開しているアプリを開発している場合は、Cordova7.1へのアップグレードが必須になります。

Cordova7.1プロジェクトでは、iPhone Xのディスプレイにも対応しています。
対応方法は、[iPhoneXのセーフ エリア対応について](https://qiita.com/keeey/items/c175bd8ef12ee65ac3fc)を参考にしてください。


#その他のiOSアップロードエラー

Cordova 7.1プロジェクトでのiOSアップロードエラーについては、下記も合わせて確認してみてください。

- [iOSアップロードエラーについて その3](https://qiita.com/keeey/items/6f307af018f186cbdf7d)
- [iOSアップロードエラーについて その2](https://qiita.com/keeey/items/cc4482ae01d87592d3e5)
- [[Monaca] iOSアップロードエラーについて](https://qiita.com/keeey/items/82d29c8582dc7ae383d0)
クリックを検知したい時

あるGameObjectをクリックしたときに、何か処理をしたい場合に使えるEventSystemとIPointerClickHandlerについて書きます。

#まずEventSystemとは。

EventSystemとは、
>キーボード、マウス、タッチやカスタムの入力に基づいて、アプリケーション内のオブジェクトにイベントを送信する方法

です。（[Unityマニュアル](https://docs.unity3d.com/jp/530/Manual/EventSystem.html)より）。
つまり、EventSystemを使えば、あるオブジェクトがクリックされたりした時に、そのオブジェクトにイベントを送ることができるということです。

この中で、この記事では　”IPointerClickHandler"を用いて、クリックされたオブジェクトにイベントを送信する方法について述べます。

IPointerClickHandlerを使うタイミングとは、UIではないオブジェクトに対してイベントを飛ばすときです。
UIの一つであるButtonなどに対しては関数とButtonをそのまま対応させることができますが、UIでないゲームオブジェクトに対して「それがクリックされた時に〇〇する」という処理をするためには

「EventSystemが該当シーンに存在すること（クリックを完治するため）」
「PhysicalRaycasterがカメラにアタッチされていること（UIでないGameObjectに対して、どれがクリックされているのかを判別するため）」

が必要です。

それでは、実際にどのように使うのかをみてみましょう。

```C#.qiita.cs
using UnityEngine;
using UnityEngine.EventSystems;

public class qiita : MonoBehaviour, IPointerClickHandler{
	private PieceInfo _pieceInfo;
	void Awake(){
		_pieceInfo = GetComponent<PieceInfo>();
	}

	//クリックされたオブジェクトに対して実行している。
        public void OnPointerClick(PointerEventData eventData){
        Debug.Lig(name + "がクリックされた");
        }
}
```

このようにすることで、実際にクリックされたGameObjectの名前をコンソールに表示することができます。
「クリックされたら〇〇する」という処理をしたい時にぜひお使いください。
WSL の Ubuntu 18.04 で OCaml 開発環境を作る

# はじめに

Windows Subsystem for Linux の Ubuntu 18.04 で OCaml 開発環境を作りました。難しいことは何もありません。Windows での OCaml 開発環境がアレだったのはひと昔、今や WSL でサクッと快適な OCaml 開発環境が作れます。

# 手順

Microsoft Store で Ubuntu 18.04(無料) をインストールします。

その後 Linux 上で次のように実行します。質問にはてきとうに `y` と答えましょう。それぞれ時間がかかりますので、時間があるときにやりましょう。

```shell-session:bash
$ sudo apt update
$ sudo apt install emacs m4 opam
$ opam init
$ opam install tuareg ocp-indent utop merlin user-setup
$ opam user-setup install
$ eval `opam config env`
```

最後の ``eval `opam config env` `` は環境変数がクリアされる毎に実行する必要があります。面倒な方は `.bashrc` なりなんなりに書くといいと思います。

基本的にはこれで終わりです。

何を入れさせられているのか不安かもしれませんので、明示的に入れたものを軽く説明しておきます。

| 名前 | 説明 |
|---|---|
| emacs | 言わずと知れたエディタです。vim は Ubuntu18.04 に最初から入ってます。 |
| m4 | テキストマクロプロセッサです。直接使うことはあまりないと思いますが、これを入れないで `opam init` しようとすると、「多くのパッケージが m4 に依存するから入れた方がいいよ」と言われます。 |
| opam | OCaml 用パッケージマネージャです。 |
| tuareg | emacs 用の OCaml major-mode です。 |
| ocp-indent | emacs/vim 用の OCaml インデンタです。 tuareg と共存できます。 |
| utop | ocaml コマンド単独よりも賢い repl を提供してくれます。 |
| merlin | OCaml 用のコード補完ツールです。 |
| user-setup | tuareg, ocp-indent, utop, merlin 用の設定を .emacs や .vimrc に書き込んでくれる。 |

# もう少し便利にする

## コード補完

### emacs

実は既に設定は済んでいます。

```ocaml:test.ml
let () =
  print_
```

として、 print_ の末尾にカーソルを合わせてから、 `M-x completion-at-point` もしくは `M-x co-at` とすると、補完ができます。

![co-at.png](https://qiita-image-store.s3.amazonaws.com/0/151239/237e106f-a4fd-f707-c5ca-876d0437ba42.png)

Frame が分割されてダサいと思われる方は company を入れると良いと思います。emacs で `M-x list-packages` とするとメニューが出てくるので、そこで company を install して、 emacs を再起動しましょう。いい感じになります。

![company.png](https://qiita-image-store.s3.amazonaws.com/0/151239/b273412c-f905-9e0c-941c-ddf549225298.png)

company では `print_` とタイプして少し間をおくと自動的に補完メニューが出てきます。

### vim

実は既に設定は済んでいます。

```ocaml:test.ml
let () =
  print_
```

として、 print_ の末尾にカーソルを合わせてから、挿入モードで Ctrl-X Ctrl-O とすると、補完メニューが出ます。

![vim.png](https://qiita-image-store.s3.amazonaws.com/0/151239/d599b024-cacb-d493-cf9c-c12e80824d51.png)

## jbuilder と .merlin

.merlin、めんどくさいですよね。昨今はビルドシステムの dune(jbuilder) さんが自動的に作ってくれます。何かの依存関係の関係でインストールも終わっていると思います。

とりあえず例ですが、まず `test.ml` というファイルだけのプログラムの場合、同じディレクトリに次の様な内容の jbuild という名前のファイルを作ります。

```text:jbuild
(jbuild_version 1)

(executable
 ((name test)))
```

そして次のようにするとビルドできます。

```shell-session
$ jbuilder build test.exe
```

このとき .merlin まで自動で作ってくれます。

細かいところは[本家documentation](https://jbuilder.readthedocs.io/en/latest/)や[Keigo Imaiさんの記事](https://qiita.com/keigoi/items/a68298fcd39322004fed)を見ると良いと思います。

## emacs を X Window で使いたい

Windows用 X Server はいくつかありますが、私は VcXsrv というのを入れました。Windows 側で VcXsrv を install して、立ち上げてから Linux 側で

```shell-session
$ emacs --display=localhost:0.0
```

もしくは

```shell-session
$ DISPLAY=localhost:0.0 emacs
```

とすると X Window で emacs を実行できます。

# おわりに

というわけで Windows でも OCaml 開発環境が簡単に作れるようになりました。便利な世の中になりましたね。
Unityでのcoroutineの使い方（処理を待ちたいとき）


ある処理をする　　➡︎　　少し待つ　　➡︎　　別の処理をする
ということをしたいときに使える、coroutineについて書きます。
# **coroutineとは**
まずcoroutineとはなにか。
これは何か英単語かと思って調べましたが違いました。プログラミングの文脈でのみ使われる単語のようです。
C＃やC++など、C言語系で使われます。

このcoroutineとは関数で、これを使うと、**フレームを跨いで処理を行うことができます。**
実際に例をあげてみてみます。

```C＃：qiita.cs
void Start(){
     Increase();
}

private void Increase(){
     for(int i = 1; i <= 10; i++){
     Debug.Log(i);
     }
}

```
例えば、このようなコードを実行した場合、
Debugされる`i`は一瞬で増加していきます。

この`i`が、1秒に１ずつ増加していくようにしたい時、coroutineを使います。

```C＃：qiita.cs
void Start(){
     StartCoroutine("Increase");
}

private IEnumerator Increase(){
     for(int i = 1; i <= 10; i++){
     Debug.Log(i);
     yield return new WaitForSeconds (1.0f); 
     }
}
```
このようにすることで、iが1増えるごとに処理を1秒待つことができます。

Unityの公式によるUnityマニュアルでコルーチンについての記述のある部分は[こちら](https://docs.unity3d.com/jp/530/Manual/Coroutines.html)。
chainer3で偶数と奇数を分類するための初心者の備忘録

教師データをどれだけ充実させるかとか
GPUを使うかとか、Trainerを使うとか、そういうのは気にせず、
まずは奇数と偶数を分類できるようにchainer3で単純に学習させてみました。

お題: 偶数と奇数の分類 by Chainer3
=========
入力： 0 〜 9 の整数
出力： [1,0]:偶数、[0,1]:奇数

実験
=========
下記のコードで実験してみました。

```python:test.py
import numpy as np

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import Variable, optimizers

class MyModel(chainer.Chain):

    def __init__(self):
        super(MyModel, self).__init__()
        with self.init_scope():
            self.l1 = L.Linear(10, 10)
            self.l2 = L.Linear(10, 10)
            self.l3 = L.Linear(10, 2)

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

if __name__ == '__main__':

    model = MyModel()
    optimizer = optimizers.SGD()
    optimizer.setup(model)

    # バッチ処理用のデータを作成
    listX = []
    listY = []
    for i in range(10):
        l = np.zeros(10)
        l[i] = 1
        listX.append(l)
        listY.append(i % 2)

    x = Variable(np.array(listX, dtype=np.float32))
    y = Variable(np.array(listY, dtype=np.int32))

    # 学習
    for i in range(2000):
        model.zerograds()
        loss = F.softmax_cross_entropy(model(x), y)
        loss.backward()
        optimizer.update()

    # テスト
    for i in range(10):
        l = np.zeros(10)
        l[i] = 1
        x = Variable(np.array(l, dtype=np.float32).reshape(1,-1))
        print(F.softmax(model(x)))
```

結果
=========
以下のように、0 〜 9 の入力に対し、偶数->奇数->偶数->奇数の順に数値が高くなりました。

```
$ python test.py 
variable([[ 0.96782762  0.03217238]])
variable([[ 0.02553093  0.97446907]])
variable([[ 0.95543504  0.04456493]])
variable([[ 0.10487143  0.89512861]])
variable([[ 0.97594351  0.02405647]])
variable([[ 0.03047855  0.96952146]])
variable([[ 0.91441429  0.08558577]])
variable([[ 0.19360393  0.80639613]])
variable([[ 0.98645091  0.01354905]])
variable([[ 0.01921912  0.9807809 ]])
```
新規のgitリポジトリに、別リポジトリの過去履歴を丸ごとpushする方法

githubに作ったリポジトリ名がダサかったので名称を変更する予定でした。
が、renameボタンを見つける前に空リポジトリを作成してしまったため、rename出来ず。

しょうがないので既存リポジトリのコミットを、丸ごとgitの機能でコミットし直しました。
importとか出来そうですが、応用の効くこちらのやり方だけ覚えとくようにしてます。

##**手順**

超簡単です。
1. 既存リポジトリのremoteアドレスに新規のアドレスを追加する。
2. 新規アドレス向けに、今あるリポジトリのブランチをコミットする。

###**1. 既存リポジトリのremoteアドレスに新規のアドレスを追加する。**

既存リポジトリに移動し、以下コマンドを利用します。

```
$ git remote add new https://github.com/developer-kikikaikai/design_pattern_for_c.git
```

**addの後がキーワード**、その後がurlです。git config --listで設定確認。

```
$ git config --list
...
remote.origin.url=git@github.com:developer-kikikaikai/practice_design_pattern.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.new.url=https://github.com/developer-kikikaikai/design_pattern_for_c.git
remote.new.fetch=+refs/heads/*:refs/remotes/new/*
```

remoteアドレスは普段`remote.origin`だけなんですが、上で**newというキーワードでurlを追加したため、`remote.new.url`という設定が追加されました**。

###**2. 新規アドレス向けに、今あるリポジトリのブランチをコミットする。**

今回は新規コミットなので-fを付けていますが、こんな感じ。

```
git push -f new master
```

git pushやgit pullの時にもしかしたら無意識につけているかもしれない、**`origin`ってのはリモートリポジトリの指定**なんですね。
なので、**追加したリポジトリのキーワードである`new`を指定**してあげれば、対応するurlにpushが出来るという寸法です。

以上でコミット丸ごと移行完了！簡単ですね。
配列内のオブジェクトで同一のプロパティに対して同じ値を持つものを除外したい

配列内のオブジェクトでそれぞれ重複する値を持つものを除外したいと思ったので、やり方を備忘録として残します。

```javascript:js

let arr = [{id: 1}, {id: 2}, {id: 1}, {id: 3}, {id: 2}]

// id=1, id=2 がダブってるので重複を削除して下記のようにしたい
arr = [{id: 1}, {id: 2}, {id: 3}]
```

こんな感じでやれます。

```javascript:js
arr = arr.filter((elm, index, selfArr) => {
  return index === selfArr.findIndex(s => {
    return s.id === elm.id
  })
})
```

findIndex と filter の説明

```javascript:js
// callbackでtrueとなる "最初" のindex番号を返す
findIndex(callback(elm, index, selfArray)) 

// callbackでtrueとなる要素だけ(trueの要素全て)を返す
filter(callback(elm, index, selfArray))

// どちらもcallbackの使わない引数は省略化
```

短く書くとこうなります。

```javascript:js
// １行でも書ける
arr = arr.filter((elm, index, selfArr) => index === selfArr.findIndex(s => s.id === elm.id))
```

もっと良い案があればどなたか教えてください。
【Laravel】更新時のユニークチェックで特定の値は対象外としたいときの対応

LaravelでWebアプリを作成していて、バリデーションチェックを行うときに以下の部分でハマりました。

- `email`カラムに登録しようとしている値がUNIQUEかどうか判定したい
- ただし、更新時に自分の`email`と重複するのは許容したい
- 自分かどうかの判定は`id`カラムではなく、`user_id`カラムの値で判定したい


# 1．前提
- PHP v7.2.5
- Laravel v5.5.40

# 2．解決策


```php
$request->validate([
    # unique:ユニークチェックをしたいテーブル名,ユニークチェックをしたいカラム名,ユニークチェックを除外したい値,ユニークチェックを除外したいカラム名
    'email' => 'unique:users,email,'.$this->me->user_id.',user_id',
]);
```

IDのカラム名が`id`であれば、上記の第4引数である`user_id`はなくても上手く動きます。
Laravelのデフォルトではプライマリーキーのカラム名は`id`となるため、自動でプライマリーキーが`id`として検索が行われるからです。

プライマリーキーのカラム名を`id`でなく`user_id`など、カスタマイズしている場合には上記のようにプライマリーキーのカラム名を明示しなくてはなりません。

# 3．理由
Laravelのソースを参照すると以下のようになっています。
第4引数でカラム名を取得してくれる構造になっているので、こちらを利用すればOKということになります。

```php:vender/laravel/framework/src/Illuminate/Validation/Rules/Unique.php
<?php

namespace Illuminate\Validation\Rules;

class Unique
{
    use DatabaseRule;

    /**
     * The ID that should be ignored.
     *
     * @var mixed
     */
    protected $ignore;

    /**
     * The name of the ID column.
     *
     * @var string
     */
    protected $idColumn = 'id';

    /**
     * Ignore the given ID during the unique check.
     *
     * @param  mixed  $id
     * @param  string  $idColumn
     * @return $this
     */
    public function ignore($id, $idColumn = 'id')
    {
        $this->ignore = $id;
        $this->idColumn = $idColumn;

        return $this;
    }

    /**
     * Convert the rule to a validation string.
     *
     * @return string
     */
    public function __toString()
    {
        return rtrim(sprintf('unique:%s,%s,%s,%s,%s',
            $this->table,
            $this->column,
            $this->ignore ? '"'.$this->ignore.'"' : 'NULL',
            $this->idColumn,
            $this->formatWheres()
        ), ',');
    }
}
```

ソースを読めばしょうもない話なのですが、日本語のドキュメントが意外と見つからなかったので、こちらに残しておきます。


# 4．参考文献
- [Forcing a unique rule to ignore a given id
](https://laracasts.com/discuss/channels/laravel/forcing-a-unique-rule-to-ignore-a-given-id)
- [Laravel rule validation unique for id](https://stackoverflow.com/questions/47750807/laravel-rule-validation-unique-for-id)
gitbucketでH2からRDBMSに移行する

# 経緯

なんかgitbucketはH2とかいうDBを使って色々と情報を格納しているらしいが，使い方をしらんので他のSQLに乗り換えることにした．

# 乗り換えた結果

はっきし言って，gitbucketが重くなったと思う．
参考まで → [パフォーマンス比較 Cassandra、Mongodb、SQLite、H2、MySQL、Postgres \- C/pHeR Memo \- Java とか。Eclipse とか。](http://d.hatena.ne.jp/cypher256/20121013/p1)

# 準備

- rootでログインし直してsystem administrationからdb export．
- gitbucketを落としておく
- ポスグレを入れておく

# MariaDBを試してみる

gitbucketを起動しようとするとエラーが出て，ブラウザからアクセスしても503エラーで接続できない．
このサイトによると，ビューのFROMでサブクエリが使えないらしい．
[GitBucket \+ MariaDBの構築でハマった件 \- 無理なご乗車はおやめ下さい。](https://tydk27.hatenadiary.com/entry/20170805/1501938333)

ポスグレは確かできた気がするのでポスグレ採用．

# PostgreSQLを試してみる

MySQLはプライベートで他のソフト（wordpressとかowncloudとか）に要求されて使ってるだけなんで，ソフトをそこまで信用しておらずユーザを分けて使っていた．
一方でPostgreSQLはデータ分析の仕事で自分専用のサーバを立てて使っているのでpostgresユーザでしかアクセスしたことがない．
自分で1行も書いてないソフトに，そういう使い方はちょっと心配なので設定を頑張ってみる．

## ユーザを作ってログインできるようにする．

createuserのオプションはここを参照した[PostgreSQL でパスワード認証を使う](https://net-newbie.com/postgres/password.html#h3_4)

```sh
sudo su - postgres  # postgresになってポスグレ関連コマンドを使う
createuser -D -E -R -S -P UESRNAME
createdb DBNAME
```

ユーザの認証方法とかアクセス権の設定．
DBとgitbucketを同じホストで動作させる前提で．
ADDRESSのとこは，TYPEがlocalなのに指定すると動かないので注意．

```diff
--- a/9.6/main/pg_hba.conf
+++ b/9.6/main/pg_hba.conf
@@ -85,6 +85,7 @@
 local   all             postgres                                peer

 # TYPE  DATABASE        USER            ADDRESS                 METHOD
+local   DBNAME          USERNAME                                md5

 # "local" is for Unix domain socket connections only
 local   all             all                                     peer
```

```sh
sudo service postgres restart
psql -U USERNAME DBNAME
```

パスワードのプロンプトが返ってきたら成功．

# gitbucketの設定変更．

```conf:.gitbucket/database.conf
db {
  url = "jdbc:postgresql://localhost/gitbucket"
  user = "USERNAME"
  password = "PASSWORD"
}
```

# データのリストア

まず，gitbucketを起動する．
それから，H2時代にエキスポートしたsqlファイルを準備．
ブラウザを起動して，初期設定のID:root/PW:rootでログインする．
system administartionからsqlファイルのインポート．xmlじゃなくてもインポートできた．

先達に従って，意味はよくわからんがpsql特有に移せない設定があると信じて以下を実行する．

```sql
SELECT setval('label_label_id_seq', (select max(label_id) + 1 from label));
SELECT setval('activity_activity_id_seq', (select max(activity_id) + 1 from activity));
SELECT setval('access_token_access_token_id_seq', (select max(access_token_id) + 1 from access_token));
SELECT setval('commit_comment_comment_id_seq', (select max(comment_id) + 1 from commit_comment));
SELECT setval('commit_status_commit_status_id_seq', (select max(commit_status_id) + 1 from commit_status));
SELECT setval('milestone_milestone_id_seq', (select max(milestone_id) + 1 from milestone));
SELECT setval('issue_comment_comment_id_seq', (select max(comment_id) + 1 from issue_comment));
SELECT setval('ssh_key_ssh_key_id_seq', (select max(ssh_key_id) + 1 from ssh_key));
```

# gitbucketの起動して完了
Energia on Mac OS High Sierra

# 概要

Mac OS High SierraでEnergia 1.6.10でLaunchpadにプログラムを書き込むとエラーが出る対策。

# 環境

* Mac OS High Sierra 10.13.4
* Energia 18 aka Energia 1.6.10E18

# 状況
1. インストールしたままで出るエラー 

    ```
failed MSpanList_Insert 0x30d000 0x504f9a602be9 0x0
fatal error: MSpanList_Insert 
```

# 手順

1. Energia 18 aka Energia 1.6.10E18を[http://energia.nu/download/](http://energia.nu/download/)からインストール

2. Arduino Builderを入れ替える
    1. arduino-builder-macosx-...を[https://github.com/arduino/arduino-builder/releases](https://github.com/arduino/arduino-builder/releases
)からダウンロードする。  
  現在の最新版はarduino-builder-macosx-1.3.25.tar.bz2でした。
    2. ダウンロードしたファイルをダブルクリックして展開する。
    3. Energiaをコントロールを押しながらクリックし、パッケージの内容を表示を選ぶ。
    4. 展開して出来たarduino-builderをContents/Javaに移動する。  


3. mspdebugを入れ替える
    1. mspdebug.zipを[https://github.com/energia/Energia/files/595237/mspdebug.zip](https://github.com/energia/Energia/files/595237/mspdebug.zip)からダウンロードする。
    2. ダウンロードしたファイルをダブルクリックして展開する。
    3. Energiaをコントロールを押しながらクリックし、パッケージの内容を表示を選ぶ。
    4. 展開して出来たmspdebugをContents/Java/hardware/tools/msp430/bin/に移動する。  

# 参考

1. https://forum.43oh.com/topic/13041-energia-ide-fails-with-fatal-error-mspanlist_insert/
2. https://github.com/energia/Energia/issues/938
LaravelのDB設定


本日php artisan migrateでエラーが発生

```error内容
$ php artisan migrate:refresh

 Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)

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

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES)")
      /Users/tky/Workspace/PHP/Laravel/tutorial/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=homestead", "homestead", "secret", [])
      /Users/tky/Workspace/PHP/Laravel/tutorial/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68

  Please use the argument -v to see more details.

```

DBの権限がどうのこうので、migrateできねぇっていうてはるんですかね？

DBもhomesteadのDBを使いますか？みたいになってるので明らか設定がまちがってるよね。って思ったのでDBの設定を変更していきます

##Mysqlの設定変更

今回Mysqlを使っているのでMysqlの設定を変更していく
下記はデフォルトで設定されていた値

```.env
#デフォルトの値
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

homesteadでvagrantの仮想サーバー用の設定になっていたので
rootユーザー用の設定に変更

```.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=
```
わざわざMysqlにアクセスしてtutorialって名前のDBを作ったけど、もしかしてmigrateした時点で作成された？

database.phpも設定変更していく

```config/database.php

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'), #変更
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'tutorial'), #変更
            'username' => env('DB_USERNAME', 'root'), #変更
            'password' => env('DB_PASSWORD', ''), #変更
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        
```
rootユーザーの設定にしたので
php artisan migrate実行

```
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_05_18_120611_create_tasks_table
Migrated:  2018_05_18_120611_create_tasks_table
```

いけた！
存在しないものにマークを付ける

#◆実現したい内容
あるテーブルにデータを登録します。そのテーブル情報は、複数の人に参照されるとします。
テーブル情報は、人単位に参照したかどうか印を付けます。

#事例
例えば、グループ同報をイメージ。
あるグループには、複数人のメンバがいます。
メンバ向けのお知らせ情報はみんなに同時配信されます。

自分がまだチェックしていないお知らせは、未チェックの印が表示されます。

※グループのメンバは、増減がある可能性があるので、お知らせをチェックしたかどうかの情報は、御知らせ情報とは離して管理するようにします。

#テーブル構成
**■グループメンバテーブル [T_GROUP]**

|カラム|型|備考|
|:---|:---:|:---|
|MEMBER_CD|varchar(3)|主キー|
|MEMBER_NM|varchar(10)|NOT NULL|

**■お知らせ情報テーブル [T_NOTICE]**

|カラム|型|備考|
|:---|:---:|:---|
|ID|int|主キー|
|TITLE|varchar(10)|NOT NULL|
|BODY|varchar(30)|NOT NULL|

**■チェック済情報テーブル [T_CHECKED]**

|カラム|型|備考|
|:---|:---:|:---|
|ID|int|主キー|
|MEMBER_CD|varchar(3)|主キー|

#テストケース
例えば、こんな情報が登録されている場合

**■グループメンバテーブル [T_GROUP]**
メンバが３名のグループとします。

|MEMBER_CD|MEMBER_NM|
|:---:|:---:|
|M01|たろう|
|M02|はなこ|
|M03|トミー|

**■お知らせ情報テーブル [T_NOTICE]**
お知らせが５件登録されています。

|ID|TITLE|BODY|
|:---:|:---:|:---:|
|1|タイトル1|００１のお知らせです。|
|2|タイトル2|００２のお知らせです。|
|3|タイトル3|００３のお知らせです。|
|4|タイトル4|００４のお知らせです。|
|5|タイトル5|００５のお知らせです。|

**■チェック済情報テーブル [T_CHECKED]**
お知らせ情報に対する各メンバのお知らせチェック状況は次の通りです。

|ID|MEMBER_CD|
|:---:|:---:|
|1|M01|
|3|M01|
|3|M03|

#テスト検証
メンバ毎に届いているお知らせの状態を確認します。
SQLは、こちらです。

```SQL
SELECT 
 N.ID AS 'お知らせID'
 , N.TITLE AS 'タイトル'
 , N.BODY AS '本文'
 , CASE 
    WHEN CC.MEMBER_CD IS NULL THEN '未'
	ELSE '' END AS 'チェック'
FROM 
 T_NOTICE N
LEFT OUTER JOIN
 (SELECT 
   C.ID AS ID
   ,C.MEMBER_CD AS MEMBER_CD
  FROM
   T_CHECKED C
  WHERE C.MEMBER_CD = 'M01') CC  -- ★M01の場合。対象のMEMBER_CDを設定して実行
ON CC.ID = N.ID;
```

**■M01：たろう**

|お知らせID|タイトル|本文|チェック|
|:---:|:---:|:---:|:---:|
|1|タイトル1|００１のお知らせです。||
|2|タイトル2|００２のお知らせです。|未|
|3|タイトル3|００３のお知らせです。||
|4|タイトル4|００４のお知らせです。|未|
|5|タイトル5|００５のお知らせです。|未|

**■M02：はなこ**

|お知らせID|タイトル|本文|チェック|
|:---:|:---:|:---:|:---:|
|1|タイトル1|００１のお知らせです。|未|
|2|タイトル2|００２のお知らせです。|未|
|3|タイトル3|００３のお知らせです。|未|
|4|タイトル4|００４のお知らせです。|未|
|5|タイトル5|００５のお知らせです。|未|

**■M03：トミー**

|お知らせID|タイトル|本文|チェック|
|:---:|:---:|:---:|:---:|
|1|タイトル1|００１のお知らせです。|未|
|2|タイトル2|００２のお知らせです。|未|
|3|タイトル3|００３のお知らせです。||
|4|タイトル4|００４のお知らせです。|未|
|5|タイトル5|００５のお知らせです。|未|

以上です。
DockerでGUI ①ホストがUnixの場合

# はじめに

これまで，DockerでGUIを使う方法としてContainer内でVNCサーバを立ち上げる方法が使っていましたが，やはり使い勝手が悪いです．
X Window関連のテクニックを使うことでContainer内のwindowをホスト側で描画できることは知っていたのですが，なんとなく面倒そうだったので使ってきませんでしたが，意外と簡単に出来たのでメモしておきます．

**ここではホスト(手元でGUIを操作できる端末)がUnix (Ubuntu)の場合です**
**開発用なのでセキュリティは気にしません**

## ホスト側の準備
下記のコマンドでX Windowサーバが，Container内からの接続を受け入れるように設定します．ユーザ権限で構いません．

```shell:
$ xhost local:
```
セキュリティ的にはあまりよろしくないらしい．取り消す場合は

```shell:
$ xhost -local:
```

現在の設定状況は以下で確認できます．

```shell:
$ xhost
```

## コンテナの起動
起動時にマウントオプションと環境変数を渡します

```shell:
-v /tmp/X11-unix:/tmp/X11-unix:rw -e DISPLAY=$DISPLAY
```

例えば

```shell:
docker run -it -v /tmp/X11-unix:/tmp/X11-unix:rw -e DISPLAY=$DISPLAY ubuntu bash
```

これだけで例えばmatplotlibのGUIが表示できたりします．sshなどの新たなパッケージを導入する必要がないのでうれしいです．
Laravel5.5 ConsoleとHttpのログファイルを分ける

Qiitaデビューしました。
初めまして、ゆうきゃんです。
メンタル弱いのでツッコミはお手柔らかにお願いします！

初投稿ということで簡単なものをご紹介します。

## 目的

Laravelのログはデイリーログを指定した場合は下記のように日毎にローテートされます。
`storage/logs/laravel-yyyy-mm-dd.log`

開発中は自分のタイミングでログが出るのでいいのですが、
本番運用が始まるとバッチ処理のコンソールログとブラウザからのアクセスログが入り混ざってログが読みづらくなってきます。

ということで、やっていくぞ！！

## 実装

システム全体の起動処理を変更するのでログ設定用のサービスプロバイダを作成します。

```sh
$ touch app/Providers/LogServiceProvider.php
```

### app/Providers/LogServiceProvider.php

- https://laravel.com/api/5.5/Illuminate/Log/LogServiceProvider.html

`Illuminate/Log/LogServiceProvider` を元に拡張します。

```php
<?php
namespace App\Providers;

use Illuminate\Log\Writer;
use Illuminate\Log\LogServiceProvider as ServiceProvider;

class LogServiceProvider extends ServiceProvider
{
    /**
     * Configure the Monolog handlers for the application.
     *
     * @param  \Illuminate\Log\Writer  $log
     * @return void
     */
    protected function configureDailyHandler(Writer $log)
    {
        $log->useDailyFiles(
            sprintf("%s/logs/%s.log"
                , $this->app->storagePath()
                , $this->getFileName()
            ),
            $this->maxFiles(),
            $this->logLevel()
        );
    }

    /**
     * Logging file name.
     *
     * @return string
     */
    private function getFileName()
    {
        return 'laravel-' . php_sapi_name();
    }
}
```

### config/app.php

`config/app.php` へ LogServiceProvider を追記します。

```php
    'log' => env('APP_LOG', 'daily'),

    'providers' => [
        // 追加
        App\Providers\LogServiceProvider::class,
    ],
```

以上、実装完了です！

## 結果

- `storage/logs/laravel-cli-yyyy-mm-dd.log`
- `storage/logs/laravel-cli-server-yyyy-mm-dd.log`
- `storage/logs/laravel-apache-yyyy-mm-dd.log`

上記のように各種ログファイルに別れて出力されます。

## バージョン

5.4と5.5はこの書き方で動くハズです。
5.3と5.6はログ周りの処理変わってたような気がします。
時間あるときに調べてみます。

## 参考

- https://readouble.com/laravel/5.5/ja/providers.html
- http://php.net/manual/ja/function.php-sapi-name.php
英語の辞書が与えられたときにすべてのアナグラムを見つける

引き続き珠玉のプログラミングの問題をやってみようかと
**Go**でやってます

過去記事

- [文字列をn個後ろにずらす処理を本気でやる](https://qiita.com/smith_30/items/eec0ba2e4ec63fe879a0)

## お題

タイトルの通り
英語の辞書が与えられたときにすべてのアナグラムを見つける  

アナグラムは同じ文字を異なる順番で使った単語のこと
例えば、[from, form], [time, item]など

単純なやり方としては
単語を1文字ずつずらして、すべての単語についてマッチするか見ていく

しかし、英単語の総数は100万以上らしく、5文字の単語を検査するのにも


```math
5! * 10^{6} = 1.2 * 10^{8}
```

1回ごとの比較処理が1μ秒だとしても

```math
10^{8}/回 * 10^{-6}秒/回 = 100秒
```

かかってしまう

**上記例は英単語の総数として出していますが、よく調べたら英辞典は17万ほどの収録だそうです**

じゃあ、どうすればいいかが本題

答えとしては同じアナグラムのグループに印をつけるということ
そして、同じ印のついた単語をまとめておけば目的が達成されます。

印のつけかたは、**各単語の文字列をアルファベット順に並べ替える**
単純ですが効果的ですよね、なるほど。。

そうとわかれば後はデータの持ち方きめればすぐに実装できそうですね
こんな感じでやってみました

[playground](https://play.golang.org/p/bP-HxWUBv54)

```go
package plg

import (
	"fmt"
	"sort"
	"strings"
)

var (
	dummyDict = []string{"from", "time", "item", "form", "off", "test"}
)

func Anagram() {
	// 容量割り当てときたいが目安がわからないので保留
	list := make(map[string][]string)

	for _, word := range dummyDict {
		key := sortStr(word)
		list[key] = append(list[key], word)
	}

	for _, words := range list {
		for _, w := range words {
			fmt.Print(w, " ")
		}
		fmt.Println()
	}
}

func sortStr(k string) string {
	s := strings.Split(k, "")
	sort.Strings(s)

	return strings.Join(s, "")
}

```

output

```
from form 
time item 
off 
test 
```

うん、うまくいってますね

一意のグループを表すキーを作るためにソートを使うっていうのは
知ってないと思いつかないので勉強になりました。
ホームページにenchant.jsを組み込む【enchant.js】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# 1. 記事の概要
この記事では、以下のようにホームページ上でenchant.jsのゲームを遊べるようにするための方法の一つとして、`<iframe>`を使った組み込みの方法を紹介します。

<img width="500" alt="スクリーンショット 2018-05-18 23.45.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/932775c2-7108-b45d-1792-b26821a1a716.png">

# 2. `<iframe>`を用いた方法
方法はとてもシンプルで、以下のように`<iframe>`タグでenchant.jsを動かしているhtmlファイルを組み込むだけです。

```html:iframe.html
<iframe src="index.html">
```

ここで、`<iframe>`タグとは、以下のようなタグです。
　・"inline frame"の略
　・HTMLの中で別のファイル（HTMLファイルなど）を組み込む
　・要するに、ページの中に別のページを表示する

# 3. サンプルコード
このサンプルコードでは、[code.9leap](http://code.9leap.net/)というサイトのURLからHTMLファイルを読み込んでいます。

```html:sample.html
<!DOCTYPE html>
<html>

  <head>
    <title>
      Sample
    </title>
  </head>

  <body>
    <iframe src="http://coderun.9leap.net/codes/146478/index.html" style="width: 500px; height: 500px;">
  </body>

</html>
```

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

http://enchantjs.com/ja/

https://techacademy.jp/magazine/5839

http://code.9leap.net/
Rocket.Chat のインストール

CentOS 7系にインストールしたメモ

# 手順
## インストール
1. epelリポジトリの追加

    ```
    # yum -y install epel-release && yum -y update
    ```

2. mongodbリポジトリの追加

    ```
    # vi /etc/yum.repos.d/mongodb-org-3.6.repo
    ```
    
    ```mongodb-org-3.6.repo
    [mongodb-org-3.6]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
    ```

3. 必要なパッケージをインストールする

    ```
    # yum install -y curl GraphicsMagick mongodb-org-server mongodb-org gcc-c++
    ```

4. node.jsのインストール

    node.js 8.9.3 が推奨とのことなので、tarファイルからビルド

    ```
    # curl -LkvOf https://nodejs.org/download/release/v8.9.3/node-v8.9.3-linux-x64.tar.gz
    # tar --strip-components 1 -xzvf node-v8.9.3-linux-x64.tar.gz -C /usr
    ```

5. npmパッケージのインストール

    ```
    # npm install -g inherits n
    ```

6. Rocket.Chatのダウンロード

    ```
    # cd /opt
    # curl -L https://releases.rocket.chat/latest/download -o rocket.chat.tar.gz
    ```

7. ファイルを展開する

    ```
    # tar zxvf rocket.chat.tar.gz
    # mv bundle Rocket.Chat
    ```

8. npmインストールを実行する

    ```
    # cd Rocket.Chat/programs/server
    # npm install
    # cd ../..
    ```

9. .bash_profileに設定を加える

    ```
    # vi ~/.bash_profile
    ```
    
    ```.bash_profile
    export PORT=3000
    export ROOT_URL=http://<IPアドレスもしくはホスト名>:3000/
    export MONGO_URL=mongodb://localhost:27017/rocketchat
    ```

10. mongoDBを起動する

    ```
    # systemctl start mongod
    ```

11. Rocket.Chatを起動する

    ```
    # node main.js
    ```

## サービスの自動起動設定
1. サービスファイルを登録する

    ```
    # vi /usr/lib/systemd/system/rocketchat.service
    ```
    
    ```rocketchat.service
    [Unit]
    Description=The Rocket.Chat server
    After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
    
    [Service]
    ExecStart=/bin/node /opt/Rocket.Chat/main.js
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=rocketchat
    User=root
    Environment=MONGO_URL=mongodb://localhost:27017/rocketchat ROOT_URL=http://<IPアドレスもしくはホスト名>:3000/ PORT=3000
    
    [Install]
    WantedBy=multi-user.target
    ```

2. サービスの自動起動を設定する

    ```
    # systemctl enable rocketchat.service
    ```

3. Rocket.Chatをsystemdで起動する

    ```
    # systemctl start rocketchat.service
    ```

## 管理者ユーザの登録

1. 「新しいアカウントを登録」をクリック
    ![RocketChatログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/34297/50142a88-5475-2b3a-e7a4-0a0da9aaa80b.png)

2. 以下の情報で登録

    |項目名|設定値|
    |:-----|:-----|
    |名前  |<任意の名前>|
    |メール |<任意のメールアドレス>|
    |パスワード|<任意のパスワード>|

3. 「新しいアカウントを登録」をクリック
4. ユーザ名を設定し、「ユーザ名を使用」をクリック
5. ログイン成功
    ![RocketChatログイン後の画面.png](https://qiita-image-store.s3.amazonaws.com/0/34297/29bcbd12-3151-10d9-1aa1-6b1b0b5ce9b7.png)

# 参考
- [Deploying Rocket.Chat on Centos 7](https://rocket.chat/docs/installation/manual-installation/centos/)
- [Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux¶](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/)
ask-sdkでdynamodb


## 参考
https://dev.classmethod.jp/cloud/alexa-sdk-v2-fourth/

## 前提条件
***nodeのバージョンがv8.10であること***

***まるっと、コピペでLaunchRequestをリクエストしてあげたら、「sampleTableName」というテーブルが作成され以下の画像のように保存されます。***

<img width="489" alt="スクリーンショット 2018-05-19 0.05.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/a4249705-87c7-e6a3-b12c-4ba2fa04e82e.png">

```
npm install --save ask-sdk
```

```js
const Alexa = require('ask-sdk');


let skill;
exports.handler = async function (event, context) {
    if (!skill) {
      skill = Alexa.SkillBuilders.standard() // <= standard()
        .addRequestHandlers(
            LaunchRequestHandler)
        .withTableName("sampleTableName") // これを追加（テーブル名）
        .withAutoCreateTable(true) //テーブル作成もスキルから行う場合は、これも追加
        .create();
    }
    return skill.invoke(event);
}

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    async handle(handlerInput) {
        // 取得。awaitで取得するまで待つ
        var dynamos = await handlerInput.attributesManager.getPersistentAttributes()
        
        // 保存。awaitで保存できるまで待つ
        dynamos = {
          "key": "value"
        }
        handlerInput.attributesManager.setPersistentAttributes(dynamos); // セット
        await handlerInput.attributesManager.savePersistentAttributes(); // 保存
        var msg = "お返事";
        return handlerInput.responseBuilder.speak(msg).reprompt(msg).getResponse();
    }
};
```

# 取得

```js
var attributes = await handlerInput.attributesManager.getPersistentAttributes()
```

# 保存

```js
attributes = {
  "key": "value"
}
handlerInput.attributesManager.setPersistentAttributes(attributes); // セット
await handlerInput.attributesManager.savePersistentAttributes(); // 保存
```

# lambdaのテストで使用したJSON

```json
{
  "session": {
    "new": true,
    "sessionId": "amzn1.echo-api.session.[unique-value-here]",
    "attributes": {},
    "user": {
      "userId": "amzn1.ask.account.[unique-value-here]"
    },
    "application": {
      "applicationId": "amzn1.ask.skill.[unique-value-here]"
    }
  },
  "version": "1.0",
  "request": {
    "locale": "en-US",
    "timestamp": "2016-10-27T18:21:44Z",
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.[unique-value-here]"
  },
  "context": {
    "AudioPlayer": {
      "playerActivity": "IDLE"
    },
    "System": {
      "device": {
        "supportedInterfaces": {
          "AudioPlayer": {}
        }
      },
      "application": {
        "applicationId": "amzn1.ask.skill.[unique-value-here]"
      },
      "user": {
        "userId": "amzn1.ask.account.[unique-value-here]"
      }
    }
  }
}
```
sin関数をUnityで利用する

SinをUnityでつかえると、意外と一気にビジュアル的ゲームのクオリティをあげられることに気づいたので、ここに例を挙げておこうとおもいます。


#泡がゆらゆらと昇っていく様子
まずひとつ目。泡を等速度上昇させながらxまたはz軸方向に等速で往復させるという手もある。しかし、sin関数を使うことで、より滑らかで泡らしいうごきをするようになるのです。

以下スクリプト

```c#:bubblesin.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class bubblesin : MonoBehaviour {

	private float bubble_x;
	private float bubble_y;
	private float bubble_z;
	private float time;
	private int posxrandom;

	// Use this for initialization
	void Start () {
		time = 0;
		posxrandom = Random.Range (-3, 4);
	}
	
	// Update is called once per frame
	void Update () {
		time += Time.deltaTime;

		bubble_x = Mathf.Sin (time) * 0.5f + posxrandom;
		bubble_y = time * 0.7f;
		bubble_z = this.transform.position.z;
		this.transform.position = new Vector3 (bubble_x, bubble_y, bubble_z);

	}
}
```
このスクリプトをゆらゆらさせたい泡のゲームオブジェクトにひっつければよい。


#フレームを点滅させる。

まず、「点滅させる」とは、その不透明度を変化させるということである。



```c#:redFlash.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class redFlash : MonoBehaviour { 
	private float speed = 1.0f;
          //private Text text;
	private Image image;
	private float time;
    //RGBの各値とα値の各変数を宣言する。
	float alfa;
	float red, green, blue;

       void Update () {
      //点滅させたいオブジェクトのImageの色を手に入れる
		GetComponent<Image>().color = new Color(red, green, blue, alfa);
       //点滅させたいオブジェクトのRGB値を代入する
		red = 145;
		green = 5;
		blue = 30;
		time += Time.deltaTime *5.0f * speed;
       //α値にSin関数を代入する
		alfa = Mathf.Sin(time) * 0.5f + 0.5f;

		
	}
}
```
こちらのスクリプトは、点滅させたいゲームオブジェクトに直接アタッチする必要はない。

是非これからは、一次関数だけでなく、三角関数を上手く使用して、より良いステージを作りあげましょう！
mountしようとすると、can't read superblockと表示される。

ある朝突然chinachuで録画ができなくなった。
raspiを再起動し他ところ、外付けHDDがマウント出来なくなった時の備忘録。

##事象 can't read superblockと表示される。
外付けHDDをマウントしようとしたら、`can't read superblock`と表示されてしまった。

```shell
$ sudo mount -a
mount: /dev/sda2: can't read superblock
```

外付けHDDは認識されているのか？確認

```shell
$ sudo fdisk -l | grep /dev/sda
Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
/dev/sda1    2048     264191     262144  128M Linux filesystem
/dev/sda2  264192 3907029134 3906764943  1.8T Linux filesystem
```

認識はされていた。
続いて、fstabのUUIDは合っているか？

```shell
$ sudo blkid /dev/sda2
/dev/sda2: UUID="xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" TYPE="ext4" PARTUUID="

$ cat /etc/fstab
proc            /proc           proc    defaults          0       0
UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx /mnt/hdd1 ext4 nofail 0 0
```

合っていた。
ググると、修復することで、治るかもしれない。
[raspberry pi 外付けHDD　復旧　can't read superblock　ext4 file system](http://monteecristoo.hatenablog.com/entry/2018/04/20/115733)

```shell
$sudo mkfs ext4 -n /dev/sda
```
`y`一回押す。

```shell
$sudo fsck /dev/sda2 -p
```

自動で修復が始まり、終わるまで待つ。
終わったら、マウント実行して、dfでマウント状況確認。

```shell
$sudo mount -a
$df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       15345552 6129352   8560392  42% /
devtmpfs          470180       0    470180   0% /dev
tmpfs             474788       0    474788   0% /dev/shm
tmpfs             474788   12296    462492   3% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             474788       0    474788   0% /sys/fs/cgroup
/dev/mmcblk0p1     42136   21334     20803  51% /boot
tmpfs              94956       0     94956   0% /run/user/1000
```

マウントされてない。。。
一回リブート。

```shell
$sudo reboot
```

出てきた。

```shell
$ df
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/root        15345552   6129508    8560236  42% /
devtmpfs           470180         0     470180   0% /dev
tmpfs              474788         0     474788   0% /dev/shm
tmpfs              474788     12284     462504   3% /run
tmpfs                5120         4       5116   1% /run/lock
tmpfs              474788         0     474788   0% /sys/fs/cgroup
/dev/mmcblk0p1      42136     21334      20803  51% /boot
/dev/sda2      1921673484 779175288 1044812692  43% /mnt/hdd1
tmpfs               94956         0      94956   0% /run/user/1000
```