OmniAICreator/Qiita-1.07M huggingface dataset:
Unity WebGLでビルドするとHTMLのInputでキーボード入力ができない問題

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログに書いた内容](https://www.fast-system.jp/unity%ef%bc%9awebgl%e3%81%a7%e3%83%93%e3%83%ab%e3%83%89%e3%81%99%e3%82%8b%e3%81%a8html%e3%81%aeinput%e3%81%a7%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e5%85%a5%e5%8a%9b%e3%81%8c%e3%81%a7%e3%81%8d/)のメモになります。*

Unity で WebGL を出力するとブラウザで実行可能な出力が可能になります。
上記のWebGL は HTML5 の Canvas 要素で実装されているのですが、このHTML内に以下のようなテキスト入力欄を同時に表示すると、ここの入力ができなくなる問題があるようです。

```html
<input type="text" name="name" size="30">
```

![WS000000-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/227880/60936459-0078-703c-0fc4-998237883351.jpeg)

# ソースコード

「WebGLInput.captureAllKeyboardInput = false」にする事により、HTML内でのキーボード入力が可能となるようです。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HtmlInputControl : MonoBehaviour
{
    void Start()
    {
#if !UNITY_EDITOR && UNITY_WEBGL
        WebGLInput.captureAllKeyboardInput = false;
#endif
    }
}
```

# デモ

- 対応した画面
   - https://www.fast-system.jp/wp-content/uploads/static/unity-webgl-html-input-true/
- 非対応の画面
   - https://www.fast-system.jp/wp-content/uploads/static/unity-webgl-html-input-false/

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
背景色がある角丸tableをつくる

## コードと記事の背景
こんな感じの角丸のテーブルを作ります。
角丸テーブルの作り方はすぐ見つかったけど、背景色ありの角丸テーブルの作り方が調べてすぐ出なかったので備忘録までに。
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="guchiparasol" data-slug-hash="xMMLXx" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="角丸table">
  <span>See the Pen <a href="https://codepen.io/guchiparasol/pen/xMMLXx/">
  角丸table</a> by guchiparasol (<a href="https://codepen.io/guchiparasol">@guchiparasol</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 解説
border-radiusでtableを角丸にする。

```css

.table-radius {
  border: none;
  border-radius: 5px;
  border-spacing: 0;
  border-collapse: separate;
}
```


罫線と背景色を設定する。

```css
.table-radius tr th,
.table-radius tr td {
	border: none;
	border-bottom: 1px solid #ccc;
	border-right: 1px solid #ccc;
}

.table-radius tr:nth-child(odd){
  background: #ddd;  
}

.table-radius tr th{
  background: #333; 
  color:#fff;
}

.table-radius tr td:first-child {
  border-left: none;
}

.table-radius tr td:last-child {
  border-right: none;
}
```

背景色を設定した場合、角丸を無視して真四角に塗られてしまうので、四隅のth・tdタグに角丸を設定する。

```css
.table-radius tr th:first-child {
  border-radius: 5px 0 0 0;
}

.table-radius tr th:last-child {
  border-right: none;
  border-radius: 0 5px 0 0;
}

.table-radius tr:last-child td:first-child{
  border-top: none;
  border-radius: 0 0 0 5px;
}
.table-radius tr:last-child td:last-child {
  border-bottom: none;
  border-radius: 0 0 5px 0;
}
```
テーブル一覧を取得するSQL(Oracle/MySQL/PostgreSQL/SQLite/SQLServer/Cassandra)

#はじめに

[MiluDBViewer(JavaFXを使ったGUI DBクライアント)](https://github.com/milukiriu2010/MiluDBViewer)を
作ったときの内容を忘れてきたのでメモします。

今回は、テーブル一覧を取得するSQLについてです。

# Oracle - 12c Release 2

```sql
select object_name, status from all_objects
where
object_type = 'TABLE'
and
owner = 'スキーマ名'
order by owner, object_name
```
statusの値域
  VALID
  INVALID

# MySQL - 8.0.11/SQLServer - 2017

```sql
select  table_name from information_schema.tables 
where 
  table_type='BASE TABLE' 
  and 
  table_schema = 'スキーマ名'
order by table_name
```
MySQLとSQLServerが同じSQLで取得できる!!

# PostgreSQL - 10.4

```sql
select 
  c.relname  
from 
  pg_class c join 
  pg_namespace n on n.oid = c.relnamespace 
where 
  n.nspname = 'スキーマ名' 
  and 
  c.relkind = 'r' 
order by c.relname
```

# SQLite

```sql
select name from sqlite_master
where
  type = 'table'
order by name
```

# Cassandra - 3.9.0

```sql
select table_name from system_schema.tables
where
  keyspae_name = 'スキーマ名'
order by table_name
```

# 上記以外のDB

後から知ったのですが、JDBCが実装していれば、
java.sql.DatabaseMeataDataのgetTables()メソッドで、
java.sql.ResultSetが返ってくるので、
resultset.getString("TABLE_NAME")でとれます。

参考URL
https://avaldes.com/jdbc-statement-databasemetadata-gettables-example/
macOS High Sierra以降でvscode + gdb

今更ではあるが新環境を用意する際に忘れたりするので書いておく
# gdbをインストールする
[gdb doesn't work on macos High Sierra 10.13.3](https://stackoverflow.com/questions/49001329/gdb-doesnt-work-on-macos-high-sierra-10-13-3/49104154#49104154) に記述の通り`^8.1`では動作しないので
8.0.1を持ってくる

> 既にgdbをインストールしていた場合
`brew unlink gdb`でunlinkしておく

```bash
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb
```

brewのアップデート対象からgdbを除外

```bash
brew pin gdb
```

System Integrity Protectionを無効化していない場合は以下を実行する

```bash
echo "set startup-with-shell off" >> ~/.gdbinit
```

# gdbを証明する
[こちらの記事](https://qiita.com/takahashim/items/204ffa698afe09bd4e28) の通りに行えばOK

# 動作チェック
適当にgistからHello Worldを拾ってきて走らせてみる

```bash
pushd `mktemp -d`
wget https://gist.githubusercontent.com/jonathonw/1725966/raw/492f0313ab609d27fec543042d58903d57f55689/HelloWorld.cpp
g++ -g ./HelloWorld.cpp -o test
sudo gdb ./test
```

```
(gdb) run
```

無事Hello Worldが出ればgdbの準備は完了

# vscodeでデバッグ
単純にcodeで起動してもgdbは使えないのでsudo権限で起動する必要がある
ちょっと厄介なのでaliasにしておくと良い
#### bash
```bash
alias code='sudo code --user-data-dir="$HOME/.vscode-root" $@'
```

#### fish
```bash
function code
    sudo code --user-data-dir='$HOME/.vscode-root' $argv
end
```

aliasを設定したら、先ほどのHelloWorldがあるディレクトリでvscodeを開く

#### launch.json
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/test",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb"
        }
    ]
}
```
`${workspaceFolder}/.vscode/launch.json`に上記設定を貼り付けて`F5`で実行
**DEBUG CONSOLE**に以下のように出力されれば成功

```
...省略
Thread 2 hit Breakpoint 1, main () at ./HelloWorld.cpp:5
5	  std::cout << "Hello World!" << std::endl;
Execute debugger commands using "-exec <command>", for example "-exec info registers" will list registers in use (when GDB is the debugger)
Hello World!
[Inferior 1 (process 74786) exited normally]
...省略
```
TypeScript で既にある型から一部を nullable にする型を作る

こういう2つの型を扱うことがあると思います

```typescript
type Article = {id: string, value: number}
type ArticleDraft = {id: string | null, value: number}
```

ORM などで一度保存するまでidが振られない、みたいな時によくある型ですね。

これは簡単な例ですが、フィールドが多くなると同じような型を２つ書くのが面倒くさいし、何よりバグを仕込みそうなので、今回はなんとかして Article 型から ArtcileDraft 型を最小限の手数で生成したい、と思います。

## 案1: Draft を先に定義して、 extends して絞り込む

```typescript
interface ArticleDraft {id: null | string, value: number}
interface Article extends ArticleDraft { id: string }
```

意図したとおりの2つの型が出来たのですが、発想の順序が逆です。先に Article を宣言してから ArtcileDraft を生成したいので、別の手段をとります。

## 案2: Conditional Type の型魔法で nullable に変換

```typescript
export type Draft<T, D extends keyof T> = { [K in keyof T]: (K extends D ? T[K] | null : T[K]) };

// Example
type Foo = { id: string }
type FooDraft = Draft<Foo, 'id'>
//   => {id: null | string}
```

Twitter であれこれしてたら @wonderful_panda 氏に教えてもらいました。

型のプロパティをイテレートして別の型を再構築しながら、第二型引数で渡した key を満たす型は nullable な型に変形しています。

これが便利なのは、 文字列の uniontype で複数の型を nullable にできること

```typescript
type Article = {id: string, value: number}
type ArticleDraft = Draft<Article, 'id' | 'value'>
// => {id: string | null, value: number | null}
```

意味はわかるのですが、自分でこれをひねり出すことは出来ませんでした。とはいえイディオムの組み合わせなので、一度知ったら色々応用できそうなテクニックですね。

# 参考

https://qiita.com/nullabletypo/items/999fe07d079298c35e0c#omit

https://twitter.com/wonderful_panda/status/1097883246740660231
とあるエンジニアの問題意識 2019-02-19



# 耳栓にイヤーマフラーをあわせて着用する
試行錯誤だ。本当に遮音性能が高い。イヤホンで音楽を聴くのは逆に音があって気が散る。周囲の音に最低ギリギリ気づけるようにしておきたい。椅子をずらす音などはほんのわずかに聞こえる

# Macの3本指でドラッグできるジェスチャが激しく便利そうだ
タッチパッドを押し込むのにはわりと指先の力が必要。ドラッグやコピーアンドペーストする時にかなりのストレスを感じていた。今までなぜ知らなかったのかというオプション

# 耳栓やイヤーマフをつけると閉塞感が嫌だと思っていたが、違うようだ
むしろ耳栓をつけながら体を動かした時に、耳と耳栓が微妙に摩擦して出る音が嫌だ。つまり、やはり音のノイズに反応していることが分かった

# 自分の脳のワーキングメモリが3程度だと理解してから、Chromeやコンソールのタブ数も3程度に押さえている。
開きすぎていると思ったら即座に閉じる。以前からそうだったがより意識的に。

# 問題意識を脳のメモリ空間に送り込む。
小さいやつや大きいやつ。中ぐらいのやつ。空気中に存在するゆらめきのようなもの。情報処理の過程を感じられるまで。手に取るように。

# 浅い眠り・中ぐらいの眠り・深い眠りを使い分ける。
浅い眠りはほとんど目を閉じるだけ。マインドフルネスで回復に集中する。中ぐらいの眠りは体をやや倒す。深い眠りは夜だ。床に体を横たえる。弱中強パンチ理論は全事柄に適用できる。

# ノイズを減らす。
ストーリーのdescriptionに書かれている情報。GithubPRのDescription。MAcのNoteにつけているちょっとしたメモまで。ノイズを感じた瞬間に草を抜く。情報の世界にもノイズがあること自体が本質的に不思議だけど。

# 全てのアプリケーションの本質がこれほどまでに注意力、思い出すことを根源にしている理由。
人間の脳のメモリに対応した結果だろう。すぐに忘れる。揮発性。これは神の法則ではなくて一個の生物の形態に対する適応だ。

# 英語と日本語の切替。
手が自動的にタイプ数を自動計算している気がした。1キーでも短い方を。hostと書くかホストと書くか。matchingと書くかマッチングと書くか。IME切替は往復運動で2キーを消費。

# Macのタッチパッド。
シングルクリックをするために指で押し込まなくても良いという事実に驚愕している。今日変更したオプション設定の関係だろうか。それとも以前からか。軽く触れるだけで。長年使っていてもまったく気づかないことってあるもんだ。

# Macで三本指のドラッグを有効にした。
軽いタップでのシングルクリックも使い始めた。なんとも手がはがゆい感じ。いままでトクっと押し込んでいた操作が、雲を触るような感じになる。次第に慣れるか慣れぬか。

# 夕方は難しい時間帯だ。
体内の圧力が下がる。昼食をとったか否かにかかわらずとりあえず眠くなる。眠くなければなんとなく空白の感じがある。最適なのはじっと動かず備えること。だが本当にそれで良いかという迷いはある常に。

# ところで昨夜気付いたが、Bloggerはいつの間にかそんなに悪い見た目ではなくなっていた。
GoogleもBloggerは放置していると思っていたけれど今後も腰を入れて運用されるのだろうか。いや開発陣は別なのかな。

# 割と慣れない難しいことをしていた。
途方もない頭のエネルギーを使う感覚。睡眠じゃあ癒されない。運動が必要だが脊柱管狭窄で歩きづらい。いかがしよう。冷たい風に当たってもそれは疲労感のマスキングかもしれない。

# 目を閉じながらプログラミングする方法はないのだろうか。
闇の視界の中で。視覚情報じゃないような視覚情報で。とにかく視覚過敏によるエネルギーの枯渇を防ぎたい。音で感知するプログラミングはないだろうか。

# 呼吸が深刻な影響を与えている。
ほんのわずかな微妙な違いであっても。自分の体感レベルとしての想定よりはるかに影響が巨大だ。おそらく。なぜ気付くかというと、呼吸の影響を身体感覚的に、よく観察した時に分かる。普段は気づかない浅さや深さ。

# Macの動作。
強く押し込まずにシングルクリック。この動作があまりに軽いので、三本指ジェスチャーでのドラッグも不要になりそうだ。一本指で動かせた方がはるかに軽い。指の本数でいうと1/3。かなりコストが得をする。

# 僕はどんなに優れたプログラマを見ても絶対に悔しがりたくない。

モチベーターは悔しさでは無い気がする。



職種によってモチベーションの傾向があるのだろうか。



いや心では悔しがっているが口で表現しないだけかもしれない。

負けを認めたくないのがプログラマかな。



#エンジニア <https://t.co/MyJMcHXU6P>

# 1つの学習に付随して別個の能力が伸びる期待。

根拠がない。



特定のスキルを伸ばしたいならダイレクトに学習する必要がる。

外堀から攻めるも良いが狙うはあくまで本丸だ。



うすうす気づいていながらなぜ学習しないのか。

心理的否認が関係している気がする。



#エンジニア <https://t.co/puSDxFDus8>

# 人を育てたい。

人に教えるのが好きだ。

教えるのも上手だと人には言われる。

実績などまるでないが。



世の中にはそんなに教え嫌いが多いんだろうか。

自分が好きなだけにその感覚が想像しづらい。



仮に今仕事を始めるならプログラミングスクールの先生なんか良いんじゃないかと思ってる。



#エンジニア <https://t.co/ueNvKzRUT1>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Playframework(Scala)でSentryを使う

## Sentryとは
エラーを補足して整理することができるSaaSです。ログに埋もれがちなエラーを集計してチケット化し、すばやく修正していくことができます。

## 必要なこと
Javaのlogbackにフックを仕掛けることで、Sentryのサーバへエラーログを送信する方法でやります。

- SentryでOrganizationとProjectを作り、DSNを取得
- 必要なパッケージを設定
- 設定を書き込んだDSNでSentry.initする
- logbackにSentryを設定する

順番に説明していきます

## DSN取得
SentryサイトでJavaプロジェクトを作成するとDSNが表示されるのでこれを使います。

## 必要なパッケージを設定
build.sbtにsentry-logbackの依存を書きます。

```scala
libraryDependencies += "io.sentry" % "sentry-logback" % "VERSION"
```

## Sentry.initする
Sentryに設定を書き込む必要があるのですが、いくらか方法があります。

https://docs.sentry.io/clients/java/config/#id2

- sentry.properties
- 起動引数
- 環境変数
- Sentry.initを起動時に実行

どの方法でもいいのですが、Environmentなどの設定が厄介なので、ここでは汎用的なSentry.initを使ってやります。

```scala
package modules

import com.google.inject.AbstractModule
import io.sentry.Sentry
import javax.inject.{Inject, Singleton}
import play.api.{Configuration, Environment, Logger}

class SentryModule extends AbstractModule {
  override def configure(): Unit = bind(classOf[SentryService]).asEagerSingleton()
}

@Singleton
class SentryService @Inject()(conf: Configuration, env: Environment) {
  val Packages = 
      "controllers" ::
      "modules" ::
      "models" ::
      "services" ::
      "utils" :: Nil

  val dsn = conf.get[String]("sentry.dsn")
  val packages = Packages.mkString(",")
  val params = Map(
    "environment" -> env.mode.toString,
    "stacktrace.app.packages" -> packages,
    "servername" -> InetAddress.getLocalHost.getHostAddress
  )
  val full = s"${dsn}?${params.map { case (k, v) => s"${k}=${v}" }.mkString("&&")}"
  Sentry.init(full)
}
```

コードは長いですがやってることはそんな難しくなくて、

- 設定はDSNのURIにパラメータとしてくっつける
- このパラメータをEnvironmentその他から生成する
- DIのModuleで一度だけSentry.initにフルのDSNを渡して実行する

だけです。

このModuleを有効にするにはapplication.confに以下をセットします。

```conf
play.modules.enabled += "modules.SentryModule"
sentry.dsn = "https://hoge@sentry.io/fuga"
```

## Logbackの設定
公式を読むのが早いです。

https://docs.sentry.io/clients/java/integrations/#logback

## 動作確認
以上で設定は完了です。Sentryはイベントが発生しない限りデータを送信することが無いので、わざと例外を発生させるエンドポイントを作っておくと動作確認がとても楽になります。
Jersey Client で JavaからAPI連携する

#必要なmaven
以下3つが必要

```xml
           <groupId>org.glassfish.jersey.core</groupId>
           <artifactId>jersey-client</artifactId>
           <version>2.27</version>
       
           <groupId>org.glassfish.jersey.media</groupId>
           <artifactId>jersey-media-json-jackson</artifactId>
           <version>2.26</version>
       
           <groupId>org.glassfish.jersey.inject</groupId>
           <artifactId>jersey-hk2</artifactId>
           <version>2.26</version>
  
```

足りないと

>java.lang.ClassNotFoundException: org.glassfish.jersey.internal.l10n.LocalizableMessageFactory$ResourceBundleSupplier

こういうわけわかんないエラーでる

#実装:POSTで連携する
✩﻿http://localhost:8080/test/api1 のAPIを呼びたい

```Java
public void excute(RequestData req) {
		
		String result = ClientBuilder.newClient()
				// 連携先の決まってるurl
				.target("http://localhost:8080")
				// パス 連携先で変わるところ
				.path("/test/api1")
				//Xml形式でリクエストするかJSON形式でリクエストするか決めるところ　  
                // xmlならこれを指定→APPLICATION_XML_TYPE
				.request(MediaType.APPLICATION_JSON_TYPE)
				// データ突っ込む
                //MediaTypeでなんの形式でレスポンス受け取るか指定今回はJSON
				.post(Entity.entity(req, MediaType.APPLICATION_JSON), String.class);

		// 標準出力にレスポンスを表示
		System.out.println(result);

	}
```
GoogleアナリティクスのPV数をSlackに自動送信する

今回はタイトル通り、
Googleスプレッドシートのアドオンで取得したアナリティクスのPV数をビジネスチャットアプリSlackに日次配信する方法を紹介します！

以下記事様々なGASの記事を紹介してます！
https://bzbot.work/

## 紹介記事
今回紹介している記事は以下です！
https://bzbot.work/2019/02/19/analytics-slack/

```javascript:GAS
function postSlack() {
  //スプレッドシートのIDを指定（いつも指定している仕方でもどっちでもOKです^^）
  var sheet = SpreadsheetApp.openById('*******************************************');
  //配信するデータをセット
  var sentence = sheet.getSheetByName('配信用').getRange(2,1).getValue();
  var payload  = {
    'text'      : sentence,
  };
  //UrlFetchAppのパラメータとしてoptionsをセット
  var options = {
    'method'      : 'post'                 ,
    'contentType' : 'application/json'     ,
    'payload'     : JSON.stringify(payload),
  };
  //取得したSlack WebhookURLを指定
  var url = 'https://hooks.slack.com/*************************************';
  UrlFetchApp.fetch(url, options);
  
  //送信するアドレス情報をセット
  var address = '送信したいアドレスを指定';
  var today = new Date();
  //タイトルには今日の日付を指定した表示形式で表示する
  var title = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy-MM-dd');
  GmailApp.sendEmail(address, title, sentence);
}
```

##スプレッドシート
スプレッドシート自体はあえてシンプルにコードを書くために『配信用』のシートを作成して、そこで配信するソースを作ってます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/b1c7ea08-c563-dd2c-c956-dfeb62b96db7.png)

##配信結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/45a4b88b-f26f-6f01-4603-a085ea942475.png)

##トリガーをセット
以下より、トリガーをセットすることで指定した時間に送信することが出来ます！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/ea14f0e0-12c7-cb69-6b76-4c5d9196984d.png)
意地でも IE を使わずに Firefox をダウンロードする方法

（この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/2019/02/20/012325) とのマルチポストです）

新しい Windows 7 の PC を使おうとしたら Internet Explorer (IE) しか入っていませんでした。
しかし、私は IE が嫌いなので、Firefox を使いたいです。

そこで、Firefox ダウンロードしようと思い…、そこで気づきました。
Windows 7 で Firefox を使おうとしたら、まず最初に IE を起動しなくてはいけません。

しかし、<font color="#ff0000">**私　は　I　E　が　大　嫌　い　で　す。**</font>  

そこで、Windows の機能だけで Firefox をダウンロードする方法を編み出してみました。

## IE を使わずに Firefox をダウンロードする

1. 「ファイル名を指定して実行」を開く
2. 「参照」ボタンをクリック
3. ファイル名欄に https://mzl.la/2inJu0a と入力[^1]して、「開く」ボタンをクリック
![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/205989/7609a976-38b0-ad9a-403e-275d34d4a385.png)
4. 「ファイル名を指定して実行」の名前欄に C:\Users\… で始まるパスが入っているので、その前後に文字を付け加えます。  
`cmd /c move "(入力されたパス)" "(移動先のパス)\Firefox.exe"`
![filedialog.png](https://qiita-image-store.s3.amazonaws.com/0/205989/ac6a37b6-4a3b-c9e6-b478-38d27c9ecd3a.png)
5. 「OK」ボタンをクリック  

これで、Firefox をインストールできるようになりました！！
![Firefox.png](https://qiita-image-store.s3.amazonaws.com/0/205989/575b8725-e268-376a-8a35-8d27a2ca3837.png)
[^1]: https://download.mozilla.org/?product=firefox-latest&os=win&lang=ja への短縮URL

## なにやってるの？

ファイルを開くダイアログには「URLからファイルをダウンロードして開く」という機能があります。それを使って、インストーラをダウンロードしました。    
ただ、そのままだとファイルに拡張子がつかないので実行できません。
そこで、最後にファイルを移動しつつ拡張子を付けています。

これで、IE を使わずに済みますね！[^2]
[^2]: Windows 10 なら、curl が使えるのでもっと簡単に Firefox をダウンロードできます。

## 豆知識

https://bit.ly/firefox へアクセスすると IE のページに飛びます。
react-router + React Hooks

## 追記(2019/9/26)

- React Routerがv5.1でhooks対応しました
- [React RouterがHooks対応したので使い方を整理する](https://qiita.com/ozaki25/items/bb0eb273611eebc603dd)という記事を書いたのでそちらをご参照下さい

## 概要

- react-routerをHOCではなくHooksを使って実装したメモ
- [use-react-router](https://github.com/CharlesStover/use-react-router)を使う

## 手順

- プロジェクト作成とモジュールのインストール

```zsh
mkdir react-router-with-hook
cd react-router-with-hook
yarn init -y
yarn add react react-dom react-router-dom use-react-router
```

- `index.html`の作成

```html:index.html
<div id="root"></div>
<script src="./index.js"></script>
```

- `index.js`の作成

```jsx:index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import useReactRouter from 'use-react-router';

function Hello() {
  const { history, location, match } = useReactRouter();
  return (
    <div>
      <h1>HelloWorld</h1>
      <p>{`pathname: ${location.pathname}`}</p>
      <button onClick={() => history.push('/react')}>Next</button>
    </div>
  );
}

function HelloReact() {
  const { history, location, match } = useReactRouter();
  return (
    <div>
      <h1>HelloReact</h1>
      <p>{`pathname: ${location.pathname}`}</p>
      <button onClick={() => history.push('/')}>Next</button>
    </div>
  );
}

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/" component={Hello} exact />
        <Route path="/react" component={HelloReact} exact />
      </Switch>
    </Router>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
```

- 簡単に説明しておくと、HelloコンポーネントとHelloReactコンポーネントがあり前者が`/`が後者が`/react`にルーティングされるようにしている
- コンポーネント内で以下のように`useReactRouter()`を使うだけで`history`や`location`といった情報を取ることができる

```js
const { history, location, match } = useReactRouter();
```

## デモ

- 以下のコマンドで起動できる

```zsh
npx parcel-bundler ./index.html
```

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/2e09e951-a21e-3d9c-0acb-1594476127f6.gif)

## まとめ

- Hooksのおかげでreact-routerを使うのもよりお手軽になった
- use-react-router便利
responder1.2.0でのstarlette依存関係について【2019/02/20現在】


responder勉強2日目です。
responder1.2.0の環境構築の際に日本語での情報が古くてつまづいたので、最新版のメモです。
## 環境
```
python3.7.2
responder==1.2.0
```
## 旧情報
```requirements.txt
starlette==0.8
```
いくつかのページでも載っていましたが、こちらのバージョンでは動きません。
以下のようなエラーが出ます。

```
ModuleNotFoundError: No module named 'starlette.middleware.lifespan'
```
このエラーは以前までのものと微妙に違います。
以前は下のようなエラーでした。

```
ModuleNotFoundError: No module named 'starlette.lifespan'
```
## 解決策
```requirements.txt
starlette==0.10
```
正しくは、こちらになります。
## 補足
なお、starletteのバージョンは、すでに0.11がリリースされていて、
また、構成が変わっているので最新版でも動きません。
## 参考ページ
https://github.com/kennethreitz/responder
https://github.com/kennethreitz/responder/commit/49114f36ce2c19fa10fd9a7a37230459a9ba4da7
forked digdag パッケージを作ってダウンロードできるようにする

digdag に PR を送ったものの、まだマージされていない or マージされたけどリリースされていない、がすぐ使いたいということは**よくありますよね**。

そういう時にどうしているか。特に公開しても困らなそうな内容になったので public internet にあげておきます。

## 大方針または心構え

* あくまでも一時しのぎ。
* 社内専用の private なパッチは当てない。技術的負債になるので絶対にしない。
* 本家にマージされてリリースされたら可及的速やかに本家に切り替える。
* 本家に切り替えられるように、本家にマージされるまで根気強く頑張る。

## 方針

github で本家を public fork して Releases に jar を置く。

* public なパッチしか当ててないので public fork で OK
* public repo なら認証不要で簡単にダウンロードしてインストールできる

## パッケージの作り方

ビルドについては [digdag の自前ビルド](https://qiita.com/sonots/items/cfa9a8e1e8902d94ed91) を参照。

実例として v0.9.33 に [#994](https://github.com/treasure-data/digdag/pull/994) の PR をマージしてビルドしたい場合を、著者の所属会社orgである github.com/st-tech で解説。

```
$ VERSION=v0.9.33
$ PR=944
$ BRANCH=${VERSION}-patched-${PR}
$ git clone git@github.com:treasure-data/digdag
$ cd digdag
$ git remote add fork git@github.com:st-tech/digdag
$ git checkout -b ${BRANCH} refs/tags/${VERSION}
$ git fetch origin "+refs/pull/${PR}/head:refs/remotes/pull/${PR}/head'"
```

取り込みたい commit を cherry-pick していく。TODO: もう少し楽にならんですかね

```
$ git cherry-pick 08db8efd2e0ce88f98a6226ae515d954bee11319
$ git cherry-pick e9574a00c236446100a8a416ded9bf8957a53cd5
$ git cherry-pick c7fba0dcd1aac83284a139497381f17a5c4995a8
```

version をいじる

```diff
diff --git a/build.gradle b/build.gradle
index adf1384281..583cc8bce4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,7 +12,7 @@ apply plugin: 'maven'

 allprojects {
     group = 'io.digdag'
-    version = '0.9.33'
+    version = '0.9.33-patched-994'

     ext {
         isSnapshotRelease = version.endsWith('-SNAPSHOT')
diff --git a/digdag-client/src/main/resources/io/digdag/client/version.txt b/digdag-client/src/main/resources/io/digdag/client/version.txt
index 2e665126a5..68cebab229 100644
--- a/digdag-client/src/main/resources/io/digdag/client/version.txt
+++ b/digdag-client/src/main/resources/io/digdag/client/version.txt
@@ -1 +1 @@
-0.9.33
+0.9.33-patched-994
```

コミットして push しておく

```
$ git commit build.gradle digdag-client -m ${BRANCH}
$ git push fork ${BRANCH}
```

ビルド

```
$ ./gradlew cli
```

pkg/v0.9.33-patched-994.jar ができるので GitHub の Releases タブから release を作ってアップロードする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9641/a7739edf-e742-d9b3-3c07-d6acabc5dc16.png)

https://github.com/st-tech/digdag/releases/tag/v0.9.33-patched-994


すると

```
$ curl -o ~/bin/digdag --create-dirs -L https://github.com/st-tech/digdag/releases/download/v0.9.33-patched-994/digdag-0.9.33-patched-994.jar
$ chmod +x ~/bin/digdag
```

のようにインストールできるようになる。

## おわりに

頻繁にやるなら CI 化とかしたくなるかもしれないが、あくまで一時しのぎなのでだいぶ手動感あります。
JQueryのセレクタ指定の方法

## この記事について
JQueryのセレクタの指定方法をまとめています。

## 指定方法
指定方法はいくつかあるが、ここでは基本的なものだけまとめる。

```html
＜指定方法＞
$('hoge')
→htmlのhogeタグ要素を指定

$('hoge > huga')
→hoge要素直下のhuga要素を指定

$('hoge huga')
→hoge要素内のhuga要素を指定

$('hoge, huga')
→hoge要素とhuga要素を指定

$('hoge + huga')
→hoge要素に隣接するhuga要素を指定

$('#hoge')
→id="hoge"を指定

$('.hoge')
→class="hoge"を指定
```

##サンプルコード

上記の指定方法のわかりにくものだけ抜粋

```html:sample.html
    <ul id="main">
        <li>0</li>
        <li class="hoge">1</li>
        <li class="hoge">2</li>
        <li>
            3
            <ul id="sub">
                <li>3-0</li>
                <li>3-1</li>
                <li class="hoge">3-2</li>
                <li class="hoge">3-3</li>
                <li>3-4</li>
            </ul>
        </li>
    </ul>
  <script>
    $(function(){
      $('#main > .hoge').css('color', 'red');
    });
  </script>
/１と２が赤に変わる
```

もういっちょ

```html:sample.html
    <ul id="main">
        <li>0</li>
        <li class="hoge">1</li>
        <li class="hoge">2</li>
        <li>
            3
            <ul id="sub">
                <li>3-0</li>
                <li>3-1</li>
                <li class="hoge">3-2</li>
                <li class="hoge">3-3</li>
                <li>3-4</li>
            </ul>
        </li>
    </ul>
  <script>
    $(function(){
      $('.hoge + .hoge').css('color', 'blue');
    });
  </script>
/2と3-3が青に変わる
```
【Swift】日本語を含んだ文字列をURLやNSURLにするとnilになる

## 概要
`URL(string: String)`や`NSURL(string: String)`を利用してStringをURLやNSURLにしようとする時に、

```.swift
let urlString: String = "https://google.com/search?q=ドラゴンクエスト"
let url = URL(string: urlString)  //nil
```

こんな感じで **URLにする文字列自体に日本語が含まれている** と`nil`が返ってきてしまいます。

## 解決策
文字列にパーセントエンコーディングをかけることで無事に変換できるようになります。

```.swift
let urlString: String = "https://google.com/search?q=ドラゴンクエスト"
let encodeUrlString: String = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL(string: encodeUrlString)
//https://google.com/search?q=%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88
```

ちなみにデコードは`.removingPercentEncoding`で可能です。

```.swift
let urlString: String = "https://google.com/search?q=%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88"
let decodeUrlString: String = urlString.removingPercentEncoding
//https://google.com/search?q=ドラゴンクエスト
```

## 余談 : パーセントエンコーディングとは
パーセントエンコーディングとは、ざっくり説明すると **URLで使えない文字をパーセント(%)と英数字の組み合わせで表現すること** です。

例えばひらがなの「あ」は「%E3%81%82」、「い」は「%E3%81%84」のように表現されます。

普段我々が日本語のキーワードで検索をしている時も、URLにはパーセントエンコーディングが使われています。

## おわりに
いまドラクエ11を絶賛進行中です。**セーニャかわいい。**
【備忘録】pyenvの使い方

#1. はじめに
自分用のpyenvの使い方メモです．
仮想環境構築初心者向けです．

#2. pyenvの使い方
##バージョンのインストール

インストール可能なバージョンを表示

```bash
$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
...
```
バージョンを指定してインストール
`$ pyenv rehash`は新規インストール時に必要な処理らしい．

```bash
$ pyenv install バージョン名
$ pyenv rehash
```



###※anacondaインストール時の注意点
anacondaをインストールした時は環境変数のパスを指定してあげる必要があります．
これをしないとanacondaの仮想環境を構築した時に，バージョンはanacondaのはずなのに`conda`コマンドが使えなかったりします．

```bash
$ echo 'export PATH="$PATH:$PYENV_ROOT/versions/<pyversion>/bin/"' >> ~/.bashrc
$ source ~/.bashrc
```


##環境の指定
グローバルに使用するバージョンの指定

```bash
# バージョンの指定
$ pyenv global 3.7.0

# バージョンが変更されたか確認する
$ pyenv version
Python 3.7.0
```

ディレクトリ内でローカルで使用するバージョンの指定

```bash
$ cd ~/work
$ pyenv local 3.7.0
$ pyenv version
Python 3.7.0

$ cd ~
$ pyenv version
Python 3.6.0
```

##バージョンの確認

インストールしたバージョンを確認

```bash
$ pyenv versions
3.7.0(set by /Users/XXXX/.pyenv/version)
3.7.0/envs/test
test
```

現在のバージョンを確認

```bash

$ pyenv version
3.7.0(set by /Users/XXXX/.pyenv/version)
```





#3. 仮想環境構築

仮想環境の構築は，pyenv-virtualenvとanacondaの2種類の構築方法があります．私は基本的にはanacondaの仮想環境構築だけで満足しているので，そっちをメインで使っています．

##pyenv-virtualenvでの仮想環境構築
pyenv-virtualenvとはpyenvのプラグインです。pyenv-virtualenvもインストールしてあることを前提とします．

```bash
$ pyenv virtualenv バージョン名 環境名
```
使用例：

```bash
$ pyenv virtualenv 3.7.0 test
$ pyenv versions
3.7.0
3.7.0/envs/test
test
```

作成した仮想環境を有効にします．
以下の方法以外にも，`$ pyenv local 環境名`としてディレクトリのバージョンを指定して，ディレクトリに仮想環境を固定する方法もあります．

```bash
# 仮想環境を有効
$ pyenv activate <tag>

# 仮想環境を終了
$ pyenv deactivate
```

仮想環境の削除

```
$ pyenv uninstall 環境名
```

##anacondaによる仮想環境構築

###anacondaでの基本操作

仮想環境の確認

```bash

$ conda info -e
```

ライブラリ一覧の表示

```bash

# 現在の環境のライブラリ一覧
$ conda list

# 指定した環境のライブラリ一覧
$ conda list -n 環境名
```

使いたいライブラリと対応するpythonのバージョン一覧

```bash

$ conda search ライブラリ名
```

###仮想環境構築

仮想環境の作成

```bash

# pythonも何もない環境
$ conda create -n 環境名

# 最新バージョンのpythonがインストールされる
$ conda create -n 環境名 python

# 指定バージョンがインストールされる
$ conda create -n 環境名 python=バージョン
$ conda create -n 環境名 python=バージョン numpy=バージョン

# anacondaにインストールされている全部のライブラリがインストールされる
$ conda create -n 環境名 anaconda
```

仮想環境の起動
`$ source activate 環境名`はpyenvとanacondaのactivate衝突問題により使えないので注意！

```bash

$ conda activate 環境名
```

仮想環境の終了

```bash

$ conda deactivate
```


###仮想環境にライブラリを追加

condaが対応しているライブラリか確認

```bash

$ conda search ライブラリ名
```
ライブラリのインストール

```bash

$ conda install ライブラリ名
```

インストール結果の確認

```bash

$ conda list
```
matplotlibで作ったグラフをtikzで出力する

# はじめに
matplotlib2tikzというパッケージを発見.

このパッケージはmatplotlibでグラフ作って, Tikzという画像を生成できる言語で出力させることができます.
Tikzについては以下の記事でお願いします.

[PGF/Tikzをオススメする記事](https://qiita.com/seekworser/items/0ef417ab788e0786d59a)

# 環境
- MacOS Sierra 10.12.6
- python 3.6.3
- matplotlib 3.0.0
- numpy 1.14.5
- Pillow 5.4.1
- six 1.11.0
- matplotlib2tikz 0.6.18 

##インストール
terminalに次のように打ち込んでインストール

```terminal
pip install matplotlib2tikz
```
依存関係にあるパッケージは
matplotlib, numpy, Pillow, six
のようなのでなければ追加でインストールされます.

# 使い方
使う前に以下のようにパッケージを読み込ませる.

```python
from matplotlib2tikz import save as tikz_save
```
普段通りmatplotlibでplotしてsavefigを呼び出す代わりに

```python
tikz_save('hoge.tex')
```
で保存すればよいようです.

# やってみる
では実践.
$y=\sin x$と$y=\cos x$を描いてみたいと思います.
pythonのソースコードで以下のようにします.
当然tex内に埋め込むので数式環境は$で囲めば使用することが可能です.

```python
import matplotlib.pyplot as plt
import matplotlib2tikz.save as tikz_save
import numpy as np

x = np.linspace(-4.0, 4.0, 100)
y1 = np.cos(x)
y2 = np.sin(x)

plt.plot(x, y1, label = '$y=\cos x$')
plt.plot(x, y2, label = '$y=\sin x$')

plt.xlabel('$x$')
plt.ylabel('$y$')

plt.ylim(-1.0, 1.0)

# 凡例を表示
plt.legend()

# グリッドを表示
plt.grid()

# 保存
tikz_save('scos.tex')
```
このようにすると, scos.texが出来上がるので, このできたtexを挿入しますがプリアンブルに以下を追加します.

```tex
\usepackage[utf8]{inputenc}
\usepackage{fontspec} % This line only for XeLaTeX and LuaLaTeX
\usepackage{pgfplots}
```
fontspecはXeLaTexかLuaLaTexを使うときに入れればいいようです.
今回はplatexでコンパイルするのでutf8とpgfplotsを使用します.

```tex
\documentclass[border=0.5pt,class=jsarticle]{standalone}
\usepackage[dvipdfmx]{graphicx}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}

\begin{document}
　　　　\input{scos.tex}
\end{document}
```
そしてplatex⇨dvipdfmxでpdfにすると以下のような絵が現れます.
![スクリーンショット 2019-02-19 23.46.36.png](https://qiita-image-store.s3.amazonaws.com/0/270960/7b722786-f168-50de-e1a4-711a3555d25e.png)

# まとめ
綺麗なグラフが出てきた！
Webブラウザで手軽にファイル共有

###開発の経緯
ＩＴがあまり得意でないお客さんとのやり取りする際、Webブラウザで手軽にかつ安全にファイル共有できたらと思い、ファイル共有とファイル転送の中間のイメージで開発しました。

https://clipfile.net/

###特徴
クローズ型のサービスですが、共有相手側ではユーザー登録の必要はなく、規約に同意するだけで利用できます。ファイル共有というかなり古典的な分野ですが、SNSライクなUIにして、パソコンに不慣れな人でも使いやすいサービスを目指しています。

###今後の方針
まだバグも残っていますし、仕様を決めかねている所もあり、感想だけでも色々とご意見いただければ幸いです。今後ニーズがあれば、ご意見頂戴しながら、バージョンアップしていければいいなと思っています。

以上、どうぞよろしくお願いします。
Livedoorの自動投稿スクリプト（自分用メモ）

# Webスクレイピングで投稿するページを見つける
```python
import urllib.request
from bs4 import BeautifulSoup
# URL設定
url = 'https://xxx'
# 読み込み
html = urllib.request.urlopen(url)
# HTMLパース
soup = BeautifulSoup(html, "html.parser")
```
これでsoupの中にHTMLのデータが存在しますので、.find(タグ)や.get(クラス)などで詳細が取得できます。
# 最適化する

# Livedoorに連携して自動投稿する

# リファレンス
[Webスクレイピング](https://qiita.com/y-tksk/items/881127d401d4338cec82)
[NewsAPI](http://www.rychdata.com/the-news-api-requesting-live-headlines-with-python.html)
[Pandas](http://sinhrks.hatenablog.com/entry/2015/01/28/073327)
[git][OSS]Upstream開発

<p>GitHubで公開されているオープンソースなコードを利用する際、修正が必要になった場合の対応方法として、Upstream開発の手順を説明する。</p>

<p>Upstream開発とは、簡単に説明すると、修正内容を本家にpull requestを投げて取り込んで貰い、独自に手を加えてしまった結果、本家から枝分かれする状況を避ける方法だ。</p>

<p>利用しているOSSへの貢献にもなるので、一石二鳥とも言える。</p>

GitHubでforkする
<p>GitHubで本家から自分の領域にforkする。</p>

<p>理由は、本家のリポジトリは普通はpush権限がないので、修正は自分のリポジトリに対して行う。</p>

自分の作業領域にcloneする

<pre><code>$ git clone git@github.com:murakami/cocos2d-x.git
$ cd cocos2d-x
</code></pre>

本家と内部のリポジトリをリモートに追加する
<p>forkしたリポジトリで修正作業を行うのでなく、別に内部のリポジトリが存在する前提で、本家と内部のリポジトリをリモートに設定する。</p>

<p>その理由は、後で分かる。</p>

<pre><code>$ git remote add upstream git@github.com:cocos2d/cocos2d-x.git
$ git remote add bitz ssh://git@git.bitz.co.jp/bitz/cocos2d-x.git
$ git remote
bitz
origin
upstream
</code></pre>

<p>設定されていることを確認。</p>

本家とfork先を同期する

<pre><code>$ git fetch upstream
$ git pull upstream ブランチ名
$ git push origin ブランチ名
</code></pre>

内部リポジトリの修正内容をfork先にchery-pickで取り込む

<pre><code>$ git fetch bitz
$ git checkout -b feature/修正ブランチ名
$ git cherry-pick XXXXXX
$ git push origin feature/修正ブランチ名
</code></pre>

本家に対してPull requestを作成する
<p>GitHubのforkしたリポジトリのPull reqestsで、本家のブランチに対してPull requestが作成する。
</p>

<p>forkしたブランチは公開されているものなのと、余計なログで汚れていないことが望ましいということで、forkしたブランチで開発作業を行うのは避けたほうがいい。</p>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/117577/">Cocoa.swift 2019-02</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
Railsでrange付きsend_fileを省メモリで行う方法 (実装中)

## 概要

以下の要件を満たしたい。

- rails
- range付きでsend_fileしたい
- 省メモリ

## Railsのsend_fileはどう実装されているのか？

以下のように、rangeに対応していない。

- https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/actionpack/lib/action_controller/metal/data_streaming.rb#L69
- https://github.com/rails/rails/blob/08a93efab6bdf10ba7afafb6e51f4b7809c97ebc/actionpack/lib/action_dispatch/http/response.rb#L325

メモ: to_pathにrespondさせることで、RackのSendFile middlewareのX-SendFileの処理にひっかかるようにしている。

メモ: send_dataの実装
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/actionpack/lib/action_controller/metal/data_streaming.rb#L109

## Railsのsend_fileをrangeに対応させた既存の実装

以下のような実装だが、ファイルをメモリ上に読み込むので、省メモリではない。

https://stackoverflow.com/questions/13280044/rails-send-file-dont-play-mp4

実際、俺はこの実装を使ってメモリ肥大化に苦しんだ。

## Rackのsend_file(相当の機能)はどう実装されているのか？

以下のように、rangeに対応しつつ、少しずつ読み込んで返す実装らしい。

https://github.com/rack/rack/blob/0a92893d5442496e4642231bad2d80a1ab84d5e0/lib/rack/file.rb#L115

## 簡単な方法

rangeで切り出したファイルを別のファイルとして保存し、それをRailsのsend_fileで送信する。

ディスクも節約したい場合は使いづらい。
また、send_file直後に一時ファイルを削除するかんたんな方法もない(railsでafter response sent的なワードでぐぐってもそれらしいものが出てこない)。
Tempfileを使えばGC時に削除するのは可能。

-> Rack::TempfileReaperを発見 https://github.com/rack/rack/pull/671/files
これを使うと、send_file終了後にtempfileを削除できる

tempfile = Tempfile.new
request.env['rack.tempfiles'] << tempfile

とすれば良い

## かっこいい方法

実装方針

TODO

参考1: https://gist.github.com/mudai/9415701

参考2: 
include ActionController::Live
response.stream.write
response.stream.close

参考3: Rack::TempfileReaper
Swiftのテストライブラリ「Quick」のセットアップ方法

## 「Quick」とは？

テストとテストグループの文法を提供するライブラリです。

RSpec, Specta, Ginkgoにインスパイアされているので、これらでテストを書いたことがある方はとっつきやすいと思います。
私はどれも使ったことがないので詳しくはわかりません。

## 「Nimble」とは？

アサーションの文法を提供するライブラリです。

QuickとNimbleは片方のみ導入することもできます。

## Quick導入のメリデメ

標準のXCTestと比べ、以下のメリット・デメリットがあります。

### メリット

__可読性が高い__
テスト対象クラスやメソッドをdescribeに、条件をcontextに、期待する動作をitに書く、と決まっているので、テストを書くときにあまり迷わず、他人が書いたテストコードを読むときも読みやすいです。

__アサーションが書きやすい__
アサーションを直感的に記述することができます。

```swift
// XCTest
XCTAssertEqual(foo.count, 3)

// Nimble
expect(foo.count) == 3
```

__失敗時のエラーメッセージがわかりやすい__
テスト失敗時のエラーメッセージが自動でわかりやすく出力されます。
エラーメッセージを手動で記述する必要がほぼありません。

### デメリット

__ネストが深くなる__
`class` , `spec` , `describe` , `context` , `it` の5つはQuickでほぼ必須なので、最低でも5ネストになります。
`describe` などを2つ以上使う場合、それ以上にネストします。
インデントを4→2文字にするのもありかもしれません。

__行番号をクリックしてテストメソッド単体でテストできない__
XCTestだとテストメソッドごとに行番号をクリックするとそのメソッドのみテストできます。
しかし、Quickだとitの横にテスト実行ボタンが表示されないので、テストファイルからテストメソッド単体で実行することができません。

<img width="410" alt="スクリーンショット 2019-03-11 23.33.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/138245/1c47d338-7b3d-258a-79f9-242651de43fd.png">


## 環境

- Swift：4.2.1
- Xcode：10.1 (10B61)
- Quick：2.0.0
- Nimble：8.0.1

## ライブラリのセットアップ

Cartfileに以下を追加し、Carthageからインストールします。

```diff:Cartfile
+ github "Quick/Quick"
+ github "Quick/Nimble"
```
製品ターゲットでなく __テストターゲット__ に追加する以外は他のライブラリと同様です。
https://qiita.com/uhooi/items/ba20a604182ef25f6d7a#carthageのセットアップ

## テンプレートのインストール

ターミナルで以下を実行し、XcodeにQuickのテンプレートをインストールします。

```shell-session
$ git clone https://github.com/Quick/Quick.git
$ cd Quick/
$ rake templates:install
```

<img width="737" alt="スクリーンショット_2019-03-11_23_17_55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/91b4452c-cc3f-3269-4ffe-d8898592f906.jpeg">

公式ドキュメントにはAlcatrazによるインストール方法も記載されていますが、Xcode 8以降はサポートされていないため、Rakefileから手動でインストールするのがベターです。

## 参考リンク

- [Quick/Quick: The Swift (and Objective-C) testing framework.](https://github.com/Quick/Quick)
- [Quick/InstallingQuick.md at master · Quick/Quick](https://github.com/Quick/Quick/blob/master/Documentation/ja/InstallingQuick.md)
- [Quick/InstallingFileTemplates.md at master · Quick/Quick](https://github.com/Quick/Quick/blob/master/Documentation/ja/InstallingFileTemplates.md)
git merge の小さなサンプルメモ①

## 前提
- アカウントは2つ（A, B）
- 片方のアカウントからブランチを切ってPR
- マージされるまで

## メモ

1 初期状態

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/9b74b5d0-261e-2ddd-228a-e3ce6161a5c0.png)

2 アカウントBで作業、ブランチ切る（feature/fix）、push

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/de5ad9a9-2e0c-be51-6a9f-7ad61621cbbd.png)

3 PR作ったあと、Masterにマージされたところ。
2の作業のときのコミットに加えてマージコミットが追加される

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/f96f90a2-b396-f9e3-4ea3-8b35dd19b970.png)
Docker で Laravel 環境 を ３分くらいで作る


これだけです。

DBMSは  MariaDB となっているようです。

>https://github.com/bitnami/bitnami-docker-laravel

```bash
$ mkdir ~/myapp && cd ~/myapp
$ curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-laravel/master/docker-compose.yml
$ docker-compose up
```
上記のコマンドは、myappという名前のLaravel開発用コンテナサービスを作成し、新しいLaravelアプリケーションをアプリケーションディレクトリにロード（ブートストラップ）します。あなたはアプリケーションを開発するためにあなたの好きなIDEを使うことができます。

注意

アプリケーションディレクトリに既存のLaravelアプリケーションのソースコードが含まれている場合、Bitnami Laravel Development Containerは新しいアプリケーションをブートストラップするのではなく、既存のアプリケーションをロードします。

Artisanのアプリケーションサーバーがmyappサービスで起動された後、お気に入りのWebブラウザでhttp：// localhost：3000にアクセスすると、デフォルトのLaravelウェルカムページに迎えられます。

Laravel Development Containerに加えて、docker-compose.ymlファイルはMariaDBサービスもLaravelアプリケーションのデータベースバックエンドとして機能するように設定します。

2020/02/25 追記
DBMS を MySql へ変更したい場合

>https://github.com/bitnami/bitnami-docker-laravel/issues/122

This docker-compose.yml works for me:

```yml
version: '2'

services:
  mysql:
    image: 'bitnami/mysql:5.7'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_USER=my_user
      - MYSQL_DATABASE=my_database
      - MYSQL_PASSWORD=my_password

  myapp:
    tty: true
    image: bitnami/laravel:6-debian-9
    environment:
      - DB_HOST=mysql
      - DB_USERNAME=my_user
      - DB_DATABASE=my_database
      - DB_PASSWORD=my_password
    depends_on:
      - mysql
    ports:
      - 3000:3000
    volumes:
      - ./:/app
    # privileged: true # Privileged mode could be required to run this container under Windows
```

以上です。
Swift アラートが出せない場合

## アラートが出せない場合
presentした後など、出せない場合のメモ

```swift
let alert = UIAlertController(title: "Error", message: "error message", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(okAction)

var baseView = UIApplication.shared.keyWindow?.rootViewController
while ((baseView?.presentedViewController) != nil)  {
    baseView = baseView?.presentedViewController
}
baseView?.present(alertController, animated: true, completion: nil)
```
（作業トレース）Windows10にChainer5.3.0を入れる忘備録

# 目的
Windows10にChainer5.3.0(執筆時のstable)を入れたい。
これまでUbuntuで使っていたが，windowsで使用しているソフトウェアを連携して使いたいため。いちいちOSを切り替えるのがさすがに面倒。
これまでChainerが1系と2系だった時にwindowsに入れようとしたことがあったが，失敗してwindows10自体を入れなおすことになったりしていた。

今回はすでにできている報告があるので，とりあえずほぼその通りにやればできると思う。

# 環境と方法

- windows10
- conda 4.6.7
- python 3.7.1

Anaconda環境があるので，それをつかってやりたい。
方法は
https://qiita.com/shionhonda/items/02ce5350d32fa8abb3eb
に準ずる。

# インストール
## conda環境
https://qiita.com/yampy/items/4e89cd97179bbd20f726

env-chainer5という名前でconda仮想環境をつくる。

```
conda create -n env-chainer5 python=3.7
```
activateする。

```
activate env-chainer5
```

## visual studio2017の更新
すでにインストールしていたので更新する。
また画像の「デスクトップ用VC++ 2015~~~」がインストールされていなかったので追加インストールする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122102/b007d64d-f930-ac84-f2e4-6c1cc018773a.png)

方法の通りパスを追加。

## Cuda Toolkit 9.1
一応インストールしなおす。
pathなども設定。

## cupy, chainer
作成したconda環境をactivateしてpipでインストール。

# 完了

サンプルの`train_mnist_data_parallel.py`を実行してみて普通に学習できた。
TLA+のインストール手順

# TLA+のインストール手順

## TLA+ Toolboxをインストールする
基本的には公式にあるとおり
https://lamport.azurewebsites.net/tla/toolbox.html

### Windowsの場合
https://github.com/tlaplus/tlaplus/releases/tag/v1.5.7
から [TLAToolbox-1.5.7-win32.win32.x86_64.zip](https://github.com/tlaplus/tlaplus/releases/download/v1.5.7/TLAToolbox-1.5.7-win32.win32.x86_64.zip) をダウンロードして、展開します。環境変数PATHに展開したパスを追加します。

### Mac OS Xの場合
https://github.com/tlaplus/tlaplus/releases/tag/v1.5.7
から [TLAToolbox-1.5.7-macosx.cocoa.x86_64.zip](https://github.com/tlaplus/tlaplus/releases/download/v1.5.7/TLAToolbox-1.5.7-macosx.cocoa.x86_64.zip) をダウンロードして、展開して、Applicationフォルダにコピーするだけです。最初に起動するときにセキュリティの問題があるとかで起動できない場合は、右クリックで「開く」を選択すると、確認ダイアログがでるのでそこで確認すれば、以降はクリックだけで起動できるようになります。

## Javaランタイムをインストールする
TLA+を起動したときにJavaランタイムがインストールされていないとエラーが出る場合はJavaランタイムをインストールしてください。こちらからダウンロードできます。

https://www.java.com/ja/download/

OpenJDKを使う場合は、OpenJDK11.0.2だとToolbox-1.5.7が動作しなかったので、他のバージョンを選択してください。OpenJDK10で動作することを確認してます。古いバージョンのOpenJDKは https://jdk.java.net/archive/ からダウンロードできます。
サイズの大きなCADデータをARKitに取り込む方法について


# はじめに

会社のCADで作られた3Dデータ（STEPファイル）をARKit上で利用するにあたり色々つまづいたので、誰かの役に立てばと思い情報をまとめました。

なお、CADデータのコンバートを行なった環境は次の通りです。

- Windows7 Professional 64bit
- Unity Editor 2018.2.15f1 
- CADデータのフォーマット STEPファイル  
※データだけ貰ったのでどのような環境で作られたのかは不明です

# 取り込み方法の結論

まずたどり着いた結論です。

1. [Unity CAD Importer](http://cadimporter.unity3d.jp)でポリゴンを減らしてUnity Editorに取り込む
2. [COLLADA exporter for Unity2017](https://assetstore.unity.com/packages/tools/utilities/collada-exporter-for-unity2017-99793)でdae形式でエクスポートする
3. Xcodeでエクスポートしたdaeファイルを読み込む

# FreeCADを使ってみる

なるべくお金をかけたく無かったので無料でできる方法を探しました。

ネットを調べてみると[FreeCADを使えばBlenderで読み込める](https://neo-sahara.com/wp/2018/03/04/stepファイルをblenderに読み込めるように変換する%E3%80%82/)という情報が見つかったため、さっそく試してみました。

結果としては、

- 15MB程度の小さいサイズのCADファイルの読み込み → 成功
- 100MB越えの大きなサイズのCADファイルの読み込み → 失敗

でした。

# Unity CAD Importerを使ってみる

先の結果よりCADのサイズが影響している可能性が高かったので、読み込み時にポリゴンを減らしてくれるツールを探しました。
色々と探してみましたが、そのようなことができるものはUnity CAD Importer以外見つかりませんでした。

Unity CAD Importerは有償ソフトウェアですが、試用を申し込むことで期間限定のお試し版のライセンスを貰うことができます。

Unity CAD Importerの使い方については[Youtubeに公式の情報](https://www.youtube.com/watch?v=lqiMYgHGVMM)が上がっているのでそちらをご参照ください。

まずUnity CAD Importerの素晴らしかったところは先程FreeCADで読み込みが失敗したファイルもすんなりと読み込みができた点でした。

さらにインポート時に次のような設定をすることで、読み込み後のファイルサイズを格段に小さくすることができました。

- Target Vertices Count -> 65.0K
- Rough Max -> ON
- Mesh Healing -> ON

# COLLADA exporter for Unity2017 を使う

UnityにCADデータをインポートすることができたので次はBlenderでインポートできる形のファイルにエクスポートし、daeファイルにエクスポートすることにしました。

無料でできる方法を探していたのでUnityからのエクスポートは[FBX Exporter](https://assetstore.unity.com/packages/essentials/fbx-exporter-101408)を試してみました。

しかし、エクスポートしたfbxファイルをBlenderで読み込み、daeファイルにエクスポートするところまでうまく行きましたが、Xcodeで読み込むと表面がざらついてとても使い物になりませんでした。

その後調べてみましたが、無料で使える他の方法は見つかりませんでした。

藁にもすがる思いと、そもそもCADをdae形式にするのは無理なんじゃね？という疑念の中、駄目元で「COLLADA exporter for Unity2017」を$20払って試してみました。

その結果何の問題も無くdae形式でエクスポートすることができ、Xcodeで読み込んだ状態もキレイに表示されました。（ヤッタネ！）

# COLLADA exporter for Unity2017 の注意点

このアセットですが、Unity アセットストアなどで入手したrig付きの3Dデータをエクスポートするときには注意が必要です。

~~そのままエクスポートするとぐちゃぐちゃな状態になってしまうので必ず、rigを抜いた状態でエクスポートする必要があります。~~
rigが付いたままでも上手く行くものもありました。

# 最後に

Unity CAD Importerはサブスクリプション型の有償ソフトウェアなので個人で継続的に使うのは敷居が高いですが、
COLLADA exporter for Unity2017 はたった$20なので、ARKitオンリーで開発する人は買っておいて損は無いかと思います。


SceneKitとARKitを使ってARアプリ開発をしたい方向けに情報をまとめていますので、[こちら](https://www.nsunrise.work/p/index.html)もご参照ください。
TTGO ESP-32 OLED 18650で二酸化炭素観測システムの構築

MH-Z19とTTGO　ESP-32をつなげてみました。
![TTGO-CO2-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/065881bd-7156-8996-b3a1-846ff140c03c.jpeg)
![TTGO-CO2-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/040ae454-392e-43e7-2a8b-d9d32ae3640c.jpeg)
https://www.arduinolibraries.info/libraries/mh-z-co2-sensors

もとは、こちら
https://qiita.com/kitazaki/items/1b3859a1d29e60af6489
野良ハック　北崎さんのものを頂いています。

ちなみに、動かなくて悩んでいたところ、ESP-32のシリアルはHardwareSerial を使うこと
serial1と入れると動かない

以下のようなコメントが出ます。
Arduino.ino.cpp.o:(.bss.Serial1+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

![Serial-errr.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/91ff9b1f-b3d5-abed-bc1d-e89763889460.jpeg)

これを解決するのに3か月かかり、

Serial→Ser1など違うものにします。
これはSerialはすでに定義されているということです。
ちなみに、いろいろなライブラリを使おうとしましたが、トラブルに見舞われたので、北崎さんのコードを引用した方が良い気がします。
ちなみに、ArduinoのライブラリでESP32AnalogSoftCalを使ってみましたが、出力されず、使えませんでした・・

次にOLEDにCo2の濃度を表示させますがdisplay.drawStringはStringTextのフォーマットにする必要があります。
変数にして置換しようとしましたが、以下にします。
 display.drawString(X,Y, String(StringTextへ変換するもの));


```

//==============================
// https://qiita.com/kitazaki/items/1b3859a1d29e60af6489
//==============================
#include <WiFi.h>
#include "SSD1306.h"
HardwareSerial Ser1(0);
uint8_t ledPin = 2; // Onboard LED reference
SSD1306 display(0x3c, 5, 4); // instance for the OLED. Addr, SDA, SCLSSD1306 display(0x3c, 5, 4); // instance for the OLED. Addr, SDA, SCL
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char res[9];
uint8_t idx = 0;
bool flag = false;
unsigned long co2 = 0;

void setup() {
  Ser1.begin(115200);
  delay(10*1000);

    pinMode(ledPin, OUTPUT);
    Serial.begin(115200);
    display.init(); // initialise the OLED
    display.flipScreenVertically(); // does what is says
    display.setFont(ArialMT_Plain_24); // does what is says
    // Set the origin of text to top left
    display.setTextAlignment(TEXT_ALIGN_LEFT);
}

void loop() {
    digitalWrite(ledPin, LOW);
    delay(1000);
    digitalWrite(ledPin, HIGH);
    delay(1000);
  Ser1.write(cmd,9);
  while(Ser1.available()>0)
  {
    Ser1.readBytes(res, 9);
    flag=true;
  }
  if(flag)
  {
    flag=false;
    co2 = 0;
    unsigned int resHigh = (unsigned int) res[2];
    unsigned int resLow = (unsigned int) res[3];
    co2 = (256*resHigh)+resLow;
  }
  Ser1.print("co2: ");
  Ser1.print(co2);
  Ser1.println(" ppm");


  if(co2 > 1000){
  Ser1.println("co2:Over ");
  }else{
  Ser1.println("co2:Under ");
  } 
   display.clear(); // clear the display
            display.drawString(0,0, "co2:");
            display.drawString(0,25, String(co2));
            display.drawString(80,25, "ppm");
    display.display(); // display whatever is in the buffer

  delay(5*1000);
}
```

ちなみに、この後いろいろとトラブルが発生することに。
WSLを使えるようにするまでのメモ 

# 目的
- Windowsそのままだと使いたいツールが使えなさそう & VirtualBoxはファイルの移動とか面倒だったのでWSLを使えるようにする。
- 目次
    - WSLでLinux環境を使えるようになるまで
    - Python環境を作る
    - （後日）いろいろカスタマイズする


# WSLでLinux環境を使えるようになるまで
1. MicroSoft StoreからUbuntuをインストールする
2. Windows Subsystem for Linuxを有効にする

以下参考（ほぼコピペ）
https://qiita.com/yo_kanyukari/items/37421f497b7ffaa75502




# Python環境をつくる
##  必要なパッケージを入れる

↓以下参考（コピペ）
https://www.python.jp/install/ubuntu/index.html

```
$ sudo apt update
$ sudo apt install build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev tk-dev

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
```

## pyenv + Pythonを入れる
1. pyenvを導入
2. pyenvを使って、ほしいpythonの環境を入れる（めっちゃカンタンでおすすめ）
3. pythonのバージョンを切り替える

## pyenvを導入
↓以下参考（コピペ）

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

## 2. pyenvを使って、ほしいpythonの環境を入れる

```
pyenv install 3.7.2
```

## 3. pythonのバージョンを切り替える
```
yenv global 3.7.2
pyenv rehash
```

他のバージョンを使いたいときも以下でイケる。
3.4.3を入れたけど、SSLモジュールの問題があるらしくすんなりいかなかったので諦めた。

```
pyenv install pypy3.6-7.0.0
pyenv global pypy3.6-7.0.0
pyenv rehash
```