OmniAICreator/Qiita-1.07M huggingface dataset:
react-admin スニペット集

react-adminでたまによく使うパターンのスニペット集

## Translations (i18n)

ドキュメント
https://marmelab.com/react-admin/Translation.html

```ts:i18n/index.ts
import japaneseMessages from './ja'
import englishMessages from './en'

const messages = {
  ja: japaneseMessages,
  en: englishMessages
}

export default (locale: string) => messages[locale]
```

```i18n/ja.ts
import japaneseMessages from 'ra-language-japanese'

const domainMessages = {
  resources: {
    users: {
      name: 'ユーザー',
      fields: {
        name: '名前',
        createdAt: '登録時刻',
      },
      actions: {
        invalidate: '無効化'
      }
    }
  }
}

export default { ...japaneseMessages, ...domainMessages }
```

```tsx:App.ts
import i18nProvider from './i18n'
import { Admin } from 'react-admin'

const App = () => (
    <Admin i18nProvider={i18nProvider}>
        ...
    </Admin>
);
```

## REST API叩くカスタムボタン（ + カスタムi18n）

ドキュメント
https://marmelab.com/react-admin/Actions.html

```tsx:User/InvalidateButton.tsx
import React, { useCallback } from 'react'
import { compose } from 'recompose'
import {
  showNotification,
  UPDATE,
  withDataProvider,
  translate
} from 'react-admin'

const InvalidateButtonBase = ({
  dataProvider,
  dispatch,
  basePath,
  data,
  resource,
  translate
}) => {
  const handleClick = useCallback(() => {
    const updatedRecord = { ...data, invalidatedAt: new Date() }
    dataProvider(UPDATE, resource, { id: data.id, data: updatedRecord }).then(
      () => {
        dispatch(showNotification('Invalidated'))
        dispatch(push(`${basePath}/${data.id}/show`))
      }
    )
  }, [data])

  return (
    <Button variant="outlined" onClick={handleClick}>
      {translate('resources.users.actions.invalidate')}
    </Button>
  )
}

const InvalidateButton = compose(
  translate,
  withDataProvider
)(InvalidateButtonBase)
```

## ログイン画面のbackground変更

デフォルトだと [unsplash.com](https://unsplash.com/) というサイトの日替わり写真が表示される。
https://github.com/marmelab/react-admin/blob/432d7a26bbfe9424729a9da039a010ec00f2bcca/packages/ra-ui-materialui/src/auth/Login.js#L158

割とセクシー系の画像も表示されるので使いづらい案件が多い。
props.backgroundImageを上書きする。

```tsx:App.tsx
import { Admin, Login } from 'react-admin'

const CustomLogin = (props: any) => (
  <Login {...props} backgroundImage="/bg.jpg" />
)

const App = () => (
  <Admin
    dataProvider={dataProvider}
    loginPage={CustomLogin}
  >
    ...
  </Admin>
)
```

## 日時の表示

デフォルトのDateFieldだと日付のみ＆D/M/YYYYなフォーマットで表示される。
propsのshowTimeとlocalesで変更できる。
デフォで時刻ありのjaフォーマットにしたコンポーネントを用意しておくと便利。

```tsx:DateField.tsx
import * as React from 'react'
import { DateField } from 'react-admin'

const CustomDateField = ({ ...props }) => {
  return <DateField showTime={true} locales="ja" {...props} />
}
export default CustomDateField

```

## テーマの設定

ドキュメント
https://marmelab.com/react-admin/Theming.html#writing-a-custom-theme
jwilder/nginx-proxyで{ホスト名}/{パス}でコンテナにルーティングする方法

# 背景
別にどうでもいいという人はすっ飛ばして下さい。

とあるシステムの再構築をやっていた際に、統一された環境としてDockerを採用し
ローカルではdocker-compose、検証・本番ではAWS ECSに構築するということを行いました。
このシステムは、複数サービスに分割されているために、複数コンテナを立ち上げてそれぞれにルーティングしていますが、一部では下記のように/service_aにアクセスした場合にAのサービスへアクセスするといった作りになっていました。

```
ALB
├── a.hoge.com
│   └── Server A (source A)
├── b.hoge.com
│   └── Server B (source B)
└── c.hoge.com
    ├── Server C (source C)
    └── c.hoge.com/fuga
        └── Server C (source D)
```

要はSource CとDが同じサーバー上で動いているというわけです。
コンテナは分けたいなぁと思い下記のような構成する方針としました。

### AWS上

```
ALB
├── a.hoge.com
│   └── Container A (source A)
├── b.hoge.com
│   └── Container B (source B)
└── c.hoge.com
│   └── Container C (source C)
└── c.hoge.com/fuga
    └── Container D (source D)
```

ALBは簡単に設定ができます。
ローカルではALBは使えないので、代わりにjwilder/nginx-proxyを使っています。
jwilder/nginx-proxyはdocker-compose.yml上の各コンテナの環境設定部分にVIRTUAL_HOSTを書くと勝手にリバプロを設定してくれる
という便利なものです。
がしかし、nginx-proxでリバプロを上記のような設定を行う方法をググっても見当たらず…
そういうことができるようにしてくれ！とGit上でやりとりしているのがみつかっただけでした。
結果、Forkされたもので、VIRTUAL_HOSTとVIRTUAL_PATHを設定すればできるということを行っていましたが、それが本家には取り入れられていませんでした。
自前で全部書くしかないかと…と半ばあきらめてjwilder/nginx-proxyのコンフィグテンプレを呼んでいたら…
なんと、方法をみつけました。

## 方法
結論から言うと、VIRTUAL_HOSTで設定した名前のConfigを、とあるディレクトリに格納すると勝手にインクルードして設定を反映してくれます。

### docker-compose.yml
```
  nginx-proxy:
    image: jwilder/nginx-proxy
    privileged: true
    ports:
    - "80:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - ./docker/proxy/c.app.local:/etc/nginx/vhost.d/c.app.local
  app.a:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    environment:
    - VIRTUAL_HOST=a.app.local
    volumes:
    - ./src/a:/var/www
    depends_on:
    - mysql
  app.b:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    environment:
    - VIRTUAL_HOST=b.app.local
    volumes:
    - ./src/b:/var/www
    depends_on:
    - mysql
  app.c:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    environment:
    - VIRTUAL_HOST=c.app.local
    volumes:
    - ./src/c:/var/www
    depends_on:
    - mysql
  app.d:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    environment:
    - VIRTUAL_HOST=d.app.local
    volumes:
    - ./src/d:/var/www
    depends_on:
    - mysql
```

>./docker/proxy/c.app.local:/etc/nginx/vhost.d/c.app.local

ここでnginx-proxy上のvhost.dにc.app.localファイルをマウントします。

app.dの設定は、内部でupstreamの設定をしているために、記載しておいてください。
（コンテナ名でもいけると思うけど未検証）

### c.app.local
読み込ませたいホスト名をファイル名にします。
ちなみにlocation内に読み込ませる場合は、ホスト名_locationとすると内部にインクルードします。

```
location ^~ /fuga {

    proxy_pass http://d.app.local/;

    proxy_set_header Host $http_host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Scheme $scheme;
    client_max_body_size 0;
}
```

トレイリングスラッシュがあると、fugaのパスを無視してルーティングしてくれます。
ないと、http\://d.app.local/fugaというアクセスになります。

上記だけで、http\://c.app.local/fugaでアクセスした場合は、dのコンテナにルーティングされ
http\://c.app.local/fuga以外でアクセスした場合は、通常通りcのコンテナにルーティングします。

これで解決。
あーよかったよかった。
iOS 12.2のプッシュ用トークン取得タイミングに変化あり？

iOSのプッシュ通知はAppDelegateでトークンを取得するようにドキュメントにも書いてありますが、このトークンを取得（降ってくる？）タイミングがiOS12.2で変わったようです。

「・・・ようです」というのは、あくまでもデバッガでブレークポイントを貼っての検証なので、リリースノートなどでアップルのドキュメントを確認したわけではありません。というかみつからない。

どう変わったかというと、

# iOS12.1まで
・普通のプッシュのアプリ：起動時にtokenがくる
・PushKitのプッシュアプリ：起動時にtokenがくる


# iOS12.2以降
・普通のプッシュのアプリ：起動時にtokenがくる
・PushKitのプッシュアプリ：一度レジストするとアプリ起動してもtokenがこない。（あくまでも短時間での動作確認なので、いつdelegateが呼ばれるかは不明です）

PushKitはいわゆるVoIPをつかった電話アプリのためで、アプリの特性から着信待ちの状態でtokenが変わっては困るとか、そういう理由なのかなと想像はしますが、本当のところは不明です。

という感じです。
情報お持ちの方いたらぜひコメントください。
phpのバージョン更新で、apacheが動かない場合の対処法

#状況説明
#####開発環境
* Server:Apache/2.4.25 (Unix)
* OS:mac 10.12.16
* php:5.6

#####何かあった
* 昨日MacデフォルトのPHPバージョンを5.6から7.2に更新しました。更新した直後はローカルのzendframeworkアプリは普通に動いています。
* 今日一回apacheをrestartしたら、localhostが開かなくなった。どうやらapacheが動けなくなったらしい。
* 問題特定するため、ターミナルにhttpd -tを入力したら、「Syntax OK」しか返ってこない。
* 他には　sudo apachectl configtest　も試したけど、「Connection refused」が返って、原因の特定に至っていませんでした。

#問題の在り処
その後も色々試したあと、最終的に問題点を掴みました。
#####PHPの更新によって、apacheの設定も更新しなければならない
何かアホそうな結論に至ってしまいました（汗）。
#対処法
* 原因として、apacheでphpのプログラムを動かしたい場合、引用が必要です
* MACでは予めapacheが搭載され、デフォルト的にはphp5を指定しています：

```httpd.conf
LoadModule php5_module libexec/apache2/libphp5.so
```
* ただphpの更新で、引用も新しいバージョンに変えないと、apacheが動けなくなりそうです。
* 解決策はシンプルに、新しいバージョンの引用を付き加えれば良い

```httpd.conf
#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php7_module 「ここは自分のlibphp7.soの位置を指定」
```
* libphp7.soの位置がわからない場合は、ターミナルに「locate libphp7.so」を打ってば分かるはずです。
* httpd.confの位置は/etc/apache2/にありますが、システムに違いによって異なる可能があります、また、homebrewでインストールされたapacheでは別の場所にいますので、httpd -Vで確認できます。
Windows Server で .NET 3.5 をインストールする

power shell を管理者として起動して、以下を投入。

```powershell

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:d:\sources\sxs
```

「役割と機能のの追加」で「ソースファイルが見つかりませんでした」エラーが出る場合に。

参考
https://docs.microsoft.com/ja-jp/previous-versions/windows/server/hh831809(v=ws.11)#BKMK_arfw
SharedPreferencesを扱う

###基本
書き込む

```kotlin
val shardPreferences = this.getPreferences(Context.MODE_PRIVATE)
val shardPrefEditor = shardPreferences.edit()
shardPrefEditor.putString("data", data)
shardPrefEditor.apply()
```

読み取る

```kotlin
val shardPreferences = this.getPreferences(Context.MODE_PRIVATE)
var data = shardPreferences.getString("data", "[]")
```

###どのActivityからでも閲覧できるようにする
```kotlin
val shardPreferences = this.getSharedPreferences("KEY",Context.MODE_PRIVATE)
val shardPrefEditor = shardPreferences.edit()
shardPrefEditor.putString("data", data)
shardPrefEditor.apply()
```

###JSONArrayとして保存
```kotlin
//arrayList : ArrayList<String>
val jsonArray = JSONArray(arrayList)
shardPrefEditor.putString("data", jsonArray.toString())
```

###JSONArrayをArrayList<String>として読み取る
```kotlin
private fun loadArrayList(data: String): ArrayList<String> {

val shardPreferences = getSharedPreferences("KEY",Context.MODE_PRIVATE)
val jsonArray = JSONArray(shardPreferences.getString(data, "[]"))
val arrayList : ArrayList<String> = ArrayList()

for (i in 0 until jsonArray.length()) {
    arrayList.add(jsonArray.get(i) as String)
}
        
return arrayList
}
RFC 8142 をベクトルストリームのワイヤフォーマットに使う理由

[こちらのツイート](https://twitter.com/_hfu_/status/14646584094)に関連して、最近は GeoJSON Feature の NDJSON もやめて、シンプルに [RFC 8142](https://tools.ietf.org/html/rfc8142) をワイヤフォーマットとして使おうとしている理由を紹介します。

ここで、ワイヤフォーマットという言葉は、プロセス間のパイプを通すときのシリアライゼーションフォーマットという程度の意味で使っています。

# RFC 8142 を使う理由
## Node で RFC 8142 を書き出せる方法を暗記できた
RFC 8142 を書き出す場合は、record separator (RS) を最初に出す必要があります。

Node では、これは文字列の最初に `\x1e` と書けば OK です。 `output` ストリームに RFC 8142 で一地物 `f` を書き出すためには、このように書けば良いです。

```javascript
output.write(`\x1e${JSON.stringify(f)}\n`)
```

## OpenStreetMap には改行を含むプロパティがある
OpenStreetMap には、改行を含むプロパティがあります。例えば、お店 POI の開店時間・閉店時間が詳しく書かれているような場合に、そのテキストに改行が含まれていることがあります。とりわけ、中央ヨーロッパにそのようなデータがあるようです。

NDJSON だと、このようなデータをエレガントに処理することは簡単ではありませんでした。RFC 8142 だと、GeoJSON Feature の中に改行が入っていても、そのままの形でシリアライズすることができます。

## 有力なツールが RFC 8142 に対応している
Tippecanoe と Osmium Tool は、 RFC 8142 に対応しています。

とりわけ、`osmium export`が RFC 8142 に明示的に対応していることが、私が RFC 8142 を常用してみようか、と思ったきっかけでした。

Tippecanoe はどちらかというと NDJSON を使うのが一番素直な感じですが、RFC 8142 も区別なく扱ってくれる感じです。

## ブランドを使える

あなたの舞台がウェブを含むインターネットであれば、それがジオであろうがウェブであろうが、IETF は最強の標準化集団であると主張できるでしょう。

# RFC 8142 で注意を要する点

## ジオメトリが長すぎる場合に ENOBUF は出る
これは、多分 RFC 8142 固有の問題ではないかもしれませんが、座標をテキストで扱うということから、RFC 8142 では出やすい問題かもしれません。

非常に巨大・複雑なポリゴンをパイプに通そうとするプログラムを書いた時に、 ENOBUF という私にとっては珍しいエラーが出たことがありました。

これは、多分パイプのために用意しているバッファを、RFC 8142 の一レコードが使い切ったことで出たのだと思います。

# 拡張子、`.rfc8142`を使いませんか
RFC 8142 はワイヤフォーマットとして使うのが適切だと思っていますが、現実には上述のような理由で、ディスクに一旦置かなければならないときがあります。その場合には、拡張子に迷うことになります。

私は `.rfc8142` という拡張子を使っています
フレームワーク「GIN」を使ってみた（スタイルシートやテンプレートの呼び出し方）


###GETやスタイルシート、テンプレートの呼び出し方の備忘録


#フォルダ構成

```
.
├── main.go
├── asset
│   └── css
│       └── style.css
├── templates
│   ├── hello.html
│   └── layout.html
└── routes
    ├── routes.go
    └── api.go
```


#MAIN

```go:main.go:
package main

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

func main() {
	router := gin.Default()

	// 事前にテンプレートをロード 相対パス
	// router.LoadHTMLGlob("templates/*/**") などもいけるらしい
	router.LoadHTMLGlob("templates/*.html")

	// 静的ファイルのパスを指定
	router.Static("/assets", "./assets")

	// ハンドラの指定
	router.GET("/hello", routes.Hello)

	// グルーピング
	user := router.Group("/api")
	{
		user.GET("/hello", routes.HelloJson)
	}

	router.NoRoute(routes.NoRoute) // どのルーティングにも当てはまらなかった場合に処理
	router.Run(":8080")
}
```

#ハンドラー

```go:routes/routes.go
package routes

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

func Hello(c *gin.Context) {
	c.HTML(http.StatusOK, "layout.html", gin.H{
		"name": "Taro",
	})
}

func NoRoute(c *gin.Context) {
	// helloに飛ばす（ログインしていない場合に、ログイン画面に飛ばす
	c.Redirect(http.StatusMovedPermanently, "/hello")
}
```


```go:routes/api.go
package routes

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

func HelloJson(c *gin.Context) {
	c.JSON(200, gin.H{
		"name": "taro",
	})
}
```

#テンプレートファイル

```html:templates/layouts.html
<html>
  <head>
    <link rel="stylesheet" href="assets/css/style.css">
    <title>Sample</title>
  </head>
  <body>
    <!-- Render the current template here -->
    {{template "content" .}}
  </body>
</html>
```


```html:templates/hello.html
{{define "content"}}
<h2>Hello {{.name}}!</h2>
{{end}}
```

#スタイルシート

```css:assets/css/style.css
h2 {
    color: red;
}
```

#実行結果

http://localhost:8080/hello

![スクリーンショット 2019-03-27 12.08.17.png](https://qiita-image-store.s3.amazonaws.com/0/125499/8749cb2c-1ffe-0dfb-7dee-646c23806d7e.png)


http://localhost:80080/api/hello

![スクリーンショット 2019-03-27 12.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/125499/9112b2db-61d3-3ae9-e28d-e2295245e2ee.png)
iOS  uiviewcontroller 及び App のライフサイクル 公式説明

#App 
https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

![high_level_flow_2x.png](https://qiita-image-store.s3.amazonaws.com/0/125746/eb0f0c3a-4f7f-abf6-f25a-5cf28e5ed7bf.png)

- application:willFinishLaunchingWithOptions:—This method is your app’s first chance to execute code at launch time.
- application:didFinishLaunchingWithOptions:—This method allows you to perform any final initialization before your app is displayed to the user.
- applicationDidBecomeActive:—Lets your app know that it is about to become the foreground app. Use this method for any last minute preparation.
- applicationWillResignActive:—Lets you know that your app is transitioning away from being the foreground app. Use this method to put your app into a quiescent state.
- applicationDidEnterBackground:—Lets you know that your app is now running in the background and may be suspended at any time.
- applicationWillEnterForeground:—Lets you know that your app is moving out of the background and back into the foreground, but that it is not yet active.

- applicationWillTerminate:—Lets you know that your app is being terminated. This method is not called if your app is suspended.

#uiviewcontroller



![UIViewController_Class_Reference_2x_ddcaa00c-87d8-4c85-961e-ccfb9fa4aac2.png](https://qiita-image-store.s3.amazonaws.com/0/125746/8cf83a8f-99b6-970c-31cf-a642e25834ac.png)

init(coder:)
(void)loadView
(void)viewDidLoad
 This method is called only once in the lifetime of a view controller, so you use it for things that need to happen only once.
(void)viewWillAppear
####アプリはバックグラウンドからフォグランプへ戻るときは実行しない、applicationWillEnterForegroundを利用ください。
 This event is called every time the view appears and so, there is no need to add code here, which should be executed just one time. 
(void)viewDidAppear
(void)didReceiveMemoryWarning
(void)viewWillDisappear
(void)viewDidDisappear
https://developer.apple.com/documentation/uikit/uiviewcontroller
git checkoutのたびにnode_modulesを再構築しなくて良くする

## 動機

node_modules は .git 管理外なので git のブランチ移動するたびに再構築しないと行けないが、yarn install に時間がかかりすぎる。

## 解決方法

git hook の post-checkout で node_modules をキャッシュしたりキャッシュから復元したりする。

hooks を設定したいプロジェクトの `.git/hooks` ディレクトリに `post-checkout` ファイルを作成する(無いなら勝手に作ってよい)。

```bash:post-checkout
#!/usr/bin/env bash

echo "[cache-node_modules] START"

BRANCH_FROM=`git reflog show -q | head -n1 | awk '$3 == "checkout:" && $4 == "moving" {print $6}'`
BRANCH_TO=`git reflog show -q | head -n1 | awk '$3 == "checkout:" && $4 == "moving" {print $8}'`
BRANCH_FROM_CACHE_NAME=".node_modules_${BRANCH_FROM}"
BRANCH_TO_CACHE_NAME=".node_modules_${BRANCH_TO}"

if [ -d "node_modules" ]; then
	echo "[cache-node_modules] Cache node_modules to ${BRANCH_FROM_CACHE_NAME}"
	mv node_modules ${BRANCH_FROM_CACHE_NAME}
fi

if [ -d "${BRANCH_TO_CACHE_NAME}" ]; then
	echo "[cache-node_modules] Restore node_modules from cache."
	mv ${BRANCH_TO_CACHE_NAME} node_modules
fi

echo "[cache-node_modules] Refresh node_modules"
yarn

echo "[cache-node_modules] DONE"
```

キャッシュは `.node_modules_ブランチ名` に保存されるので、`~/.gitignore` に `.node_modules*` を追加しておく

これで git checkout するたびに checkout 前の node_modules をキャッシュし、checkout 後の node_modules のキャッシュを復元してくれる。
復元後に yarn install をすることで cache が使えているか確認もしている。

移動前/移動後のブランチ名取ってくるところが怪しい動きするかも知れないです。
raspi can module 第参の挑戦

#1. canbus module
raspberry pi で can を接続するばあい、
canbus module は arduino shield を流用する方法があります。
aliexpress などで、 MCP2515 CAN Bus Module TJA1050 .. 検索できます。
#2. 問題点
arduino shield は多くが信号レベル5Vで接続することになりますが、raspberry pi のP1端子の信号レベルは3.3Vでなければなりません。
raspberry pi と MCP2515 CAN Bus Moduleとの接続の記事をさがすと、
TJA1050 のVCC端子を持ち上げて、5Vを接続
MCP2515 のVCC端子には 3.3vを接続と苦労しています。
#3. 正解なのか
今回は5Vのみで動作するTJA1050の代わりに、機能的に同等な3.3V動作可能なMAX3051を利用します。 
![phy.png](https://qiita-image-store.s3.amazonaws.com/0/295124/d7bab819-9dae-82bc-c121-459c616cbc89.png)
U1 TJA0150 を MAX3051 に半ゴテで交換します。
![replace.png](https://qiita-image-store.s3.amazonaws.com/0/295124/95b96565-ab07-64c1-3f29-bc794051112c.png)
#4. 動作例
##4.1接続表
![P1-J4.png](https://qiita-image-store.s3.amazonaws.com/0/295124/b8beb2e4-1e6c-84fb-c3fa-8761e7d013ad.png)

##4.2 /boot/config.txt を編集
以下を追加
`
dtparam=spi=on
dtoverlay=spi-bcm2835-overlay
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=12
`
interrupt=12 はGPIO12 を利用する場合です。

##4.3 接続
`
pi@pi-desktop:~$ dmesg|grep spi
[    4.334544] mcp251x spi0.0 can0: MCP2515 successfully initialized.
pi@pi-desktop:~$ sudo ip link set can0 type can bitrate 500000
pi@pi-desktop:~$ sudo ifconfig can0 up
pi@pi-desktop:~$ candump -cae -t z can0,0:0,#FFFFFFFF
 (000.000000)  can0  7F0   [3]  12 03 04                  '...'
 (015.631918)  can0  7F0   [5]  12 34 56 78 90            '.4Vx.'
pi@pi-desktop:~$ 
`

以上です。
WSLのPS1にWSLと明記する

小ネタです．

最近環境をMacからWinにして，WSLを普段使うことにしました．しかしローカとssh先のプロンプトを見間違えることがしばしばなので，WSL側プロンプトに`(WSL)`と書かせることにしました．

------

やることは単純で，WSL側の`~/.bashrc`内で`PS1`環境変数(`user@host`の色や表示をコントロールする変数)をいじるだけです．

参考はこのあたり:

* [BashでPromptの色を変更する方法](https://qiita.com/wildeagle/items/5da17e007e2c284dc5dd)
* [【Bash】ターミナルのプロンプトのカスタマイズ方法まとめ](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)
* [Ubuntuのデフォルト設定から学ぶbashプロンプト](https://qiita.com/HMMNRST/items/d8fe7b3c528f447d68a6)

私は「ユーザ名より前に，黄色・太字で(WSL)と表示させる」ことにしました．WSL上で`~/.bashrc`をお好きなエディタで開き，末尾に

```bash
# add (WSL) on PS1
PS1="\[\e[1;33m\](WSL) \[\e[0m\]$PS1"
```

と書きます．詳しい説明は↑の参考リンクにおまかせします．

書き終わったら`source ~/.bashrc`で変更を有効にできるはずです．

↓こんな感じになりました．

<img width="345" alt="201903281839.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/99470/514b0c4f-360d-5dc2-d3b4-c40769ccad7f.png">
新しくaliasを定義する際に「-bash: alias: ○○: not found」と出てしまう場合の解決法

新しくaliasを定義しようとしたら、最初「-bash: alias: ○○: not found 」というエラーが出て
登録できませんでした。
その解決方法についての覚書きです。

##エラー時の実行内容と結果
新規aliasの定義は「alias 名前=実行内容」（実行内容はシングルクォーテーションで囲う）でできるということなので、

```
$ alias lsa = 'ls -a'
```

と実行したところ、

```
-bash: alias: lsa: not found
-bash: alias: =: not found
-bash: alias: ls -a: not found
```
とエラーが出てうまく登録できませんでした。

##解決策
「名前」と「=」、「=」と「実行内容」の間の空白を消して、

```
$ alias lsa='ls -a'
```
としたところ、無事終了。

aliasコマンドをしたところ、無事登録されていました。

```
$ alias

alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias lsa='ls -a'
```

##ポイント
新規aliasを定義する際は「alias 名前=実行内容」の「名前」と「=」、「=」と「実行内容」の間に空白を入れないようにすること

##参考
[Linux基本コマンドTips（97）：【 alias 】コマンド／【 unalias 】コマンド――コマンドの別名（エイリアス）を登録する／削除する](https://www.atmarkit.co.jp/ait/articles/1703/24/news012.html)
Elixir~モジュールの定義~

#ここまでのあらまし

北九州に移住後、しばらくわたしのElixir開発環境が壊れていて、ふたたび基本的なところから再スタートしています。

#モジュールの定義

```elixir
defmodule Func do

#この中に関数を書く
end
```

これでモジュールが定義できます。

#関数定義

```elixir
def func(a, b)
  a + b
end
```

これでaとbの和を求めるもっとも単純な関数が定義できました。

これをiexに直接打ち込みます。

```elixir
iex(1)> defmodule Func do
...(1)>   def func(a, b) do
...(1)>     a + b
...(1)>   end
...(1)> end
```

```elixir
iex(2)> Func.func 1,2
3
iex(3)> Func.func(2,3)
5

```

このようになります。

#編集後記
すごく初歩的な部分ですが、defmodule~~~という書き方を他の方のドキュメントの写経などですごくよく見ていたので、そのあらましが分かった点はとてもよいと思います。

うまずたゆまず、頑張ります。
Kento Mizuno
JavaScriptでクリップボードにelementのvalueをコピーする

## やること

- ボタンをクリックしたときにelementのvalueをコピーする
- jQueryは使わない

## コード

textareaを用意して、文字を入れて、全選択して、コピーする

```javascript:JavaScript
  function copyToClipboard(element) {
    var text = document.createElement("textarea");
    text.classList.add('hidden'); 
    text.value = element.value;
    document.body.appendChild(text);
    text.select();
    document.execCommand("copy");
    text.remove();
    alert('Copied!!');
  }
```

```css:CSS
.hidden {
    display: none;
}
```

```html:HTML
<!-- idを引数にしたら、elementが変数に入ってる状態になるんだね、知らなかった -->
<button name="button" type="submit" onclick="copyToClipboard(target)">コピーする</button>
<input type="hidden" id="target" value="aaaaaaaaaa">
```
「選択にはメイン型が含まれていません」

Java学習中、 eclipseを使用しています。
以下のような、コードを実行すると、「選択にはメイン型が含まれていません」と表示されてしまいます。
メイン型はコードの実行には必須ということなのでしょうか。
スクールのテキストの通りのコードなのですが、どのようにすれば実行ができるでしょうか。
よろしくお願い申し上げます。






package la.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html:charset=UTF-8");
        PrintWriter out = response.getWriter();
		out.println("<html><head><title>HelloServlet</title></head><body>");
		out.println("<h1>ようこそ！HelloServletへ</h1>");
		out.println("</body></html>");
	}

}
Node.jsでtar.xzを解凍する

# 概要

tar.xzをnode.jsで解凍する必要が発生した。
日本語で検索しても情報が出なかったので書く。

# 解決方法

decompressのプラグインとしてdecompress-tarxzを使えば良い

# 必要なパッケージ

* decompress
* decompress-tarxz 

以下のコマンドでインストール

```shell
$ npm install --save decompress decompress-tarxz
```

# ソース

decompressをrequireして実行すると解凍可能。
解凍後に処理を行いたい場合にはthenの中で実行するしかない。(copyFileに対するcopySyncのような関数はない。)
その際第三引数にてpluginという配列を指定し、その要素としてdecompress-tarxzをrequireした結果を指定。

```javascript
const decompress = require('decompress');
const decompressTarxz = require('decompress-tarxz');

var tarballPath = '/path/to/hoge.tar.xz';
var outputPath  = '/path/to/output';

decompress(
	tarballPath, //第一引数にtar.xzのパスを記入
	outputPath, //第二引数に出力先のパスを記入
	{ //第三引数にオプションを指定。今回はpluginsにてdecompressTarxz()を指定。
		plugins:
		[
			decompressTarxz()
		]
	}
).then(
	function()
	{
		console.log('解凍後の処理');
	}
);
```

# 参考

https://www.npmjs.com/package/decompress
https://www.npmjs.com/package/decompress-tarxz
Elmで日付を扱うならとりあえずこれ、なパッケージたち。

# TL;DR
* justinmimbs さん is つよい。
* 安心と安定のNoRedInk社。

# 時間データを扱う系のパッケージたち

## elm/time

https://package.elm-lang.org/packages/elm/time/latest

* 標準パッケージ（草）
* Zone（タイムゾーン？）とPosixから日付とかを取得できたり、1970年1月1日0:00からのミリ秒に変換できたりする。
* あと月のカスタム型（列挙型）も提供する。 血迷って自分で定義してはならない。（した。）
* これだけだと明らかに足りないが、自分で実装し始める前にとりあえずelm-packagesを漁ろう。

## justinmimbs/time-extra

https://package.elm-lang.org/packages/justinmimbs/time-extra/latest

* [elm/time](https://package.elm-lang.org/packages/elm/time/latest)を単純に拡張する。（直訳）
* 日付を構造化したPartsという概念を導入して日付の計算をよしなにする。
* コード内で特定の日付からPosixを生成するには必須。
* なぜ標準に含まれていないのか。

## waratuman/time-extra

https://package.elm-lang.org/packages/waratuman/time-extra/latest

* Posixのまま日時の操作ができる。
* モジュールの名前が被っているのがつらみ。
* おとなしく上の[justinmimbs/time-extra](https://package.elm-lang.org/packages/justinmimbs/time-extra/latest)使おうぜ。

## justinmimbs/date

https://package.elm-lang.org/packages/justinmimbs/date/latest

* 時間情報を無視して年月日をよしなにするにはグッド👍
* なぜか[elm-packages](https://package.elm-lang.org/packages)で「date」と検索しても上の方に出てこないので、知らないと泣く。（泣いた）
* DataPicker系のパッケージ（後述）は基本これに依存しているので、DataPickerを自分で書きたくないなら最早使わざるを得ない。

# DatePickerなUIパッケージたち


## CurrySoftware/elm-datepicker

https://package.elm-lang.org/packages/CurrySoftware/elm-datepicker/latest

デモ ： https://ellie-app.com/3t4W6N4Trm3a1

* 今は亡き elm-community/elm-datepicker のElm0.19移植なので実質標準。
* ただ`Html.map`が必要だったり、つらみな部分もある。

## abradley2/elm-datepicker

https://package.elm-lang.org/packages/abradley2/elm-datepicker/latest

デモ : https://abradley2.github.io/elm-datepicker/

* デモがしゃれおつ。
* 自由度は CurrySoftware/elm-datepicker より低い。
* デザインもデモのまんま使いたいならいいかも。

## NoRedInk/datetimepicker-legacy

https://package.elm-lang.org/packages/NoRedInk/datetimepicker-legacy/latest/

デモ : https://abadi199.github.io/datetimepicker

* 強い（確信）
* legacyとか付いてるけど、名前で騙されてはいけない。
* 安心と安定のNoRedInk社。
* 必要とあらば Time Picker まで付けられるので言うことがない。
* [elm-sortable-table](https://package.elm-lang.org/packages/NoRedInk/elm-sortable-table/latest)とかもあるし、とりあえずNoRedInk社の提供するパッケージは把握しておきたい感ある。

## PanagiotisGeorgiadis/elm-datepicker

https://package.elm-lang.org/packages/PanagiotisGeorgiadis/elm-datepicker/latest/

* 強そうな雰囲気は醸し出してるけど、デモのリンクが全部[これ](https://ellie-app.com/new)で草生えた。
* デモが草なので試してすら無い。だれか感想を教えてほしい。

# おわりに

時間を管理するのは何でもつらみが深い気がしますねー。
初心者Elmersの車輪の再発明を防げたなら幸いです。

あ、つよElmerの方々は他の有用なパッケージをぜひ教えてください！（懇願）
Linuxのデバイスファイルを固定する

USBシリアルコンバータをたくさん挿してマイコンのデバッグをすることありますよね。

挿す順番でデバイスファイルの名前が変わってしまい面倒ですが、udevのコンフィグファイルを書くことでシンボリックリンクを作成することが出来ます。これによってデバイスファイルを固定した形で作業することが出来ます。

## デバイスのID取得

デバイスを挿抜したときのログをdmesgで確認します。

1本目

```console
[  322.612636] usb 1-2: new full-speed USB device number 12 using xhci_hcd
[  322.768178] usb 1-2: New USB device found, idVendor=0403, idProduct=6001, bcdDevice= 4.00
[  322.768197] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  322.768209] usb 1-2: Product: USB HS SERIAL CONVERTER
[  322.768219] usb 1-2: Manufacturer: FTDI
[  322.768228] usb 1-2: SerialNumber: FT1W8XXX
[  322.782407] ftdi_sio 1-2:1.0: FTDI USB Serial Device converter detected
[  322.782530] usb 1-2: Detected FT232BM
[  322.782971] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0
```

2本目

```console
[  406.788163] usb 1-1.3: new full-speed USB device number 14 using xhci_hcd
[  406.900555] usb 1-1.3: New USB device found, idVendor=0403, idProduct=6001, bcdDevice= 6.00
[  406.900571] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  406.900583] usb 1-1.3: Product: TTL232R-3V3
[  406.900594] usb 1-1.3: Manufacturer: FTDI
[  406.900603] usb 1-1.3: SerialNumber: FTA3BXXX
[  406.915978] ftdi_sio 1-1.3:1.0: FTDI USB Serial Device converter detected
[  406.916379] usb 1-1.3: Detected FT232RL
[  406.918202] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB1
```

どちらもFTDIのUSBシリアルコンバータですね。
以下の行を確認してデバイスのIDを取得します。

```console
[  406.900555] usb 1-1.3: New USB device found, idVendor=0403, idProduct=6001, bcdDevice= 6.00
```

```console
[  406.900603] usb 1-1.3: SerialNumber: FTA3BXXX
```

ベンダID、製品ID、シリアル番号をメモしましょう。

* idVendor: 0403
* idProduct: 6001
* SerialNumber: FTA3BXXX


## udev ruleの記述

udevのルールを記述して適当な名前を割り当てます。

```/etc/udev/rules.d10-local.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FT1W8XXX", SYMLINK+="printer"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTA3BXXX", SYMLINK+="stm_console"
```

書き込んだあとにはudevに知らせる必要があります。

```console
$ sudo udevadm trigger
```

ケーブルを挿し直すとシンボリックリンクが作成されていることが分かります。

```console
$ ls -l /dev/label_printer
lrwxrwxrwx 1 root root 7 Mar 28 17:04 /dev/printer -> ttyUSB0
$ ls -l /dev/stm_console
lrwxrwxrwx 1 root root 7 Mar 28 17:04 /dev/stm_console -> ttyUSB1
```

## 環境
```
Linux hostname 4.18.0-16-generic #17~18.04.1-Ubuntu SMP Tue Feb 12 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```
brewのopencvを使ってカスケード分類器を作る際のメモ

# 概要
カスケード分類器を作ろうと思ったら、``opencv_createsamples``と``opencv_tratraincascade``がどこにも見当たらなかったので、経緯と注意点を説明する。

# brewでインストール
Macの場合brewとpipで*opencv*がインストールできるが、brewでインストールした場合のみカスケード分類器を作るのに必要なモジュールもインストールされる。インストール時に私が引っかかったのが**opencvのバージョン**である。今現在(2019/03/28)のbrewでインストールされるデフォルトのバージョンが**4.0.1**である。結論から言うと、**バージョンが4.0.1のopencvにはカスケード分類器を作るのに必要な``opencv_createsamples``と``opencv_tratraincascade``が元から付属されていないのである。**よって``opencv_createsamples -info posifile -vec cascade.vec -num 100``のようにコマンドを打ってもNot Foundだけが返ってくる。

# 解決方法
[Homebrewのopencvのページ][list1]に行くと、バージョンによって名前が異なりそれぞれ別にインストールできるので、それで対応するしかない。私は``brew install opencv@3``としてインストールを行なった結果、バージョン3.4.5のものをインストールでき上記の必要な2つのモジュールもインストールされた。(もちろん実行もできた)

# ※追記　opencv_createsamplesがうまくいかないときは
私の場合は-infoで指定する画像パスに問題があったためにエラーが起きた。(-215 Assertion errorとかなんとか。roiがおかしいというようなエラーが発生した)
以下のようなファイルを-infoで指定した。

```
./img/sample-img_001.jpg 1 0 0 50 50
./img/sample-img_002.jpg 2 40 0 100 80 100 200 50 50
./img/sample-img_003.jpg 1 20 30 40 50
...
```
上のように、パス名にアンダーバー( _ )やハイフン( - )を用いると読み込めずにエラーを吐いてしまう。
なるべく使わないようにファイル名やパス名を考えよう。

# まとめ
カスケード分類器を作るならopencv *ver4.0.1* **以外** のものを使おう

# おまけ
ポジ画像120枚、ネガ画像40枚では**圧倒的データ不足**に陥るので気をつけよう

[list1]:https://formulae.brew.sh/formula/opencv
手作業でいいからなるべく簡単にMySQLからBigQueryにデータを取り込みたい

- ちょっとBigQuery試してみたい
- データはMySQLにある
- 自動化とかは後々
- BigQueryは分割テーブルがいい
- ひとまず過去数日分のデータを登録してみたい

# データセットを作る
- [コンソール](https://console.cloud.google.com/bigquery)から、ぽちぽち作る
  - ここでは `test_load_dataset` を作成したとして以下へ

# テーブルを作成する
- ローカルにスキーマ定義JSONを作る
  - 例として `table_action_logs.json` の定義は以下

```json
[
  {
    "name": "ip", 
    "type": "STRING"
  }, 
  {
    "name": "path", 
    "type": "STRING"
  }, 
  {
    "name": "account_type", 
    "type": "STRING"
  }, 
  {
    "name": "account_id", 
    "type": "STRING"
  }, 
  {
    "name": "action", 
    "type": "STRING"
  }, 
  {
    "name": "detail", 
    "type": "STRING"
  },
  {
    "name": "created", 
    "type": "DATETIME"
  }
]

```

- 参考
  - [https://cloud.google.com/bigquery/docs/schemas?hl=ja](https://cloud.google.com/bigquery/docs/schemas?hl=ja)
- CloudShell を起動してドラッグ&ドロップで転送する
  - 以下の赤枠のボタンで画面下に起動するので、そこにドロップすると転送できる
![スクリーンショット 2019-03-28 15.27.06.png](https://qiita-image-store.s3.amazonaws.com/0/92538/d83bfdaf-a068-f6bf-c332-ff67f324e3dc.png)
- 以下のコマンドを CloudShell で実行

```
bq mk --time_partitioning_type=DAY test_load_dataset.action_logs table_action_logs.json

bq mk --time_partitioning_type=DAY [データセット名].[作成したいテーブル名] [スキーマ定義JSON]
```

- ※ちなみに作成に成功してもブラウザを読み込み直さないと表示されなかった

# データをCSVで用意する
- phpMyAdminで、定義と同じ形になるようにクエリを投げて、CSVでエクスポートする
  - もちろんCSVができればいいだけなので、phpMyAdminを使わないといけないわけではないです
  - ※文字コードは `UTF-8`
  - ※BigQuery側は日付分割のテーブルなので、1日分の指定をWHERE句に入れる
  - 例として、以下は `action_logs` テーブルから 2019/3/27 分のデータだけを取得したクエリ

```sql
SELECT
  ip, path, account_type, account_id, action, detail, created
FROM
  `action_logs`
WHERE
  created >= '2019-03-27 00:00:00'
AND 
  created < '2019-03-28 00:00:00'
```

- クエリ実行した後、画面の下の方にある エクスポート をクリック
- フォーマットを CSV にすれば、あとはデフォルトのままで大丈夫そうです
- 参考
  - https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv?hl=ja
- 出力したCSVを Google Cloud Storage にアップロードする
  - ここでは例として、 `bigquery_load_data_koreeda` というバケットがあり、 `test_data` というフォルダがあったとして、
  - そこに `action_logs_20190327.csv` をいうファイルをアップロードしたとします
- ここまででデータの用意完了

# BigQueryにデータをロードする
- 以下のコマンドをCloudShellで実行

```
bq load test_load_dataset.action_logs\$20190327 gs://bigquery_load_data_koreeda/test_data/action_logs_20190327.csv table_action_logs.json

bq load [データセット名].[テーブル名]\$[データを登録したい日付] gs://バケット名/フォルダ名/ファイル名 スキーマ定義JSON
```

# データの確認
- 以下のクエリをBigQueryのクエリエディタで実行する
  - ※とりあえず `SELECT *` しないように ip, created を取得してみて確認

```sql
SELECT 
  ip, created
FROM 
  `ttr-bigquery.test_load_dataset.action_logs` 
WHERE 
  _PARTITIONTIME = TIMESTAMP("2019-03-27") 
LIMIT 1000
```

- データが取得できればOK
- 登録したい日数の分、データCSVの作成〜BigQueryへのデータロードまでを手作業で繰り返す
- すごい手作業だけど、結構わかりやすいのではって思ってる
VagrantにSSH出来ず default: SSH auth method: private keyでtime outする

##vagarnt up が default: SSH auth method: private key でtimeoutしてしまい起動できませんでした。

```
Mac mini (Late 2014)
OS X (10.11.6)
Vagrant (1.8.7)
VirtualBox (5.0.10)
```

```vagrant ssh```もtime outして接続できない為、調べるとホストOSから通信自体がとおらない状態でした。。

```
HONDANAO-no-Mac-mini:vagrant name$ ping [ip]
PING [ip] ( [ip]): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
```

##解決した方法

左から三番目のネットワーク共有マーク?を選択すると、```Connect Network Adapter1```のcheckが外れてしまっていました。。

![スクリーンショット 2016-11-30 14.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/15703/518f47f9-01b0-27e9-51cb-22659c327fd3.png)

こんな初歩的な内容ですが、なかなか解決できませんでした。。
Storybook 環境での Cypress の使い方

Storybook 環境だと、たぶん`cy.get(...)`とかでセレクタを取得しようとしても見つからないと思います

例えば Cypress を使って、以下の v-chip 要素の name という中身が正しいかアサーションしたいとき

```html
<v-chip
  class="white--text font-weight-bold"
  disabled
  color="light-green"
  data-test="name"
  >{{ name }}</v-chip
>
```

Storybook を使っていなければ、Cypress から以下のようにして普通に取ることができる

```js
cy.get('[data-test="name"]').should('have.text', 'サンプル')
```

しかし、Storybook 環境だと`[data-test="name"]`が見つからず、以下のようなエラーになるはず

```
CypressError: Timed out retrying: Expected to find element: '[data-test="name"]', but never found it.
```

[こちら](https://gist.github.com/xogeny/d9edb2fa0dc84d20d12a3770595f6dd2)のコードのように iframe を取ってきてから、対象のセレクタを find する 関数を用意すれば HTML 要素の中身が取得できる

```js
cy.get('#storybook-preview-iframe').then($iframe => {
  const doc = $iframe.contents()
  iget(doc, '[data-test="name"]').should('have.text', 'サンプル')
})

function iget(doc, selector) {
  return cy.wrap(doc.find(selector))
}
```

上記で問題は解決はしているのだが、、
でももうちょっと汎用的に使えるようにするのであれば、以下の方法が良いのではないかなと思います

```js:cypress/support/commands.js
Cypress.Commands.add('iget', selector =>
  cy
    .get('#storybook-preview-iframe')
    .then(iframe => cy.wrap(iframe.contents().find(selector)))
)
```

```js
cy.iget('[data-test="name"]').should('have.text', 'サンプル')
```

Cypress にはカスタムで関数を作れたり、既存の関数をオーバーライドすることが簡単にできる機能が用意されています
https://docs.cypress.io/api/cypress-api/custom-commands.html

また、カスタムで作成した関数の中で Cypress オブジェクト（型が Cypress.Chainable のもの）を return するように作っておけば、`cy.iget(...).should(...)`みたいな感じでメソッドチェーンで書けるのでとても便利ですねー
Picasso2.5.2でfit()を使うとToo Many Filesエラーで画面がフリーズする不具合


# 概要

Picasso (ver:2.5.2)を利用していて下記の現象に遭遇したので対処方法をメモします。

## 現象

### 発生した環境
ニュース系アプリのUIによくある複数タブにRecyclerView(大量のImageViewを含む)があり、スワイプで行き来ができるアプリを作っていたときに確認しました。

### 起こった現象
タブをスワイプで遷移している際、スワイプを繰り返していると画面がフリーズして操作できなくなります。
(エラーログ)

```
2019-03-28 15:33:55.067 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
2019-03-28 15:33:55.351 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
2019-03-28 15:33:55.380 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
2019-03-28 15:33:55.393 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
2019-03-28 15:33:55.642 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
2019-03-28 15:33:55.672 xxxx E/NativeCrypto: AppData::create pipe(2) failed: Too many open files
....
```

## 原因
PicassoでImageViewにfit()メソッドを利用して画像を読みこませている際、発生する可能性があります。
今回は大量のimageViewへの読み込みを行なっていたので発生しやすくなっていました。(端末のスペックによります。)

原因箇所としては、最新版で追加されている下記の条件分岐が、2.5.2以前のバージョンには含まれていないことによります。
https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso3/Picasso.java#L536

Picassoでは、fit()を使わない場合と使う場合で描画までの処理が異なります。
fit()を利用する場合、Picasso内で「deferred」変数がtrueになり、deferredがtrueのリクエストが蓄積されるMapにputされていき、後で順番に処理をされます。
一方、fit()を利用しない場合deferred扱いにならずにそのまま処理されます。

下記の条件分岐がver.2.71828で追加されていますが、ver.2.5.2にはこの処理が含まれていません。
https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso3/Picasso.java#L536
この条件分岐が含まれていない場合、処理待ちのMapに同じImageViewについてのリクエストが重複してputされていってしまう可能性があり、その重複したリクエストを処理しようとすることで今回のようなエラーが発生します。

## 解決策

おとなしくバージョンアップしましょう。
https://github.com/square/picasso

```
2.5.2 -> 2.71828
```
数年分のcommitが含まれる(上述した条件分岐は４年前のcommit)ので変更点が多いことや、バージョン名への不安感などからバージョンアップをためらいたくなりますが、上記問題はバージョンアップによって解決します。
そもそもfitメソッドを利用する必要がなければ、利用しないという解決策もありますが、deferred扱いにしないことによって、パフォーマンスが落ちるケースがあり得ます。
jsdoでPalo Alto Tiny Basic

#概要

jsdoでPalo Alto Tiny Basicやってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/31c2400b-3920-3a17-c482-740a21fc914a.png)


#参考にしたページ

http://www.kero2.org/tb_ex.cgi

#サンプルコード


```
10 FOR I=1 TO 100
20 IF I-(I/15)*15 = 0 GOTO 80
30 IF I-(I/3)*3 = 0 GOTO 100
40 IF I-(I/5)*5 = 0 GOTO 120
50 PRINT I,
60 NEXT I
70 STOP
80 PRINT " FizzBuzz",
90 GOTO 60
100 PRINT " Fizz",
110 GOTO 60
120 PRINT " Buzz",
130 GOTO 60    
```

#成果物

http://jsdo.it/ohisama1/Gao7/

以上。
Webシステム、Web制作の見積もりをするときにヒントとなるような項目

- 受注経路
    - 二次受け？三次受け？
- サイト全体の規模感
    - ただのサイト制作 or システム構築？
- デバイス
    - sp or pc
    - ブラウザ対応
- 制作範囲
    - 要件定義
    - ディレクション
    - デザイン
    - 制作（コーディング、システム開発）
- 制作期間
- 納品形態
- 保守・運用について
    - 保守までするのか？
    - サーバーは何を使うのか
- 見積もり方法
    - 相見積もり or そうじゃない
- 予算感
    - 明確な予算感があるのか


他にもあれば教えてください
#jq コマンドで特定のキーを持つオブジェクトだけを絞り込み検索する例

```shell
$ echo '{"alice":"value"}{"bob":"value"}' | jq 'select(has("bob"))'
{
  "bob": "value"
}
```

```shell
$ echo '[{"alice":"value"},{"bob":"value"}]' | jq '.[]' | jq 'select(has("bob"))'
{
  "bob": "value"
}
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/961








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
いなくなった人のPCに侵入してその人になり変わる話

#部署から一人の先輩エンジニアの方が新規事業へと旅立たれた
というわけで、その方の案件を引継ぐにあたり、今まで作業されてた環境に自分が入れるようにする必要が出てきたので、入れるようにしましたっていうお話です。
ケーブルとか色々繋げてキーボードを3台使用してカタカタするのはなんかアニメや映画によくいるエンジニアっぽくて楽しかったです。ザッツ厨二！！
![Image from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/257845/acdd845a-ccc1-b8f0-6915-84042f2c7198.jpeg)

## 準備するもの
モニター　　　　　　　　1台
LAN接続用のハブ　　　　1個
LAN to LAN ケーブル　2本
LAN to USB ケーブル　1個
DVI to DVI ケーブル　1本

## ターゲット
先輩のデスクトップ本体

## 接続接続ゥ！！！
#####手順1
デスクトップ本体とモニターにDVI to DVI ケーブルを接続。これでモニターでデスクトップ本体の中身をGUIで見れます。
#####手順2
デスクトップ本体にハブを一本めのLAN to LAN ケーブルを使って接続
#####手順3
ハブから伸ばしたもう一本のLAN to LAN ケーブルに対してLAN to USB ケーブルを接続させ自前のMacへ繋げる

こういう管だらけになる環境、とてもいいと思います。テンション上がりますね。もっと管だらけにしたいです。

## なり変わる準備
### rootアカウントへログイン
rootユーザーへのアクセスは上司エンジニアに教えてもらいました。
#### 使用OS
CentOS6.9

### ユーザー作成
rootユーザーでログインしたら、ここから、ターミナル作業です。

＊使用している名前は、仕事で実際に使っているものではありません

```
# useradd nedward
```
### 作ったユーザーをwheelグループに追加します。
CentOSではsudoの実行権限をユーザーが使用できるようになるグループがwheelになっています。

```
# gpasswd -a nedward wheel
```

### sshできるようにするためのポート開放などの設定です

```
# vi /etc/ssh/sshd_config
```

こんな感じで、コメントアウトされているはずなので、取っ払ってください。

変更前

```
17 #Port 22
18 #AddressFamily any
19 #ListenAddress 0.0.0.0
20 #ListenAddress ::
```

変更後

```
17 Port 22
18 #AddressFamily any
19 #ListenAddress 0.0.0.0
20 #ListenAddress ::
```
### rootログインをさせないようにする
同ファイルに下記のような記述があるのでこれをコメントアウトして後にnoに変更します。

変更前

```
38 #PermitRootLogin yes
```

変更後

```
38 PermitRootLogin no
```

### pam_wheel.soを有効化

このモジュールを有効化しないとwheelが機能しないので、こいつも設定します。

```
# vi /etc/pam.d/su
```

変更前

```
6 #auth            required        pam_wheel.so use_uid
```

変更後

```
6 auth            required        pam_wheel.so use_uid
```
### ssh認証
鍵の作り方はこちらを参照
[認証鍵の作り方](https://webkaru.net/linux/ssh-keygen-command/)

今回は既に作ってある自分の公開鍵の中身をコピーして、ssh先のauthorized_keysにコピペしました。

```
# vi /.ssh/authorized_keys
```

開いたところでコピーしてください。

### Selinuxの無効化
最近のはデフォで無効化されているので、大丈夫でした。

### sudoersを設定

作成したnedwardユーザーがスーパーユーザーになれるように、設定をします。

```
$ visudo
```

変更前

```
# Same thing without a password
#%wheel        ALL=(ALL)       NOPASSWD: ALL
```

変更後

```
# Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL
```
### いよいよssh
自分のMacからsshを開始します。

```
$ cd .ssh

$ ssh nedward@**********
```

ちなみにCentOSのIPは下記コマンドで調べられます。

```
$ hostname -I
```

### sudoになって、その後に先輩のユーザーに成り代わる

```
$ sudo su -

$ su - 先輩のユーザー名
```

ちなみに作成されているユーザーは下記コマンドで調べられます

```
$ ls /home
```

完了です。これでプロンプトがターゲットのユーザー名に変わっていれば、無事、なり変わることができたという感じです。

## さぁ、環境の調査だ
ようやく、世界への入り口を開けた私、ここから先輩の開発環境を調査していくぜ！！
私の戦いはここからだ！
RPA推進メモ1 体制について

IT部門主導
 メリット
  ROBO制作、メンテナンス等、制作力が強い点、セキュリティの担保、エラー時の対応、監視ツールの基盤構築等、維持・運用・管理力の安定度にあります。

 デメリット
  RPAが現場に浸透し、スケールアップ局面を迎えると、現場部門の求めるスピードについていけなくなる点でした。事務処理は、毎日運用する必要があり、事務の担い手としてフローに組み込まれたROBOが、変化に対応できない（変更に時間がかかる）と、品質、効率の両方に影響が出ます。

現場部門主導
 メリット
  多種多様な業務に迅速に対応できる点と、事務の変化、日々の改善への対応も柔軟にできる点です。

 デメリット
  製作・運用ガイドラインを実効的に守れなくなる懸念がある点です。現場部門にITリテラシーが高いメンバーが多くいれば、別ですが、実態として、日々の現場の業務を遂行しつつ、増え続けるRPAを管理、統制する体力はないでしょう。

出展
https://rpa-bank.com/column/18316/?read_more=1
https://rpa-bank.com/column/18426/?read_more=1
bootstrap-material-designを使った時のコンパイルエラー

## 環境

### 動作環境

- Mac
- PHP 5.6.30
- Laravel 5.4
- npm 6.8.0
- yarn 1.13.0

### `composer.json`の中身↓

| パッケージ | バージョン |
|:-------|:--------|
|bootstrap| ^4.1.1|
|bootstrap-material-design | ^4.1.1|
|jquery | ^3.2.1|

この環境下で`npm run watch-poll`するとビルドエラーが発生する

どうやらBootstrapのバグのよう(たぶん)

## 解決方法

```file
./node_modules/bootstrap-material-design/scss/mixins/_forms.scss
```

このファイルの159行目, 下記の行を次のように置換する

```_forms.scss
@include form-validation-state("valid", $label-color);
```

↓︎

```_forms.scss
@include form-validation-state("valid", $label-color, $form-feedback-icon-valid);
```

プロジェクトのルートディレクトリで下記コマンド実行

```terminal
grep -l '@include form-validation-state("valid", $label-color);' ./node_modules/bootstrap-material-design/scss/mixins/_forms.scss | xargs sed -i.bak -e 's/@include form-validation-state("valid", $label-color);/@include form-validation-state("valid", $label-color, $form-feedback-icon-valid);/g'
```
SSH接続時パスワードなしでSSH接続の設定方法

#1.環境作成
クラスタ環境では、各ノードの間に互くアクセスする要望があります。
本章は、Master(cluster-master：192.168.0.100)から、Slave1(cluster-slave1：192.168.0.101)とSlave2(cluster-slave2：192.168.0.101) へ、パスワードなしようにssh接続を行う際のやり方を解説します。
####1.1.SSHのインストール
MasterとSlaveの中に、sshがなければ、まずsshをインストールします。
####1.2.Slaveへの接続確認
Masterから、各Slaveへ、ssh接続を試してみるとパスワードを聞かれます。

```
# ssh -l root 192.168.0.101
# ssh -l root 192.168.0.102
```
#2.ssh-keygen公開鍵作成
Masterのコンソールで、「ssh-keygen」を実行します。

```
# ssh-keygen
```
以下のメッセージが表示したら、説明の通りに行ってください。
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <font color="red">そのままエンター</font>
Enter passphrase (empty for no passphrase): <font color="red">そのままエンター</font>
Enter same passphrase again: <font color="red">そのままエンター</font>
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
2a:23:16:fa:63:33:4d:9f:a3:79:2e:13:77:63:07:f1 root@spark2
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
+-----------------+
次に、Masterの公開鍵を接続したい各Slaveにを転送します。

```
# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.101
# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.102
```
#3.パスワードなしでSlaveへの接続確認
以下のように、パスワード無しで接続できることを確認します。

```
# ssh 192.168.0.101
# ssh 192.168.0.102
```
正常にSlave1、Slave2に接続できるはずです。
[Ruby] Excel の 43488.52426 のような小数形式の日付を Time オブジェクトに変換する

# 方法

```rb
excel_value = '43488.524256'

Time.parse('1899/12/30') + excel_value.to_f * (60 * 60 * 24)
#=> 2019-01-23 12:34:56 +0900

# Active Support コア拡張機能を使っている場合
Time.parse('1899/12/30') + excel_value.to_f.days
#=> 2019-01-23 12:34:56 +0900
```

# 参考

* [How to convert MS excel date from float to date format in Ruby?](https://stackoverflow.com/questions/10559767/how-to-convert-ms-excel-date-from-float-to-date-format-in-ruby)
B問題「隔離された街のゲート」テストコード

# 「隔離された町のゲート」リンク
https://paiza.jp/botchi/challenges/botchi_b_2003

#問題文

>作りかけのゲームプログラムを発見したけど、キャラクターの動きの制限する方法が未実装にゃ  

>制作中のゲームは、縦方向に H マスと横方向に W マスだけ広がる格子上のマップを用いてるにゃ。 
左下のマスが原点であり、その座標を (0, 0) としまするにゃ。
原点から横方向に x マス、縦方向に y マス進んだ座標を (x, y) と表記するにゃ。

>現在の開発段階では障害物などはにゃく、キャラクターの初期座標が必ず (0, 0) だにゃ。 
この状態から合計で N 回の上下左右への移動操作が行われるにゃ。 
各移動操作はキャラクターの座標 (x, y) を以下のように変更するにゃ。

>・上への移動 : キャラクターの座標を (x, y) から (x, y + 1) へ変更するにゃ。 
・下への移動 : キャラクターの座標を (x, y) から (x, y - 1) へ変更するにゃ。 
・左への移動 : キャラクターの座標を (x, y) から (x - 1, y) へ変更するにゃ。 
・右への移動 : キャラクターの座標を (x, y) から (x + 1, y) へ変更するにゃ。

>開発依頼書には、N 回の操作中にキャラクターが不正な座標にいることがにゃいか判定するプログラムの作成が指示されているにゃ。 
不正な座標とは、マップ外の座標、すなわち格子上に存在しない座標すべてのことを指すにゃ。 

# テストコード
```隔離された_spec.rb
require 'spec_helper'

RSpec.describe Isolated_city_gate do
  describe 'キャラクターがどの座標にいるのか' do
    it '正しい入力' do
      result = Isolated_city_gate.new.coordinate(map_longitudinal: 3, map_lateral: 3, character_movement: 'URDRL')
      expect(result).to eq 'valid'
    end

    it '不正な入力' do
      result = Isolated_city_gate.new.coordinate(map_longitudinal: 4, map_lateral: 4, character_movement: 'UURRRRD')
      expect(result).to eq 'invalid'
    end
  end
end
```
# テスト対象コード

```隔離された.rb
class Isolated_city_gate
    def coordinate(map_longitudinal:, map_lateral:, character_movement:)
        x_coordinate = 0
        y_coordinate = 0
        valid_false = 0
        character_movement.split('').each do |ope|
            if ope == "R"
              x_coordinate += 1
            elsif ope == "L"
              x_coordinate -= 1
            elsif ope == "U"
              y_coordinate += 1
            elsif ope == "D"
              y_coordinate -= 1
            end
            valid_false = 1 if x_coordinate < 0 || x_coordinate >= map_lateral || y_coordinate < 0 || y_coordinate >= map_longitudinal
        end
        if valid_false == 1
          'invalid'
        else
          'valid'
        end
    end
end
```

thank you にゃー
VR用の記録ライブラリVRec:これであなたもVRアニメクリエイター

#結論

VRアニメ作ったりVRアプリの行動を記録する、VR用の記録ライブラリVRecを作ったよ。[ここ](http://www.nagao.nuie.nagoya-u.ac.jp/public/vrec/)から使ってね、無料だよ

#VR内で起こったこと、記録したくないですか?
狼と香辛料VRが話題ですけど、あなたもVRアニメ作りたくないですか

あるいは、VR・ARアプリ作ってて、履歴を残したくないですか。つまりCluster内じゃないけど、アーカイブ機能使いたくないですか。あわゆくば、それらを使って機械学習とかしたくないですか。

それか、VRを題材にした研究をしてる学生さん、デモ動画をもっと楽に作りたくないですか。UnityのSceneViewをキャプチャする作業、楽にしたくないですか。

全部できます
そう、VRecならね

#VRecが可能にすること

VRecがするのは、VR内の3Dモデルの動き(これにはアバターもオブジェクトも、UnityでTransformがつけれるすべてのものが含まれている)とそれ以外の様々なイベント(音やエフェクトとか)の記録。

つまり勘のいい諸兄らならわかるだろうけど、これを使うだけで適当なVRゲームの履歴機能なら一瞬で、そして無料で作れることになる。現状はUnity向けだけど、いずれUE4にも対応する予定。

## まずはVRアニメ
あなた(QiitaでVRを調べるということは、最低限VRHMDとC#とUnityの知識を少なからず持っているあなた)がVRアニメを作るとき、最も大きな障害になるのは<font color ="red">役者があなたしかいない</font>こと

でもVRecはそれを解決してくれるよ。つまり、過去に取った複数のモーションを合わせて1つの作品にしちゃえばいい。こんな風にね
![ezgif-1-9be91bad4fe7.gif](https://qiita-image-store.s3.amazonaws.com/0/254776/4c7198a4-c616-1f5e-4f15-8799ca1d41c4.gif)


VRができるようなPCなら、100アバターぐらいまで増やしても動く。VRIKやちゃんとBoneの入っているアバターなら1万アバターは動かせる(レンダリングで死にそうだけど)

##あなたが作ってるVRアプリのために
おそらく、そのVRアプリには履歴機能が必要でしょう。VR会議の議事録、訓練系ならあとで復習したい。
どうぞVRecをお使いください。
VRecを使って作ったVRの議事録なら、あとからもう一度会議に参加することができます、発言権はないけど。
だってVRを使って記録したものをVRで再生してるんだからね、それはもう一度目の前で会議やってくれているのと同じだ。

あと、VRecはたんなるモーションレコーダーではなく、アバター以外も記録する汎用的なものだ。もしかしたら、VRゲームアプリのリプレイにも使えるかもしれない。
こんな風に、
![ezgif-1-15416deb6741.gif](https://qiita-image-store.s3.amazonaws.com/0/254776/da8eab68-9486-9d28-59cd-cc3b2746ab49.gif)

この動画は「お互いに火の玉を打ち合って秋葉原の街を破壊するゲーム」を1人でプレイ×2して(空しい)
重ねたものだ。怪獣ごっこをたまにやってる(悲しい)

##研究用のデモ動画作るの面倒くさくない?
まあ僕は結局学生なんだけど、面倒くさいね、研究発表用の動画作るの

まず、たいていの場合、作業は深夜だ。手伝ってくれる人がいない。

ってことは、デモ動画を取るために、UnityのSceneViewをベストな位置に固定して、そこを画面キャプチャする。当然固定カメラ。
もちろん、うまくいかない。動作が失敗、台本をミスる、サーバーの初期化忘れ、やってる最中にカメラから外れる
完璧に出来た?おっと残念、録画開始ボタン押してなかったよ。

やっと成功したぜ、深夜2時。
でも次の日、指導教官はこう言う、「画角がいまいちだから撮り直して」

少なくともVRecは、カメラ操作と作業者、そして撮り直しに関してそこを助けてくれる。
完璧にできた1回の動きを記録しておけば、あとからカメラを操作できるし、何度だって取り直せる。後輩が手伝ってくれなくても泣く必要はない

あとは、君がVRで複数人の利用者がいるように見せかけたいときも同様に有用だ。見かけ上は同時にプレイしているような動画を作れる。

##そしてそれ以外のクレイジーでクリエイティブなこと
この先は君の目で確かめてくれ！
少なくとも、過去の自分と過去の自分がイチャついてるのを時間停止してパンツの中見るところまでは[やった](https://www.youtube.com/watch?v=Bzkb2b4uJx8&t=11s)

もしできるのなら、VRChatのホームビデオとして使えるかもしれない。スクリプトおけないから無理だろうけど。

他には、災害系シミュレータVRで体験者以外のモブを登場させたりとかかな、マリカーでいうゴースト機能だ

#で、結局どうすれば使えるの
[ここ](http://www.nagao.nuie.nagoya-u.ac.jp/public/vrec/)のリンクから、あるいは直接[GitHub](https://github.com/yutoYokoyama/VRec)に行って、DLLをダウンロード

Unityのプロジェクトに突っ込んで、あとはReadMeに従ってほしい。
もし使い方がわからないなら、この[動画](https://www.youtube.com/watch?v=qZ2XW3EjBDo&feature=youtu.be)を参考にしてほしい

#今後の課題
早送りと、あとから編集できる機能をつける予定。

あとVRIKとVRMに対応する。

VRIKを使った動きなら、大幅なデータの省力化をする。

VRMなら表情(これはVRMBlendShapeProxyのことだけど)の変化も記録する
逆を言うと今はfbxアバターの表情を記録できてない。なぜならMeshRendererの仕様がぐちゃぐちゃだから。実装上は可能だけど重くなるからやりたくない

#動画で使ったもの
[AliciaSolid(VRM)](https://3d.nicovideo.jp/works/td32797)

[JapaneseOtakuCity](https://assetstore.unity.com/packages/3d/environments/urban/japanese-otaku-city-20359)と、それに含まれていたクエリちゃん

[Andoroid Robot](https://3d.nicovideo.jp/works/td32814)

の3つ

#愚痴
Clusterのアーカイブ機能について、「これはVRにおける偉大な一歩だ」とか「過去の自分と触れ合う誰もしたことのない体験」とか呟いてるのを見て、「いやもうそこは自分が[半年前](https://www.youtube.com/watch?v=Bzkb2b4uJx8&t=11s)に通った道なんで…」で強く主張したいのです
ChromeでWeblioポップアップ英和辞典が動かなくなった時の対応

ChromeでWeblioポップアップ英和辞典が動かねーよ・・・
便利だったのに、と諦めていたが色々調べているとContent Security Policyのせいでブロックされているもよう。

Chromeの拡張機能「Disable Content-Security-Policy」をで解決できる事が判明。

Disable Content-Security-Policyは以下リンクより。
https://chrome.google.com/webstore/detail/disable-content-security/ieelmcmcagommplceebfedjlakkhpden/related

インストールして<img width="31" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/37451/24de74c9-4635-714e-2efd-d80133ae6801.png">のアイコンをクリックして<img width="30" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/37451/b5bb9c0d-50b1-bedd-e60f-6b490b9c3977.png">にすれば再びWeblioが動くようになりました。

Disable Content-Security-Policyのご利用は自己責任で。