OmniAICreator/Qiita-1.07M huggingface dataset:
SPRESENSE の ビープ再生機能を使ってみよう

# SPRESENSE の ビープ再生機能を使ってみよう

## はじめに

[SPRESENSE](https://twitter.com/SonyDevJapan) Audio はハイレゾ再生とかハイレゾ録音とか俄かに信じがたい機能が搭載されているようですが、ココではビープ再生機能をクローズアップ！

ビープ再生用の関数は公式ドキュメントの「[ビープ音を鳴らしてみる](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_ビープ音を鳴らしてみる)」に載ってますが、Arduino でメジャーな tone() 関数をこのビープ再生関数に置き換えます。圧電ブザーとかを用意する必要なく、tone() が鳴らせるなんて最高ですよね。ですよね。

## SpresenseTone ライブラリ

ヘッダファイルのみでライブラリというのもおこがましいけどそんなことは気にしない。
https://github.com/baggio63446333/SpresenseTone

この SpresenseTone ライブラリを libraries フォルダにインストールします。

## PlayRtttl ライブラリ

もう一つ ArminJo さんの PlayRtttl ライブラリもインストールします。
本当にすごいのはこっちです。GitHub には思わず Star を付けときました。

https://github.com/ArminJo/PlayRtttl

本人も間違えているようですが、正しくは t が 3 つです

× https://github.com/ArminJo/PlayRttl
〇 https://github.com/ArminJo/PlayRtttl

RTTTL というのは、Ring Tone Text Transfer Language の略で、例えば以下のソースコードでスターウォーズが流れます。

```cpp
static const char StarWars[] PROGMEM
= "StarWars:d=32,o=5,b=45,l=2:p,f#,f#,f#,8b.,8f#.6,e6,d#6,c#6,8b.6,16f#.6,e6,d#6,c#6,8b.6,16f#.6,e6,d#6,e6,8c#6";
```

## SpresenseTone サンプル

examples にある RandomMelody スケッチを起動します。

まぁまぁな曲数が入ってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/641f08b2-2efd-29c8-bd90-1e512cbc8754.png)

PlayRtttlライブラリに内蔵されている音楽をそのまま再生してます(著作権等はクリアになっているものと信じています)。
再生中の動画をUpしようと思いましたがやめておきます。

## さいごに

SPRESENSEボードをもっていれば(もしくはSPRESENSE以外のボードでも圧電ブザーをもっていれば)、簡単に試せるので聴いてみてください。
CatalinaになってからCocoaPodsが動かないよ

# What's happened?

MacをCatalinaにしたはいいものの、CocoaPodｓの操作が全部permissionエラーになる。

`pod install`は当然動かず、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/ca732b11-e72f-8a14-3337-3bdf71a25bc8.png)

再インストールを試みても、`sudo gem install cocoapods`で弾かれてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/2680d40b-0b1d-d2f2-d638-fdc07e9b93e5.png)

Catalinaになってから、アプリケーションごとにアクセス権限を確認されるようになったのですが、それと同じ要因がディレクトリにも波及しているのかもしれないです。

## 暫定対策

エラーとなっている `/usr/bin`へのインストールから、`/usr/local/bin` に変更してインストールしたら動きました。

パワー系ソリューションなので根本解決ではなさそうですが、一旦動かしたい場合には以下のコマンドでインストールディレクトリを`/usr/bin`ではないディレクトリに指定して、cocoapodsを再インストールしてください。

```bash
sudo gem install cocoapods -n /usr/local/bin
```
LINUX シェルスクリプト入門

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


#シェルスクリプトとは
シェルスクリプトとは、シェルで実行するコマンドをまとめて記述したものである。シェルの中で、プログラミング言語を記述するという考え方が近い。もちろん、変数を使うこともできるし、キーボードからの入力を反映させることもできる。

##出力する
シェル上に文字を出力したいときはechoを用いる。

```output.sh
echo "hello"
```

この場合、helloと返される。

##キーボードから入力する
キーボードから文字を入力したい場合、readを用いる。スクリプトの記述を終えると、シェルは入力が可能な状態になる。

```input.sh
read x
#エンターキーを押すと、入力が可能な状態に切り替わる。
```


##ループ文
for文に示した範囲を満たしている間、doからdoneまでの動作が行われる。

```test.sh
for number in {1..99..2}
do
    echo $number
done
```

この場合、変数numberを1から99まで変化させる。1周回るたびにnumberを2加算する。
なお、echoの引数に変数を使用するときは$を付ける。


##四則演算
２つの入力値から四則演算の結果を返す手順は以下の通り。
算術演算をするときは式を (( )) でくくる。


```calculate.sh
read x
read y

echo $(($x + $y)) #和
echo $(($x - $y)) #差
echo $(($x * $y)) #積
echo $(($x / $y)) #商
echo $(($x % $y)) #剰余
```

それぞれの計算結果が出力される。

##数値の比較
3つの入力値x,y,zの大きさを比較する手順は以下の通り。
条件分岐をするときはif文を用いる。ifの後に条件式を書き、thenの後にしたい動作を書く。if文の中が偽の場合にさらに条件式を書きたい場合はelifを用いる。それらの条件式に該当しないものはelseを用いる。
複数の条件式を使用するときは||(or), &&(and)を使い、 [[ ]] でくくる。

```compare_num.sh
read x
read y
read z

if [[ $x == $y && $y == $z ]]; then
  echo "EQUILATERAL"
elif [[ $x == $y || $x == $z || $y == $z ]]; then
  echo "ISOSCELES"
else
  echo "SCALENE"
fi
```

##文字列の比較
文字を比較する式は以下の通り。

```compare_str1.sh
read x
if [[ $x == Y || $x == y ]]; then
  echo "YES"
else
  echo "NO"
fi
```

なお、以下のように　||, &&の代わりに-o, -aを使い、 [ ] でくくっても等価である。

```compare_str2.sh
read x
if [ $x == Y -o $x == y ]; then
  echo "YES"

else
  echo "NO"
fi
```

##文字列の一部を取得
入力値の一部を利用する場合には以下のように記述する。
readでキーボードの入力を読み込み、変数xに代入する。そして、echoでxの中の一部の文字を出力させることができる。

```input2.sh
read x
echo ${x:2:1} #xの3番目の要素(x[2])から1文字出力
```

この場合の例として、キーボードで world と入力すると3文字目の l が出力される。

#参考URL
[【初心者でもわかる】Linuxシェルスクリプト入門 まとめました](https://eng-entrance.com/category/linux/linux-shellscript)
[【Linux入門】if文による条件分岐の方法をわかりやすく解説！ | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/53707)
deferが呼ばれるのはreturn前

```golang
package main
  
import (
        crand "crypto/rand"
        "fmt"
        "github.com/seehuhn/mt19937"
        "math"
        "math/big"
        "math/rand"
        "os"
)

func main() {
        os.Exit(realMain())
}

func realMain() int {
        seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
        rng := rand.New(mt19937.New())
        rng.Seed(seed.Int64())
        r := rng.Intn(2)
        defer fmt.Printf("1\n")
        if r == 0 {
                return 1
        }
        defer fmt.Printf("2\n")

        return 0
}
```

# 実行結果
```sh
$ go run main.go
2
1
$ go run main.go
1
exit status 1
```

## 参考
* [os.Exit()とdefer](https://qiita.com/umisama/items/7be04949d670d8cdb99c)
* [defer と log.Fatal について](https://qiita.com/usoda/items/ddf314a5cb0e56a43d6a)
Basic Authentication with Java 11 HttpClient


In this article, we will create Java 11 HttpClient that accesses Basic Auth protected REST API resource using sync and async mode. We will use Kotlin for a reference implementation.
Spring Boot 2 based Basic Auth Server
You can directly download the Basic Auth Server from Github Repository and run it locally using the below command.
Starting the server using Gradle
```$ ./gradlew bootRun
```

Server will expose http://localhost:8080/api/health endpoint, which can be tested using the below curl command.
```$ curl -i --user admin:password -X GET http://localhost:8080/api/health
```
Java 11 HttpClient
Java 11 HttpClient supports Basic Authentication using authenticator.
We can use either send or sendAsync api for making synchronous and asynchronous (fully non-blocking) requests.
```HttpClient basic authentication - sync client
fun basicAuthSync() {
    val httpClient: HttpClient = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .authenticator(object : Authenticator() {   
                override fun getPasswordAuthentication(): PasswordAuthentication {
                    return PasswordAuthentication("admin", "password".toCharArray())
                }
            })
            .version(HttpClient.Version.HTTP_1_1)
            .build()
    val request = HttpRequest.newBuilder()
            .GET()
            .uri(URI.create("http://localhost:8080/api/health"))
            .build()
    val httpResponse = httpClient.send(request, BodyHandlers.ofString())
    println("httpResponse statusCode = ${httpResponse.statusCode()}")
    println(httpResponse.body())
}
```
PasswordAuthentication is configured for handling HTTP Basic Authentication.
```HttpClient - async client
httpClient.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse<String>::body)
        .thenAccept(System.out::println)
        .join()
Server Response
httpResponse statusCode = 200
{"status":"UP"}
```
What's new in Spring Boot 2
Spring boot 2 is liberated from legacy baggage of deprecated Java releases. Java 8 is the minimum baseline, with Java 9 support. Under the hood Spring Boot, 2 uses Spring 5.
Reactive web programming support with Spring Webflux.
Auto-configuration and starter POMs for reactive Spring Data Cassandra, MongoDB, Couchbase and Redis.
Supports embedded Netty, along with HTTP/2 support for Tomcat, Undertow, and Jetty
Kotlin we supported in Spring Boot 2, along with Junit 5. Now you can write Spring Boot 2 application from scratch in Kotlin. 
A brand new actuator architecture, with support for Spring MVC, WebFlux and Jersey.
Simplified security auto-configuration.
Uses Spring Framework 5 under the hood.
Gradle 4 required, works well with Gradle 5.

*Related blog:*

[Best Java training in chennai](http://bit.ly/34pV1y3)
【TypeScript】@typesが存在しないライブラリのts設定


## What happened?
`@types`をinstallしてない状態でtscすると、 `npm install @types/XXX`と表示され、エラーになる。
`@types`がないライブラリを使ってるときはどうしたらいいの？

```
Type error: Could not find a declaration file for module 'react-vis'. '/Users/pc148/code/cluster-view/node_modules/react-vis/dist/index.js' implicitly has an 'any' type.
  Try `npm install @types/react-vis` if it exists or add a new declaration (.d.ts) file containing `declare module 'react-vis';`  TS7016

    1 | // @flow
    2 | import React, { Component } from 'react';
  > 3 | import { XYPlot, MarkSeries } from 'react-vis';
      |                                    ^
```

## 解決策
型定義ファイルに、`declare module`を追加する。

```ts
// react-vis.d.ts
 declare module 'react-vis';</br>
```

## links
- https://stackoverflow.com/questions/52761075/react-could-not-find-a-declaration-file-for-module-react-vis?noredirect=1&lq=1
【Java】キャメルケースやスネークケースといった記法を相互変換する【Jackson】

キャメルケースやスネークケースなどなど、`Java`で命名法則の相互変換といえば`Guava`が有名ですが、`Jackson`でもできるのでまとめます。

# やり方
`com.fasterxml.jackson.databind.PropertyNamingStrategy`に定義されている各種`Strategy`を利用すればできます。

例として、キャメルケースからスネークケースへの変換を示します。

```java
public static String camelToSnake(String value) {
    return new PropertyNamingStrategy.SnakeCaseStrategy().translate(value);
}
```

その他の変換はソースコードやドキュメントをご覧ください。

# 補足
その他の手法として、`ModelMapper`や`Gson`には同等の機能が有りそうです。

- [Java \- キーがスネークケースになっているMapとBeanの変換｜teratail](https://teratail.com/questions/176259)

# 参考にさせて頂いた記事
- [JacksonのPropertyNamingStrategyまとめ \- Qiita](https://qiita.com/Shoone/items/5d23dfcc8687ba2305fe)
- [jackson\-databind/PropertyNamingStrategy\.java at master · FasterXML/jackson\-databind](https://github.com/FasterXML/jackson-databind/blob/master/src/main/java/com/fasterxml/jackson/databind/PropertyNamingStrategy.java)
mac(Mojave)でbrew gccインストールしたら動かなかったときの解決法

# 前書き
最近C言語のTAをしたりatomからVScodeに乗り換えたりしているので、ついでにC, C++の環境整備をしようと思いその周りのことを調べていると、

g++にすると憧れの```#include <bits/stdc++.h>```が使えるではないか...!

AtCoderでC++使用してる人が使ってる```#include <bits/stdc++.h>```

私も使いたーい!(ﾟДﾟ)

# 起こった問題
いざコンパイルした。

そして出たエラー

```
ld: warning: ignoring file /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/libSystem.tbd, file was built for unsupported file format ( 0x2D 0x2D 0x2D 0x20 0x21 0x74 0x61 0x70 0x69 0x2D 0x74 0x62 0x64 0x2D 0x76 0x33 ) which is not the architecture being linked (x86_64): 
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/libSystem.tbd Undefined symbols for architecture x86_64: "___cxa_atexit", referenced from: __static_initialization_and_destruction_0(int, int) in ccEBCemd.o 
ld: symbol(s) not found for architecture x86_64 collect2: 
error: ld returned 1 exit status
```

...ライブラリ...?64bit...?(´· ω ·`)
シンボリックリンクは貼ったしフルパスで呼び出しても通らない。
clangでコンパイルは通るからコードが間違ってるわけでもない。
(ちなみにその周りの通常のセッティングについてはこちらの記事にお世話になりました
https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6#5-stdch)

# 先に結論
Xcodeアプデしたら治りました。草。

# 途中過程

3時間だか半日だか四苦八苦しさらに手持ちのproとairの両方試し、挙句これはもう無理だとstack overflowに投げる。
https://stackoverflow.com/questions/58643485/installed-gcc-and-g-on-mac-mojave-is-not-working-brew-install/58687589#58687589

コメントしてくださった方の中である方が、

「sysrootがcommand line tool SDKにセットされてるように見えるからこれ叩いてみて」
``` g++ --sysroot=/ -o test test.cpp```

するとエラー内容が変わった。
取っとくの忘れてしまったんだけど大体こんな感じだった。

``` 
fatal error: wchar.h: No such file or directory
 #include <wchar.h>
          ^~~~~~~~~
```

....標準ライブラリがどっかいった？

その証拠にライブラリinclude無しで

```C++
int main(){}
```

のコンパイルを試してみるとほぼ通る。

...あ、ライブラリですね。

するとこちらはよく起きてる問題のようで、どうもMojaveだと/usr/include辺りか標準ライブラリがどっかいってしまってるらしい。(えっ辛い)
（最近のパッチでは直ってるのかもしれない）

参考:
https://qiita.com/tamutamuta/items/0ad8a11fe5d195aaffcb
https://teratail.com/questions/169308

**この標準ライブラリどっかいっちゃったよ問題を解決するにはXcodeやgccを再インストールすることらしい。**
私の場合はアプデで治りました。（四苦八苦してる時にgcc入れ直したけど）

え?普段からアプデしとかないのが悪い？
すいません... (´· ω ·`)
Go言語における文字列の「長さ」と「文字数」を取得する処理の違い

##Go言語で文字列の長さを取得する場合

Go言語の文字列の特徴として、**UTF-8エンコードされた「byte」配列**のように振る舞うことが出来る。

このため、配列と同様に**「len」組み込み関数**を使用して長さを取得し、インデックスを使ったアクセスなどが可能になる。

ちなみに「len」組み込み関数が返すのは**「文字数」ではなく「バイト長」**。
なので今回の例では、「len」組み込み関数を使ったパターンになる。

*なおここでは「配列」と表記しているが、実際にはスライス

```go:string_len.go
package main

import "fmt"

func main() {
	//string型の変数を宣言
	var en string = "golang"
	var ja string = "Go言語"

	//文字列の長さ(バイト長)を出力
	fmt.Println(en, "len:", len(en))
	fmt.Println(ja, "len:", len(ja))
}
```

実行結果

```console
user$ go run string_len.go
golang len: 6
Go言語 len: 8
```

取得するのが「バイト長」なので、「Go言語」の場合文字数の「4」ではなくバイト長の「8」が実行結果として出力されている。

##Go言語で文字数を取得する場合

一方、文字数を取得するには「unicode/utf-8」パッケージの**「RuneCountInString」関数**を使用する。

※RuneとはUnicode文字のこと

```go:string_count.go
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	//string型の変数を宣言
	var ja string = "Go言語"

	//文字数を出力
	fmt.Println(ja, "len:", utf8.RuneCountInString(ja))
}
```

実行結果

```console
user$ go run string_count.go
Go言語 len: 4
```

「Go言語」の文字数である「４」が無事に出力されました！
zeit製のswrがすごい

react hooksの登場とある程度の枯れ具合を見せてきて、益々利用する機会が増えているReact。
最近はreduxを採用する/しないで議論が白熱することが多くなってきていますが、今回はreduxを採用せずとも、ある程度のアプリケーションなら作れる選択肢の一つを紹介させていただきます。

初投稿なので、読みづらかったらスンマセン。

## zeit製のライブラリ swr

https://github.com/zeit/swr

今回の主役はこのswr。
reactのSSRフレームワークであるnextjsやPaaSのNowなどのを開発・運用しているzeitから最近登場したライブラリです。

このライブラリのREADMEの頭には、以下のように紹介されています。
```SWR is a React Hooks library for remote data fetching.```

そう、つまり、data fetchをhooksベースで記述するためのライブラリです。


## どんな機能があるの？


* 一度取得したデータをkey valueの形でキャッシュする(コードを読んだ感じ、react contextを利用しているようです。
* 画面にフォーカスしたタイミングで、自動でdataを再fetchする
* retry処理が組み込まれている(exponential backoffなどの高度なものでは無いです
* pollingベースでデータを再fetchする
* mutationでデータ更新時にキャッシュも更新する
* pagination機能(これは正直、そんなに使わない気もする

## 何が嬉しいの？

キャッシュです。キャッシュ戦略が組み込まれているのです。

例えば、SPAにおいて以下のようなUXを提供したい時に、reduxを採用していないと辛かった経験は無いですか？

```
1. 一回のsessionの間で、2回以上同じページに遷移する可能性がある(回遊)
2. 2回目以降は、新たにデータを取得できるまで、前回表示したものを表示させたい
3. しかしmountのタイミングでcomponentのstateが初期化されてしまうので、訪れるたびに通信完了後にデータが描画される
```

このような場合に、reduxを採用すれば、シングルトンなオブジェクトを常に参照することによって

前回取得したデータを最初に表示　→　新しいデータが取得完了したらstoreを更新

となり、例のような問題を解決できます。

しかしreduxは導入コストが高く、アプリケーションを過度に巨大化させがちだと考えています。
世のアプリケーションの50%くらいはデータのCRUDするだけの機能しか無いと思いますし、そのためだけに採用するのは開発効率を考えても良くはないと考えています。(もちろんreduxはとても信頼できますし、ある程度のアーキテクチャが決まっているのでテスタビリティやアプリケーションの品質が保証できるという気持ちはあります。決してdisっているわけじゃないッス

swrはこれを解決できます。


## そもそもデータ取得を実装する上で必要な要件ってなんだっけ？

基本的なことを振り返ります。
data fetchにおいて、アプリケーションとしては以下の3状態が設計されるべきです。

```
1. データ取得中 ... loading
2. データの取得完了 ... done
3. エラー発生 ... error
```

細かく言えば初期のmountのタイミングもありますが、doneと同じ扱いで良いのでここでは除きます。

swrはこの要件をしっかり満たしています。


## 使い心地は？

簡単な使用例を以下に載せました。

```typescript


import useSWR from 'swr'

interface User {
   id: string
   name: string
}

// Promiseを返す関数であれば良い
const fetchUser: (id:string) => Promise<User> = .....

const Page = () => {

  // URLから取得するとか
  const id = ....
  const { data, error } = useSWR<User,Error>(`/users/${id}`, () => fetchUser(id))

  if (error) return <div>{error.message}</div>
  
  return (
     <div>
        {error && <div>{error.message}</div>}
        {!data && <div>loading.....</div>}
        {data && <div>こんにちわ、{data.name}さん</div>}
     </div>
  )

}
```

自然な使い心地で良いですよね。
swr自体がtypescriptで実装されていることもあり、型もしっかり付いてきます。

現実的な使い方としてはuseSWRをwrapしたcustom hooksを実装して、使うことになりそうですね。

## 解決できたこととメリット

swrを使った場合、先ほどの例を元に遷移の様子をあげてみると以下になります。


```bash
# ユーザーが初めてページに訪れた場合
    1.キャッシュに存在しないので、dataはundefになる。
    2.取得完了したら、dataに値が入る。
    
# 同一セッション内でユーザーが2回目以降に訪れた場合
    1. 前回、取得した値がdataに入ると同時に取得が始まる。
    2. 取得が完了すると、dataには新しく取得したデータが入る。
```

したがって、先ほどの例の問題点を無事解決することができました。

他にも、プーリングによるデータの更新や画面フォーカス時での再取得など、自分で実装するとめんどくさい部分を全て吸収してくれいます。

また、サイズが11KBほどしかなく、小さいので嬉しいですね。

## まとめと伝えたいこと

今回はswrの紹介と簡単な例を紹介させていただきました。


僕が伝えたかったこととしては、今後、脳死でreduxを採用する必要はなく、アプリケーションの要件にあったアーキテクチャを選択することができるようになったよ！ということです。

ちなみにこのswr、suspenseモードも有効化できるようでして、新しいreactアプリケーションのアーキテクチャにしっかり対応できるようになっていたりします。
まだ、v0.1.5ということもあり、今後の発展に期待ですね。
Icon\r のせいでWindows側からpullできない

#WindowsとMacの両方で共同開発
MacとWindowsで共同開発をすることはあまりないかもしれませんが、同プロジェクトのコードを一つのリポジトリで管理しておきたいということはあるかもしれません。そんなときにはまった落とし穴について備忘録的に書いておきます。

##エラー内容
Mac側からリモートリポジトリにpushした結果をWindows側でpullしようとすると、以下のようにエラーを吐かれました。

```
error: unable to create file Icon?: Invalid argument
error: unable to create file arduino/Icon?: Invalid argument
error: unable to create file arduino/LED_test/Icon?: Invalid argument
error: unable to create file visualization/Icon?: Invalid argument
```
このエラーは全て"Icon?"というファイルに引っかかっているようですが、[このサイト](https://stackoverflow.com/questions/26097568/git-pull-error-unable-to-create-file-invalid-argument)の回答にあるように、"\"のような文字を持つファイルがWindowsではサポートされていないかららしいです。
ちなみにこの "Icon$\r" というファイルは、Macでgitを使ったときに勝手にローカルリポジトリに作られてしまうファイルなのですが、MacOSの制御用のファイルのようなので、バージョン管理をする必要はありません。

##解決策
というわけで、一旦あらゆるディレクトリから以下のようにこのファイルを消して(**ちゃんと、"git rm"で消す**)

```
$ git rm Icon$'\r'
```
その結果をpushしたあと、再びWindows側からpullし直すと、

```
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
~(略)~
Merge made by the 'recursive' strategy.
```
というようにpullすることができました。

##今後のために
また、今後もこうなるのは面倒なので、[このサイト](https://akamist.com/blog/archives/2905)にあるように、".gitignore"ファイルにこのファイル名を記載してしまいましょう。

```.gitignore
Icon*
```
特に"Icon~"という名前のファイルを作る必要が無いのなら、この方法で除くのが一番簡単でしょう。
この一行を.gitignoreに含めて新たにテストしてみた結果、ちゃんと管理対象外になっていることが分かります。
<img width="500" alt="スクリーンショット 2019-10-31 20.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505262/018b7645-7a26-14b9-a2d8-f2ea21a6f2b5.png">
ちなみに、"test"というフォルダの差分が取られていないのは、[このサイト](http://tech.katsubemakito.net/git/git_add_emptydirectory)にあるように空のフォルダは登録されないからです。

##補足
途中で削除した "Icon$\r" は、そのまま削除したままにしておいても特に問題はなさそうです。MacOSの制御用ファイルらしいので何かとヤバそうな匂いがしますが、git管理で初めて現れるものなので作りたいプログラム自体に影響はないはずですし、今のところはgitコマンドにも影響していないので、とりあえずは大丈夫そう。
Fetch APIでPOSTしたJSONをPHPで受け取ってエコーするだけ

フロントエンドもままならないまま最近PHPに入門して、いろいろ戸惑ったのでメモです。

## 知見
- 非同期でやりたいので画面の遷移をキャンセルするための`preventDefault()`をしたいが、これだと`<input required>`なフォームを未入力のまま`submit`しようとした際にフォームに表示されてほしいエラーメッセージが表示されない。これを`checkValidity()`で解決
- fetchでPOSTしても`$_POST`で受け取れない。`file_get_contents("php://input")`で受け取る
- `file_get_contents("php://input")`で受け取ってもJSONではなく文字列になってる。`json_decode` をかませてパースする
- `json_decode`するときは第2引数に`true`しとくとうれしい
- `json_encode`するときは第2引数に`JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES`しとくとうれしい

### html
```html
 <form method="POST" enctype=”multipart/form-data” action="" id="registForm">
  <fieldset>
   <label for="name">name</label>
   <input name="name" id="name" type="text" placeholder="" required>
   <button id="registBtn" type="submit">submit</button>
  </fieldset>
 </form>
```

### js
```javascript
const form = document.getElementById("registForm");
document.getElementById("registBtn").addEventListener("click", (e)=>{
  if(!form.checkValidity()){
    return;
  }
  e.preventDefault();
  e.stopPropagation();
  const name = document.getElementById("name").value;
  fetch("api/regist", {
    method: "POST",
    headers: { "Content-Type": "application/json;charset=utf-8" },
    mode: "cors",
    credentials: "same-origin",
    body: JSON.stringify({
      "name": name,
    }),
  }).then((res)=>{
    return res.json();
  }).then((res)=>{
    console.log(res);
  });
 });
```

### php
POSTをそのまま返すだけじゃつまらんのでサーバー情報も返してます。

```api/regist.php
<?php
  $my_POST = json_decode(file_get_contents("php://input"), true);
  $ret = ["post"=>$my_POST, "info"=>$_SERVER]; 
  echo json_encode($ret, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
```
WebView で forceDark を設定した時のメモ

Android の WebView で forceDark を適用するのに調査したので、メモとして残します。 

WebView で forceDark を使う場面自体少ないかと思いますが、WebView で表示させてるプライバシーポリシーやライセンスの画面を黒くするために調査しました。   

## Light テーマの場合

`Theme.AppCompat.Light` など DayNight テーマを使用していない場合はアプリのテーマに   `android:forceDarkAllowed="true"` を追加することで WebView を強制的に黒くさせることができます。  

この方法の場合はアプリのテーマで強制的に色を黒くさせるため、必要な画面のみ適用させる必要があります。  

## DayNight テーマの場合  

デフォルトではテーマなどの `forceDarkAllowed` を参照して黒にするかを切り替えるようになっていますが、  DayNight テーマを使用している場合は `forceDarkAllowed` が適用されないため、`WebSettings.setForceDark` を使用してコードで指定する必要があります。  

```
webView.apply {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        settings.forceDark = if (isDarkTheme()) {
            WebSettings.FORCE_DARK_ON  //強制的に黒くする
        } else {
            WebSettings.FORCE_DARK_OFF
        }
    }
}
```

※ `WebSettings.setForceDark` は API 29 以降で使えます。  

## 参考

- https://developer.android.com/reference/android/webkit/WebSettings.html
- https://developer.android.com/guide/topics/ui/look-and-feel/darktheme
AtCoder AGC040問題B 考察

# 概要
AGC040(11/04 00:00 - 02:30) に参加したが問題Aしか解けなかったです。残り時間で問題B/Cも考えてみましたが、解法を思いつかず、時間切れ。で、復習で問題Bの解法をみてみたのですが、すぐに理解できない部分があったので考えてみました。結果としては理解できました（できたつもり）。Qiita、Overleafの練習も兼ねて備忘録的なメモを残します。

# 対象にした問題と解法で即時で咀嚼できなかったこと
対象にした問題はAtCoderの[AGC040, B-Two Contests](https://atcoder.jp/contests/agc040/tasks/agc040_b)。解説はこちらAtCoderの[AGC040 解説PDF](https://img.atcoder.jp/agc040/editorial.pdf)にあります。
そのなかで即時で咀嚼できなかったのことの一つは以下の部分
![スクリーンショット 2019-11-04 12.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/3d3ec709-37bd-fadc-2053-cb7e3d4de92d.png)
これをみて「『という形です』と言い切っているけど。うーん？それってそう言い切れるの？なんで？タイブレーク？」となるアルゴリズム弱々の私。

# 問題の単純化と言い換え
いろいろゴチャゴチャしてて考えにくいので問題を次のように置き換えて考えることにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/10a581a6-a816-d52b-f7d7-232e46211551.png)

少し考えて、AGCの解説でいっている「この問題の解は。。。」の部分は上の問題でいうと以下のことをいっているのだとわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/7c70b315-d83f-f9cb-cce0-b2f6b87a62f0.png)

# 考察
上記の命題が正しいか図で直感的に考えてみました。上の問題は下のようなグラフで考えた時、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/b4123cb0-d0ad-4e6d-26f1-934b5374c83d.png)

XY平面に存在するN個の点を2つの集合SとT に分け、Sについてのxの最大値X、Tについてのyの最小値をYとするときP=Y-Xを最大にするような集合S,Tを考えることに等しい。x=Xをグラフの縦点線、y=Yをグラフの横点線で考えると(X,Y)は縦横点線の交点になる。このとき青の点は集合Sに属さないと(X,Y)が変化する点、赤は集合Tに属さないと(X,Y)が変化する点、紫は集合S,Tのどちらに含めても（X,Y)に影響しない点になります。

点線が交差する点の右下の範囲$(x>X, y<Y)$の領域には点が存在できない（そのような点はS,Tのどちらに入れてもX,Yのいずれかが変化してしまう）ので、イメージとしては点の部分に釘があって、右下から三角定規を差し込んで、三角定規の直角の頂点をなるべく左上に差し込める点を探すといった雰囲気になります。

Y-Xが最大となる候補は例えば次のような分け方も候補になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/73491bfd-4d4f-b8fa-c3c7-590f34da4616.png)

つぎも候補といえば候補ですが明らかに図１のケースの方が評価が良いので選ばれる可能性はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/6fac3ae5-d8cb-664e-f7ae-308f3626e575.png)

さて紫色の点はSとTのどちらに入れても目的とする値P=Y-Xはかわらないので、紫の点の数が0でない場合、同じY-Xを実現するSとTの組みわせは複数個あることになります。でも「紫のような点は全てSに含める」とすれば先ほどのような解法でY-Xの最大値を探せることがわかります。

# 所感
スキルが足りないので、解説に「〜〜です」といわれても、「え、なんで？」「必ずしもそうと言える？」などと感じる部分が多いです。解説のなかの「実は〜〜の部分は無視しても。。。」という部分も気にはなっているが追えてない。


# 修正
以下の部分まちがっていたで、「降順」を「昇順」に変更しました。もとのAGCとの問題とは符号が違うので逆になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/bbd0aef9-d862-d6e4-caff-c4a54c3d2929.png)
HomebrewでMysqlをインストール【Mac】

# HomebrewでMysqlをインストールする手順
こちらの手順の対象者は以下の条件を満たしている方です
- Mac使用中
- Homebrewをインストール済み インストールまだの方は[こちら](https://fukatsu.tech/homebrew)の記事がわかりやすかったので紹介

備考
- この内容はMysqlをインストールから起動〜停止までの手順の紹介です。Mysqlの詳しい使用方法は各自で調べてね★

## まずはHomebrewをアップデート
とりあえずHomebrewをアップデートした方が良いでしょう。

```
$ brew update
```

## Mysqlをインストール
```
$ brew install mysql
```

## インストールできたかの確認
こんな感じでバージョンが確認できたらOK

```
$ mysql --version
mysql  Ver 8.0.18 for osx10.15 on x86_64 (Homebrew)
```

## Mysqlを起動する
```
$ brew services start mysql
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
```

## Mysqlにログインして使用する
初期状態だと`mysql -u root`でログインできる。
`mysql>`とmysqlのコマンド入力状態になっていればOKです。
この状態でmysqlのコマンドを入力していくことになります。

```
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

```
Mysqlコマンド入力を終了したいときは`exit`と入力しエンターを押すと終了できます。

## Mysqlを停止
最後に以下コマンドでMysqlを停止させて「Mysql起動〜停止」の流れは終了です。

```
$ brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
```
Xcode関連の不要ファイル類メモ

## ディスク容量確保につながったファイル類

```
~/Developer/Xcode/iOS DeviceSupport
```

```
~/Library/Developer/Xcode/iOS Device Logs
```

```
~/Library/Developer/Xcode/DerivedData
```

```
~/Library/Developer/Xcode/Archives
```

## シュミレーター関連
`xcrun simctl list`で確認
` xcrun simctl erase all `で削除する
`xcrun simctl delete unavailable`でディスクイメージも削除

```
/Library/Developer/CoreSimulator/Devices
```
ShakedropのKeras実装

##はじめに

AlgoAgeの林です:grinning:
Shakedrop周りの論文をまとめたスライドと、Kerasの実装を掲載します。


##shakedropについて

####スライド（DLHacksで発表したもの）
https://www.slideshare.net/DeepLearningJP2016/dl-hacks-shakedrop-by-keras


##実装

####参考
・https://github.com/jonnedtc/Shake-Shake-Keras
・https://github.com/owruby/shake-drop_pytorch

####shakedrop実装

``` shakedrop_model.py

import keras
from keras import Input
from keras import backend as K
from tensorflow import distributions as tfd

class Shakedrop(layers.Layer): # カスタムレイヤーを定義

    def __init__(self, num_of_unit, num_of_layers, **kwargs):
        super(Shakedrop, self).__init__(**kwargs)
        self.num_of_unit = num_of_unit # 何番目のresblockか
        self.num_of_layers = num_of_layers # モデル全体の層の数

    def build(self, input_shape):
        super(Shakedrop, self).build(input_shape)

    def call(self, x):
        batch_size = K.shape(x)[0]
        alpha = K.random_uniform((batch_size, 1, 1, 1),  minval=-1.0)
        beta = K.random_uniform((batch_size, 1, 1, 1))
        p = 1 - (self.num_of_unit / (2 * self.num_of_layers)) # 出力に近い方がshakeされやすくなる
        bernoulli = tfd.Bernoulli(probs=p).prob(1)
        
        def x_shake():
            # stop_gradientを使ってfowardとbackwardで切り替える
            return (1 - bernoulli) * (beta * x + K.stop_gradient((alpha - beta) * x))

        def x_even():
             # pがそのままbの期待値になる
            return p * x

        # 学習時はx_shakeでtestの時はx_even
        return K.in_train_phase(x_shake, x_even)

    def compute_output_shape(self, input_shape):
        return input_shape[0]
```

#### 組み込み

以下の様にして、resnet構造を持つ任意のモデルで使用可能。

```resblock.py
return layers.Add(
    [inputs, Shakedrop(num_of_unit=num_of_unit, num_of_layers=num_of_layers)(x)])

```


##終わりに

弊社では現在人材募集中です！
機械学習をゼロから学べる研修付きのインターン募集など色々ありますので、ご興味ある方はお気軽にご連絡ください:relaxed:

Wantedly: https://www.wantedly.com/companies/company_5667111/projects
Homepage: https://www.algoage.net/
Twitter: https://twitter.com/algoage
Ansibleでファイル修正してみる

## 概要
Ansibleでファイルを修正してみる

![structure.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/0a598200-4d91-5603-b9fc-6dd68cf1f5fb.jpeg)

## ファイル構成

```
├ origin_file
│ └ hoge.txt       <- 転送して修正するテキストファイル
├ hosts            <- Inventryファイル
├ site.yml         <- Playbookファイル
└ Vagrantfile
```

## 対象ファイル
修正対象のファイルを下記のように準備しておきます。

```:origin_file/hoge.txt
Hello World.
This is a sample file.

Remove Line Sample text.
hoge hoge
fuga fuga
```

## 条件に該当する行を修正する
正規表現にマッチする行を指定の文字列に修正します。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present

    - name: ファイル(./origin_file/hoge.txt)を転送する
      copy:
        src: origin_file/hoge.txt
        dest: /tmp/hoge.txt
        owner: vagrant
        group: vagrant
        mode: "u=rw,g=r,o=r"

    - name: 条件に該当する行を修正する
      lineinfile:
        dest: /tmp/hoge.txt
        regexp: '^Hello\s+'
        line: Hello Hoge
```

playbookを実行する。

```bash
$ ansible-playbook -i hosts site.yml 
```

## 条件に該当する行を削除する
正規表現にマッチする行を１行まるごと削除します。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present

    - name: ファイル(./origin_file/hoge.txt)を転送する
      copy:
        src: origin_file/hoge.txt
        dest: /tmp/hoge.txt
        owner: vagrant
        group: vagrant
        mode: "u=rw,g=r,o=r"

    - name: 条件該当する行を削除する
      lineinfile:
        dest: /tmp/hoge.txt
        regexp: '^Remove\s+'
        state: absent
```

playbookを実行する。

```bash
$ ansible-playbook -i hosts site.yml 
```

## ファイル修正してコマンド実行する
sshd_configを修正してsshdを再起動し、RootでSSHログインを禁止する。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present

    - name: rootのパスワードでSSHログイン禁止
      lineinfile:
        dest: /etc/ssh/sshd_config
        regexp: '^PermitRootLogin\s+'
        line: PermitRootLogin no
        validate: sshd -t -f %s
      notify:
        - sshdRestart

  handlers:
    - name: sshdRestart
      service:
        name: sshd
        state: restarted
```
※ validate： 編集ファイルを検証するコマンド (リターン0 = 成功)
※ validateの場合は、`%s指定が必須`
※ notify: `タスク実行結果がchangedの時に`実行される処理を指定する

playbookを実行する。

```bash
$ ansible-playbook -i hosts site.yml 
```

## 参考文献
* [Ansible徹底入門](https://www.shoeisha.co.jp/book/detail/9784798149943)

以上
複数フォルダより複数枚の写真をグラフに描写する

##まぁ、タイトル通りなんですが…
写真AとBを比較しようと思ったら「あ、フォルダ分けしちゃった」に気づいた。
一つのフォルダから地道に写真見てフォルダ分けしたのに…
ってことがきっかけでやってみました。
ついでに画像加工した際に罠にかかったのでそれも一緒にいきます。

##全然難しくなかったｗ
「コードの雰囲気的にココ増やせばよくね？」
的な感じで進めていったら出来てしまった。
相変わらず勉強しない男である。

```dog_and_cat.py

#　Jupyter Notebookセルを全結合してみました

import os
import glob
import matplotlib.pyplot as plt
from PIL import Image
from google.colab import drive

#　GoogleDrive_Mount
drive.mount('/content/drive')

#　データ格納フォルダを指定
input_dir="/content/drive/My Drive/Colab Notebooks/test/Photos"
dirs = glob.glob(input_dir + '/*.jpg')
input_dir2="/content/drive/My Drive/Colab Notebooks/test/Photos2"
dirs2 = glob.glob(input_dir2 + '/*.jpg')

#　参照出来ているか確認
print(dirs)
print(dirs2)

#　リストの長さを足して表示枚数を確認
hs = len(dirs)+len(dirs2)
print(hs)

#　表示設定
col=5
row=hs/col
cols=col*3
rows=row*4
dpis = 100

#　イメージの表示サイズ、解像度
fig = plt.figure(figsize=(cols,rows),dpi=dpis)

#　＊＊番目に指定
pi=1

#　イメージ表示
for img,img2 in zip(dirs,dirs2):
#　1段目
  plot_num = pi
  ax=fig.add_subplot(row, col, plot_num)
  ac=os.path.basename(img)
  ax.set_title(ac)
  img = Image.open(img)
  plt.imshow(img, cmap='gray')
#　2段目
  plot_num2 = pi+5
  bx=fig.add_subplot(row, col, plot_num2)
  bc=os.path.basename(img2)
  bx.set_title(bc)
  img2 = Image.open(img2)
  plt.imshow(img2, cmap='gray')
  pi = pi+1

```

##出力結果
<img width="806" alt="test110401.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/ae6a7334-d51f-343d-ec8b-3e3e98a9b107.jpeg">

まぁ、かわいい。
でもサイズがバラバラですね。

##サイズをそろえてみる
「img = Image.open(img)」と「img2 = Image.open(img2)」の下に
それぞれ入れてみる（とりあえず数字は200を入れときます）

```py
img = img.resize((200, 200))  
img2 = img2.resize((200, 200)) 
```

<img width="828" alt="test110402.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/4529954e-8b9e-ea35-f2a4-f4a9970e1e01.jpeg">

みんな、無事揃いました。よかったね。

##グレースケールもやってみよ。あれ？罠？
上のコードに以下をそれぞれ追記してグレー化を期待

```py
img = img.convert("L")
img2 = img2.convert("L")
```

<img width="789" alt="test110403.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/bb50049c-5b8b-33f9-a3eb-4c04f5cdec0c.jpeg">


なんかイメージとちがう…
と思ったらさらにこれをやらなきゃいけないらしい。不覚。
（なんかこれだけでできるような書き方してたとこもあったんだけどなー）

```py
plt.imshow(img, cmap='gray')
plt.imshow(img2, cmap='gray')
```
<img width="827" alt="test110404.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/e4ab6495-5057-bf84-5864-495f61a51542.jpeg">

##ディープラーニングへ向けて
今後は特徴量を出力させたりとか類似画像抽出とかしていかなきゃだな～
難しそうだけどあらためて学べることがあるってすっごい楽しいねぇ。

てか、画像にちょこちょこ「あ」が入っているのに気付いたダッサwwww
なおさないけどねｗ
jQueryで複数のスライドダウンコンテンツを実装する

スライドで表示するコンテンツが1つの場合は単純ですが、複数ある場合と閉じるボタンがある場合という条件があるスライドコンテンツの実装方法です。

##デモ
[デモ](http://webdrawer.net/sample/js/manyslidedown/index.html)

##HTML
```html:index.html
<ul class="slideContent">
  <li>
    <h2>見出しテキスト1</h2>
      <div class="inner">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam, quis, repudiandae neque incidunt quasi cumque quia id laudantium aspernatur impedit accusantium amet atque soluta tempore ex sequi pariatur blanditiis magnam.</p>
        <p class="close">閉じる</p>
      </div>
  </li>
  <li>
    <h2>見出しテキスト2</h2>
      <div class="inner">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam, quis, repudiandae neque incidunt quasi cumque quia id laudantium aspernatur impedit accusantium amet atque soluta tempore ex sequi pariatur blanditiis magnam.</p>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam, quis, repudiandae neque incidunt quasi cumque quia id laudantium aspernatur impedit accusantium amet atque soluta tempore ex sequi pariatur blanditiis magnam.</p>
        <p class="close">閉じる</p>
      </div>
  </li>
～～中略～～
</ul>
```

##CSS
CSSは見た目の調整以外では、最初にコンテンツを非表示にしておくために以下の指定をします。

```css:style.css
.inner {
  display: none;
}
```

##JavaScript
```javascript:script.js
$(function(){
  if($('.slideContent').size() > 0){
    //コンテンツの数
    var slideContentNum = $('.slideContent li').length;
    //コンテンツ分のフラグ
    var navFlag = new Array();
    for( i = 0 ; i < slideContentNum ; i++ ){
      navFlag[i] = true;
    };
    //クリックした時の処理
    $('.slideContent h2').click(function(){
      //何個目のものがクリックされたかを確認
      var clickNum = $(this).parent().index();
      //フラグがtrueだったら
      if(navFlag[clickNum]){
        $(this).next('.inner').slideDown();
        $(this).addClass('current');
        navFlag[clickNum] = false;
      }
      else{
        $(this).next('.inner').slideUp();
        $(this).removeClass('current');
        navFlag[clickNum] = true;
      }
    });
    
    //閉じるをクリックした時の処理
    $('.slideContent .close').click(function(){
      var closeNum = ($(this).parents('li').index());
      $(this).parents('.inner').slideUp('fast');
      $(this).parents('.inner').prev('h2').removeClass('current');
      navFlag[closeNum] = true;
    });
  }
});
```
親のliが何番目のものかでフラグの番号をつけて開け締めをしています。

よく忘れるのがコンテンツ分のフラグを作るところで、これが一個だけだと1番目押して開いた後に続けて2番目が開かないとか 2回クリックしないと動かないなどの現象が起きます。

##この記事の転載元
[複数のスライドダウンコンテンツを実装するjQuery](http://webdrawer.net/javascript/manyslidedown.html)
[漏洞预警]CVE-2019-15588/Nexus Repository Manager Yum插件远程命令执行

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/88ee9e60-b22a-751d-02ab-bca4e0a2c040.png)

该漏洞成因为`org.sonatype.nexus.yum.internal.task.CommandLineExecutor`中的`getCleanCommand`方法未做过滤

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/988161e4-7fcb-734d-895f-354ae3533181.png)
### 时间轴
[0] 2019年9月5日 badcode提交该漏洞
[1] 2019年11月1日 NVD发布该漏洞
[2] 2019年11月4日 亚信安全网络攻防实验室发布预警公告
### 修复建议
- 1.升级至最新版本
- 2.修改部署账号口令

### Reference
https://nvd.nist.gov/vuln/detail/CVE-2019-15588
AutoLayout、バッティングが起きたとき、プライオリティは低いがバッティングの原因ではないものはどう扱われるのか

今回もAutoLayoutです。

A,B,C,D,Eの5つの荷物が入ったかばんを金属探知機にかけたら警報が鳴った。
Aを取り出してから再度かばんを検査するとまた警報が鳴った。
次にBを取り出して検査するとまた警報が鳴った。
さらにCを取り出して検査すると今度は警報が鳴らなかった。

あなたが次にするべきことは次のうちどちらか。

- かばんの中身はDとEで決定する
- AとBを順番にかばんに入れて検査し、警報が鳴らないならかばんに入れておくことを決定する（要するにAとBについて調べる）

これは私がAutoLayoutで感じた疑問である。

#AutoLayoutこの先生きのこる問題

AutoLayoutの3つの制約A,B,Cがある。
プライオリティはA>B>C。
ある状況でAとBはバッティングしてAとCはバッティングしなかった。
Bを排除することは決定だが、AとバッティングしないCはどうなるのか。

#結論
Cは排除される。

#検証コード

```swift
import UIKit

class ViewController: UIViewController {
	
	let viewA = UIView()

	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view.
		
		viewA.backgroundColor = UIColor.red

		view.addSubview(viewA)
		
		viewA.translatesAutoresizingMaskIntoConstraints = false
		viewA.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 50.0).isActive = true
		viewA.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
		viewA.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

		viewA.widthAnchor.constraint(greaterThanOrEqualToConstant: 50.0).isActive = true

		let w2 = viewA.widthAnchor.constraint(equalToConstant: 30.0)
		w2.priority = UILayoutPriority(rawValue: 999.0)
		w2.isActive = true

		let w3 = viewA.widthAnchor.constraint(equalToConstant: 200.0)
		w3.priority = UILayoutPriority(rawValue: 998.0)
		w3.isActive = true
	}
}
```

#結果
![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46631/279e5938-f296-9179-ec3f-e89d4af2b5e5.png)
縦100に対して横50。

#ちなみに
AとCだけにするとちゃんとCが生きてます。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46631/adfcf1a6-a07f-c2ff-5ea7-cd5ea2ccd5d2.png)
縦100に対して横200。

#お願い
公式の情報を見つけてないので知っている人いたら教えて下さい。
Makefileでディレクトリ生成する覚書

コンパイル実行時にオブジェクトディレクトリやバイナリディレクトリがなかったときに，ディレクトリ生成するMakefileはいくらでも検索したら出てくるが，ディレクトリだけを生成するターゲットとmakeのルールの書き方がすぐに見つからなかったのでメモ．

オブジェクトファイルに依存してなければ作れば良い？

```make:Makefile
BIN_DIR = ../bin
MAIN = $(BIN_DIR)/main
MAIN_SRC = $(addsuffix .cpp, $(MAIN))
MAIN_OBJ = $(MAIN_SRC:%=%.o)


all: $(BIN_DIR) $(MAIN)

$(BIN_DIR): $(wildcard *.o)
	@if [ ! -d $(BIN_DIR) ]; then \
		echo ";; mkdir $(BIN_DIR)"; mkdir $(BIN_DIR); \
	fi

$(MAIN): $(MAIN_OBJ)
...(以下略)
```
AWS SDK for Rubyをインストールしてみた

#はじめに
本記事では、AWS SDK for Rubyをインストールしたので、備忘録として残します。


#前提条件
・AWS SDK for Rubyをインストールする上で、Rubyのバージョンが1.9以上が必要。
※本手順では、Ruby2.6.5を使用する。
・実施環境は、VirtualBoxで稼働中のCentOS7.6とする。
・ユーザは、一般ユーザで実施するものとする。
・本手順では、Rubyの任意のバージョンをインストールするために、rbenv(アールビー・エンブ)を使用するものとする。

#(1)rbenvインストール


##(1.1)rbenvインストール

①gitインストール

```
$ sudo yum install git
```

②gitからrbenvをインストール

```
git clone https://github.com/sstephenson/rbenv.git $HOME/.rbenv
```

##(1.2)rbenv環境設定

①rbenvのパスを追加

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bash_profile
```

②rbenvのセットアップ

```
$ echo 'eval "$(rbenv init -)"' >> $HOME/.bash_profile
```

③bash_profileの再読み込みを実施

```
$ exec $SHELL -l
```

##(1.3) rbenvのバージョン確認

```
$ rbenv --version
```
※ここでバージョンが表示されればOK


#(2)Rubyのインストール

①ruby-build を インストール

```
$ git clone https://github.com/sstephenson/ruby-build.git $HOME/.rbenv/plugins/ruby-build
```

②インストール可能なRubyのバージョン情報を確認

```
$ rbenv install --list
```

③Rubyインストール時に必要なパッケージをインストール

```
$ sudo yum install gcc openssl-devel readline-devel zlib-devel
```

④Rubyインストール　※ここでは、バージョン「2.6.5」を指定

```
$ rbenv install -v 2.6.5
```

⑤インストール済みのRubyを表示

```
$ rbenv versions
```
※ここでは、2.6.5が表示される

⑥使用するRubyのバージョンを指定

```
$ rbenv global 2.6.5
```

⑦現在使用しているRubyを確認

```
$ rbenv versions
```
※「 2.6.5 (set by /home/test/.rbenv/version)」が表示される

⑧Rubyのバージョンを確認

```
$ ruby -v
```
※ここでバージョンが表示されればOK


#(3)AWS-SDK for Rubyをインストール

```
$ gem install aws-sdk
```
※「200 gems installed」が表示されればOK


#参考URL
https://qiita.com/inouet/items/478f4228dbbcd442bfe8
https://aws.amazon.com/jp/sdk-for-ruby/
https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/setup-install.html


#最後に
・今回は、AWS-SDK For Rubyでインストールしてみたが、後日、別の言語バージョンも試してみようと思います。
ベイズの定理を条件付き確率から証明してみる

#本稿の内容
よくベイズ統計学の話を聞くので、手始めにベイズの定理の証明をやってみました。
本稿では条件付き確率からベイズの定理を証明していきます。
##ベイズの定理
```math
{P(A|B) = \frac{P(B|A)P(A)}{P(B|A)P(A)+P(B|A^c)P(A^c)}
}
```
これが今回証明したい対象です。
これを使うと色々嬉しいことがあるようなのですが、本筋からずれるので興味のある人はその辺で調べてください。
#前提知識
前提として条件付き確率については知っているものとします。
## 条件付き確率
条件付き確率はこんな感じです。

```math
{P(A|B) = \frac{P(A∩B)}{P(B)}}
```
なお、
P(A|B):事象Bの起きた時に事象Aの起こる確率
P(A)：事象Aの起こる確率
P(B)：事象Bの起こる確率
P(A∩B)：事象Aと事象Bの起こる確率
とします。
#証明
証明の方針とStep 1~3の実際の証明をここでは示します。
##証明の方針
方針としては、条件付き確率の

```math
{P(A|B) = \frac{P(A∩B)}{P(B)}}
```
を変形してベイズの定理の形に持っていく感じです。
##実際に証明してみる
ここでは条件付き確率の分子と分母をそれぞれ変形していきます。
###Step 1 分子について
手始めに条件付き確率の分子にあるP(A∩B)を変形していきます。
条件付き確率を考えると、

```math
{P(B|A) = \frac{P(A∩B)}{P(A)}}
```
となることから、

```math
P(A∩B) = {P(B|A)}{P(A)}…①
```
となることがわかります。
###Step 2 分母について
Bの起きる確率については、Aの起きた場合と起きなかった場合を考えれば良いから、

```math
P(B) = P(A∩B)+P(A^c∩B)=
{P(B|A)P(A)+P(B|A^c)P(A^c)}…②
```
となります。
###Step 3 分母と分子に代入
これまで計算してきた①と②を

```math
{P(A|B) = \frac{P(A∩B)}{P(B)}}
```
に代入すると、

```math
{P(A|B) = \frac{P(B|A)P(A)}{P(B|A)P(A)+P(B|A^c)P(A^c)}
}
```
となり、確かに証明したかったベイズの定理の形になっています。
#感想
教科書の行間が広くて厳しいことがあるのですがこんな感じに丁寧に証明していくしかないのかなという気持ちです。
TeXを使ったことがなくて数式入れるのに苦労しました。
#参考文献
大屋幸輔（2011）『コア・テキスト統計学　第2版』新世社．
SPRESENSE の USB CDC 機能を使ってシリアル通信してみた

# SPRESENSE の USB CDC 機能を使ってシリアル通信してみた

## はじめに

[SPRESENSE](https://twitter.com/SonyDevJapan) の拡張ボード側の USB 端子を使って Serial 入出力を実現します。
SPRESENSE SDK でサポートしている USB CDC 機能をそのまま利用して Arduino から使用可能なライブラリ (USBSerial) を新規に作成しました。


## USB CDC-ACM とは？

USB には、USB メモリなどで使用される MSC (マスストレージクラス) や、マウス・キーボードで使用される HID (Human Interface Devices) クラスなど、機能や用途ごとにいくつかのデバイスクラスに分かれてプロトコルが定義されています。この中に、ホストPC と通信するための CDC (Communication Device Class) というクラスドライバが用意されています。CDC デバイスクラスはいくつかのサブクラスに分かれており、RS-232C等のシリアル通信に対応した CDC-ACM (Abstract Control Model) や Ethernet 通信を実現する CDC-ECM (Ethernet Networking Control Model) 等があります。よくある FTDI などの USB シリアル変換チップにはこの CDC-ACM 機能が実装されています。


## SPRESENSEボード開発環境構築

開発環境のセットアップ手順は [Spresense Arduino スタートガイド](https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html) に詳しく載ってます。Arduinoを使ったことがある人なら、

1. ボードマネージャのURLに[package_spresense_index.json](https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json) を追加して
2. ボードマネージャからインストールするだけ

## USBSerial ライブラリ

実装したライブラリをGitHubにアップしました。
https://github.com/baggio63446333/USBSerial

1. 使い方は簡単で、USBSerial ライブラリを libraries フォルダにインストールします。
2. いつも使っている `Serial` の代わりに `USBSerial` に置き換えれば使用できます。

インストール方法は、GitHub から zip ファイルをダウンロードしてインストールしても良いのですが、git を使った手順を示します。(以下は Ubuntu 環境の例ですが、Windows 環境なら %USERPROFILES%\Documents\Arduino\libraries、macOS 環境なら ~/Documents/Arduino/libraries あたりに libraries フォルダがあるはずです、たぶん)

```
$ cd ~/Arduino/libraries
$ git clone https://github.com/baggio63446333/USBSerial
```

examples にある SerialCommunication.ino スケッチを起動します。

```cpp:SerialCommunication.ino
#include <USBSerial.h>

USBSerial USBSerial;

void setup()
{
  // Use normal serial port on main board
  Serial.begin(115200);

  // Use USB serial port on extension board
  USBSerial.begin(115200);
}

void loop()
{
  // Send from USBSerial to Serial
  while (USBSerial.available()) {
    Serial.write(USBSerial.read());
  }

  // Send from Serial to USBSerial
  while (Serial.available()) {
    USBSerial.write(Serial.read());
  }
}
```

Serial と USBSerial との間でシリアル通信しているだけの簡単なサンプルです。
TeraTerm 等のシリアルターミナルを 2 個立ち上げて、片方のターミナルに入力した文字列がもう片方のターミナルに出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/cedeaf69-3470-a6f6-b2b8-b016e42fe045.png)

## さいごに

USB CDCを使えば高速なシリアル通信が可能なはず。
通信速度の計測などは一切確認してないのでぉぃぉぃやります。。
ちゃんと動かないとか、まともに動かないとか、動作がおかしい、とか何かあればコメントをお願いします。
NuxtでGoogle Fontsを使う方法

ポートフォリオサイトでGoogle Fontsを使用した時の備忘録。
簡単に導入できる[nuxt-webfontloader](https://www.npmjs.com/package/nuxt-webfontloader)を使用してGoogle Fontsを使う方法を紹介します。

# インストール
```
yarn add nuxt-webfontloader
```

# nuxt.config.jsへの設定1

```nuxt.config.js
  modules: [
    'nuxt-webfontloader'
  ],
```

# Google Fontsで使用したいフォントを探す
・使用したいフォントのスタイルを選択します。
今回はLatoの`Regular 400`と`Bold 700 Italic`で試します。

|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288728/b9149a88-7726-adb4-99e4-a4da8857ec06.png)
|:-:|

・黒太文字の部分（`Lato:400,700i`）をコピー
※font-displayを設定する場合は`Lato:400,700i&display=swap`までをコピー

|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288728/a8c46b46-1012-f251-4239-4cbeb1b902e8.png)
|:-:|


# nuxt.config.jsへの設定2

```nuxt.config.js
  modules: [
    'nuxt-webfontloader'
  ],
  //　↓↓追加↓↓
  webfontloader: {
    google: {
      families: ['Lato:400,700i']
    }
  },
```

# family-fontに設定
```hoge.css
/*Lato:400を設定する場合*/
.lato-400 {
 font-family: 'Lato', sans-serif;
 font-weight: 400;
}

/*Lato:700iを設定する場合*/
.lato-700i {
 font-family: 'Lato', sans-serif;
 font-weight: 700;
 font-style: italic;
}
```
coremltools 3.3の環境構築（2020年3月版）

Kerasでつくった自作モデルを環境構築したばかりの`coremltools`で変換しようとすると**エラーに次ぐエラー**で前進しているのか後退しているのかさえわからない状態になったので、まずは`coremltools`リポジトリにあるexamplesが実行できるよう環境構築をやり直したメモ。

https://github.com/apple/coremltools

ちなみに2020.3.1現在でcoremltoolsの最新リリースは`3.3`。

https://github.com/apple/coremltools/releases

## README通りに環境構築（結果的にはNG）

（2020年3月追記：以下は`3.1`の頃に書いた手順）

前提：仮想環境を利用。筆者はAnacondaを利用してPython 3.7の環境を用意した。

- coremltoolsをインストール

```
$ pip install -U coremltools
```

- KerasとTensorFlowをインストール

```
$ pip install keras tensorflow
```

- 確認

```
$ pip freeze
```

> ...
coremltools==3.1
...
h5py==2.10.0
...
Keras==2.3.1
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
...
tensorboard==2.0.1
tensorflow==2.0.0
tensorflow-estimator==2.0.1
...

- jupyterもインストール

```
$ conda install jupyter
```

## 公式exampleを試す

Jupyter Notebookを起動して、

https://github.com/apple/coremltools/blob/master/examples/updatable_models/updatable_mnist.ipynb

を順番に実行していく。

> OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

というエラーで止まるのだが、気になったのが以下のwarning。

> WARNING:root:TensorFlow version 2.0.0 detected. Last version known to be fully compatible is 1.14.0 .
> WARNING:root:Keras version 2.3.1 detected. Last version known to be fully compatible of Keras is 2.2.4 .

[coremltools 3.1のリリースノート](https://github.com/apple/coremltools/releases/tag/3.1)ではTF 2.xもサポートしてそうに読めたのだが素人なので素直にメッセージに従って環境構築しなおすことにする。

## 環境構築やり直し（成功）

（2020年3月追記：以下は`3.3`でも同様の手順で確認済み）

仮想環境のPythonバージョンは先程と同様に`3.7`。`coremltools`のインストールも同じ。

```
$ pip install -U coremltools
```

KerasとTFは、先程のwarningに書いてあったcompatibleなバージョンを指定してインストール。

```
$ pip install keras==2.2.4 tensorflow==1.14.0
```

jupyterもインストール（この手順はスキップできるかも）

```
$ conda install jupyter
```

Jupyter Notebookを起動して、先ほどと同様に[UpdatableなMNISTモデルを生成する公式example](https://github.com/apple/coremltools/blob/master/examples/updatable_models/updatable_mnist.ipynb)を実行していくと・・・（`FutureWarning`はたくさん出るものの）最後まで実行成功！🎉Updatableな手書き数字認識の`.mlmodel`が生成される。

Xcode 11で`.mlmodel`ファイルをプレビューすると、「Update」の欄が追加されていることがわかる。

<img width="912" alt="Screen Shot 2019-11-04 at 13.26.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3180/16850f41-8321-fbf9-55a8-bda286189856.png">
DjangoアプリをHerokuにデプロイしたらModule Not Found: <project-name>.wsgiが出たのでメモ

# 解決策

色々試した結果，

```Python:Procfile
web: gunicorn --pythonpath common common.wsgi --log-file -
```

としたらうまくいった．（プロジェクト名がcommonのとき）


# 今後

 現状，templateのhtmlファイルにjsもCSSも何もかも書いているが，これは後々static fileとして分離したい．

ただ，whitenoiseの設定周りでまたひと悶着ありそうな感じ．この辺はGCPのほうが楽そうな予感もしている．
picoCTF 2019 slippery-shellcode - Points: 200

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fadf9b6e-d5ff-5942-c564-c1f1ab39a911.png)

#解いてみた

ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3ddc73e7-011d-c857-a00d-a904acb906f6.png)

picoCTF 2019 handy-shellcode - Points: 50
https://qiita.com/CTFman/items/644f26ed07b75a4e77a0

これと似たような解き方ですが、33行目でランダムのオフセットを足しているので最大で256ずれるということでしょうか。
256分先頭にNOPを入れておけばよいということでしょうか。
NOPならたぶん読み飛ばしてくれるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5035f193-6aef-9517-1467-93c76667e331.png)

今回の実行ファイルも32bitです。
shellcodeを探します。

Shellcodes Database - shell-storm
http://shell-storm.org/shellcode/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5966a2b3-9660-1549-3a1a-ad06172ac10d.png)

これで良いですかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9db89f67-ff38-61d4-5b66-4cb0080ceec7.png)

これの先頭に\x90(NOP)を256個つけて実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4a574b7b-884a-83a7-85dd-2b3c1bc67309.png)

おおできた。
Pandas DataFrameで日時データのタイムゾーン変換する際のエラーと解決方法

今回は、以下のPandas DataFrameデータがある前提で説明します。


```test.py

print(res)

 	time 	                open        high    low      	close     volume
0 	2019-11-04 03:00:00 	108.229 	108.23 	108.216 	108.223 	77.0
```

ここで注意してほしいのは以下2点です。

- timeの列はあくまで時間の数値として存在しており、タイムゾーンの情報が持っていないこと（実際はUTCを表しています）

- indexは定義がいておらず、デフォルトの0～nの並びになっていること

そして、今回の目標は、time列の時間をUTCからJSTに直したいことです。
使おうとしているコード（関数）は以下です。

```test.py
from datetime import datetime, timedelta`
res['time'] = res['time'].tz_convert('Asia/Tokyo')
```
##エラーその１

まず、そのまま上記のコマンドを実施したところで、以下のエラーメッセージが出力。
要するには、**indexのtypeが時間ではないので、変換できないらしいです。**


`TypeError: index is not a valid DatetimeIndex or PeriodIndex
`

そこで、下記のコマンドを投入し、元々time列のデータをindex列に移動し、indexのtypeを時間にしました。

```test.py
res = res.set_index('time')
res.index = pd.to_datetime(res.index)
```
##エラーその２
ただし、ここでもう一度下記のコマンドで変換しようとしたら、違うエラーメッセージが出ました。
どうやら**元々の数値にタイムゾーンの情報がないから、変換できないということですね。**

```test.py
res.index = res.index.tz_convert('Asia/Tokyo')
```
`TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize`

そこで、まず、indexにある時間のデータをタイムゾーンの情報を付加してからもう一度変換することを試しました。

```test.py
res.index = res.index.tz_localize('UTC')　#タイムゾーンの情報を付加する

```
**見事に変換できました！**

```test.py
res.index = res.index.tz_convert('Asia/Tokyo')


 	                        open    	high    	low     	close  	volume
time 					
2019-11-04 12:00:00+09:00 	108.229 	108.232 	108.216 	108.228 	115.0

```