OmniAICreator/Qiita-1.07M huggingface dataset:
Beego+MySQL+Docker+Heroku

# はじめに
普段は，docker-composeでgolangとMySQLを管理しています．
Herokuへのアプリのアップを試みました．（DBストレージw）
個人開発でDBストレージ消費するサービス運用って，素敵なサーバどうしたものか．．．

# 環境
ubuntu16
Herokuアカウント・クレジットカード登録済み．
ローカルではアプリ動きます．
Dockerfileにはマルチステージビルドを採用しています．
herokuへpushするimageは25MBくらいでした．（もっと小さくしたい）

```:Dockerfile

FROM golang:1.12.12-alpine3.9 AS build

ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/bin

RUN apk update && \
  apk add --no-cache git ca-certificates tzdata && \
  go get "github.com/go-sql-driver/mysql" && \
  go get "github.com/beego/bee" && \
  go get "github.com/astaxie/beego" && \
  go get "github.com/astaxie/beego/session" && \
  go get "golang.org/x/crypto/bcrypt" && \
  go get "github.com/PuerkitoBio/goquery" && \
  go get "github.com/microcosm-cc/bluemonday" && \
  rm -rf /var/cache/apk/*

ADD . /go/src/app
WORKDIR /go/src/app

RUN go build -o app main.go

FROM alpine:3.9
RUN apk update && \
  apk --no-cache add tzdata ca-certificates && \
  rm -rf /var/cache/apk/*
COPY --from=build /go/src/app/ .
CMD ["./app"]
```

# 結果

MySQLはイメージのアップができないので，add-onを追加する必要があります．

```
heroku login
heroku container:login
heroku create -a app_name
heroku git:remote -a app_name
heroku addons:add cleardb:ignite
echo "web: app_name" > Procfile
```
次にMySQLへの接続情報をゲットします．

```
heroku config | grep CLEARDB_DATABASE_URL
=> CLEARDB_DATABASE_URL: mysql://38faf8fefeaaef:dfefe44@us-cdbr-iron-east-093823.cleardb.net/heroku_8cfefedfgcd6a?reconnect=true
```
これをBeegoでよく利用する形に変形して使っています．（文末のreconnect=trueは未検証）


```conf/app.conf
sqlconn = 38faf8fefeaaef:dfefe44@tcp(us-cdbr-iron-east-093823.cleardb.net:3306)/heroku_8cfefedfgcd6a

#sqlconnはmain.goで利用しています↓
orm.RegisterDataBase("default", beego.AppConfig.String("driver"), beego.AppConfig.String("sqlconn")+"?charset=utf8mb4")
```
herokuはアプリの起動ごとにポート番号が変わるようです．
よって，main.go内でポートを取得し，設定の上書きが必要です．（おそらく，HTTPの文はいらない）

```main.go
port, err := strconv.Atoi(os.Getenv("PORT"))
beego.BConfig.Listen.HTTPPort = port
beego.BConfig.Listen.HTTPSPort = port
```
仕上げです！（上2行はいらないかも）

```
git add .
git commit -m "add procfile"

heroku container:push web -a app_name
heroku container:release web -a app_name
heroku open
heroku logs --tail #ログの確認
```

アプリによっては，起動後から数分後に接続できたり，キャッシュを消したら接続できたりするみたいです．
私のアプリ内の機能：スクレイピング部分はうまく動かず．．．
海外サーバだからなのかな．（追記：ca-certificatesをいれたら直りました）

# 最後に

作成したアプリの削除

```
heroku apps:destroy -a app_name --confirm app_name
git remote rm heroku
```
CloudFormationでDynamoDBのオートスケーリングを設定する

# テンプレート

```yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  sampleScalableTarget:
    Type: "AWS::ApplicationAutoScaling::ScalableTarget"
    Properties:
      MaxCapacity: 100 # 最大キャパシティー
      MinCapacity: 1 # 最小キャパシティー
      ResourceId: !Sub table/sample-table # テーブル名を指定する「table/」の後にテーブル名を指定する
      RoleARN: !GetAtt ScalingRole.Arn
      ScalableDimension: "dynamodb:table:ReadCapacityUnits" # 書き込みキャパシティーユニットの場合は、「dynamodb:table:WriteCapacityUnits」
      ServiceNamespace: dynamodb
  sampleScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    Properties:
      PolicyName: sampleAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId:
        Ref: sampleScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70 # ターゲット使用率
        ScaleInCooldown: 30 # スケールインが起きて次のスケールインするまでの時間(秒)
        ScaleOutCooldown: 30 # スケールアウトが起きて次のスケールアウトするまでの時間(秒) 
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBReadCapacityUtilization
```

# 参考にしたページ
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/AWS_ApplicationAutoScaling.html

https://aws.amazon.com/jp/blogs/news/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/
3ステップ nuxt.js 開発環境構築 for Windows

#はじめに
これから nuxt.js 開発をWindows上で行おうとされる方向けに、環境構築手順をまとめました。

#構築手順
##1. node.jsインストール

こちらからダウンロードしてインストールします。
https://nodejs.org/ja/

インストール後、実行PATHを認識させるために WindowsOS を再起動させたほうがよいかも。あるいはコマンドプロンプトで ```set path=%path%;C:\Program Files\nodejs```を発行します。（```yarn create``` コマンドで node.exe が呼ばれます）

##2. yarnインストール

こちらからダウンロードしてインストールします。
https://yarnpkg.com/ja/docs/install

##3. プロジェクト作成

コマンドプロンプトを起動します。cd コマンドでカレントディレクトリを任意に設定して、つぎのコマンドでプロジェクトを作成します。

```
cd <プロジェクトディレクトリを作成するディレクトリ>
yarn create nuxt-app <project name>
```

いくつか聞かれる内容に答えると、プロジェクトが作成されます。

#プロジェクト構築後
##実行
cd コマンドでプロジェクトのあるフォルダへカレントディレクトリを移動したのち、次のコマンドで初期展開状態のプロジェクトを実行できます。実行時にコンソールに表示されますが、ブラウザから http://localhost:3000/ へアクセスすることでプロジェクトの出力が表示されます。

```
cd <プロジェクトディレクトリ>
yarn dev
```

ビルドして実行させるには、cd コマンドでプロジェクトのあるフォルダへカレントディレクトリを移動したのち、次のコマンドを発行します。

```
cd <プロジェクトディレクトリ>
yarn build
yarn start
```

##TypeScript導入

こちらの記事が参考になります（感謝！！）
https://qiita.com/HeRo/items/56308a38388a05bdd550
PhonenixでSqlite3を使う

最近、Elixir+Phoenixを勉強し始めてサンプルWebを作りまくっていたら、デフォルトデータベースがPostgreSQLなので気がついたら大量のDBが作られまくっていたという経験をしました。
そこでSqlite3を使って各プロジェクトのローカルフォルダにデータベースを作るようにしてみます。
（Docker Composeを使う方法も試したのですがトラブルが起きた時に原因の特定が難しくなるのが難点）

# 環境
* macOS Mojave 10.14
* Elixir 1.9.2
* Phoenix 1.4.10

# 手順
まず普通にPhoenixプロジェクトを作成します。

```
$ mix phx.new blog
Fetch and install dependencies? [Yn] y
$ cd blog
```
mix.exsに必要なライブラリを追加する
（ここのバージョンの依存関係で結構苦労した）

``` elixir:mix.exs
  defp deps do
    [
      {:phoenix, "~> 1.4.10"},
      {:phoenix_pubsub, "~> 1.1"},
      {:phoenix_ecto, "~> 3.6"}, # 4.0 → 3.6に変更
      # {:ecto_sql, "~> 3.2"}, # 不要
      # {:postgrex, ">= 0.0.0"}, # 不要
      {:ecto, "~> 2.2.9"}, # 追加
      {:sqlite_ecto2, "~> 2.4"}, # 追加
      {:phoenix_html, "~> 2.11"},
      {:phoenix_live_reload, "~> 1.2", only: :dev},
      {:gettext, "~> 0.11"},
      {:jason, "~> 1.0"},
      {:plug_cowboy, "~> 2.0"}
    ]
  end
```

一旦クリーンにしてから再度インストール

``` bash
$ mix deps.clean --all
$ rm mix.lock
$ mix deps.get
```
エラーがでなければ成功。

# プロジェクトの修正

``` elixir:config/dev.exs
# Configure your database
config :blog, Blog.Repo,
  adapter: Sqlite.Ecto2,
  database: "blog.sqlite3"
```

```  elixir:lib/blog/repo.ex
defmodule Blog.Repo do
  use Ecto.Repo,
    otp_app: :blog,
    adapter: Sqlite.Ecto2 # 変更
end
```

DBを作成してサーバーを立ち上げる。

```
$ mix ecto.create
$ mix phx.server
```

ブラウザで http://localhost:4000 にアクセスしてPhoenixのページが表示されれば一先ず成功です。
プロジェクトのフォルダにはblog.sqlite3というDBのファイルができていると思います。
![スクリーンショット 2019-10-30 17.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/b498f7b9-ddd0-ee10-a24e-a77c7ec75221.png)



# サンプルブログを作成してみる
これだけだとSqlite3が使われてるのがどうかわからないので、試しにブログっぽいWebサイトをジェネレートしてみます。

```
$ mix phx.gen.html Articles Article articles title body:text
$ mix ecto.migrate
```


``` diff_elixir:lib/blog_web/router.ex
  scope "/", BlogWeb do
    pipe_through :browser

-    get "/", PageController, :index
+    get "/", ArticleController, :index #変更
+    resources "/articles", ArticleController # 追加
  end
```

```
$ mix phx.server
```

![スクリーンショット 2019-10-30 16.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/c9cd2117-34d8-9a74-b294-401eb895d8bc.png)
サイトが完成。記事を書き込めることも確認できました。

コードの修正が数カ所あるので構築のスピード感が落ちるのは残念です。
それでもサンプルを作りっぱなしにしてもDBを汚さないというのは利点かもしれません。
Windowsのディスクが急に枯渇した

急にWindowsのディスクの空き容量が見るみる減っていって枯渇してしまい、なかなか復旧できなかったのでメモ。
Windows10なのかOffice365アプリなのか解らないがSurfaceHubなるものが悪さをしていたもよう。

Cドライブ直下のフォルダの容量をエクスプローラのフォルダプロパティで確認したが、容量を食っているフォルダを特定できなかった。最終的に C:\Windows\Temp に大量のイベントログファイルが出来ていることを発見。
（サポート会社にてTreeSizeFreeというアプリを使ったらすぐに解った）

増え続けているファイルを確認
→ AppXDeploymentServer_9D55CF2F-8FC3-0000-0A24-569DC38FD501.evtx
　など AppXから始まるファイルが大量に発生していた

この AppXDeploymentServer_～.evtx のイベント内容を見ると

    PackageName Microsoft.SurfaceHub_8wekyb3d8bbwe
    ErrorText AppX パッケージのマニフェストが無効です。  
    ErrorCode 0x80080204

というような SurfaceHub に関連したものがほとんどのもよう。

「AppX パッケージのマニフェストが無効です。」を検索して
https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10/2b6bd0ca-34e3-4b0f-8a2f-9379909fa950
が見つかったので下記を実行したら、
AppX～ファイルの大量発生はなくなりました。
 

    Windows PowerShell
    Copyright (C) Microsoft Corporation. All rights reserved.

    PS C:\windows\system32> Get-AppxPackage -name *SurfaceHub*


    Name              : Microsoft.SurfaceHub
    Publisher         : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
    Architecture      : X64
    ResourceId        :
    Version           : 39.600.139.0
    PackageFullName   : Microsoft.SurfaceHub_39.600.139.0_x64__8wekyb3d8bbwe
    InstallLocation   : C:\Program Files\WindowsApps\Microsoft.SurfaceHub_39.600.139.0_x64__8wekyb3d8bbwe
    IsFramework       : False
    PackageFamilyName : Microsoft.SurfaceHub_8wekyb3d8bbwe
    PublisherId       : 8wekyb3d8bbwe
    IsResourcePackage : False
    IsBundle          : False
    IsDevelopmentMode : False
    Dependencies      : {Microsoft.NET.Native.Framework.2.2_2.2.27912.0_x64__8wekyb3d8bbwe, Microsoft.NET.Native.Runtime.2.
                        2_2.2.27328.0_x64__8wekyb3d8bbwe, Microsoft.VCLibs.140.00_14.0.27323.0_x64__8wekyb3d8bbwe, Microsof
                        t.SurfaceHub_39.600.139.0_neutral_split.language-ja_8wekyb3d8bbwe...}
    IsPartiallyStaged : False
    SignatureKind     : Store
    Status            : Ok



    PS C:\windows\system32> Get-AppxPackage -name *SurfaceHub* | Remove-AppxPackage
    PS C:\windows\system32> Get-AppxPackage -name *SurfaceHub*
    PS C:\windows\system32>
Android Studioエミュレーターの動作がおかしい人へ

#【はじめに】
Android Studio、仮想デバイスをダウンロードし、エミュレーターを起動すると、下記エラーが表示されました。
今回は、下記エラーの対応策を記載します。

#【エラー内容】

```
Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
```

#【エラー対応】
エラーを以下のように対応しました。

１：エミュレーターを起動する
<img width="52" alt="qiitaandroid1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/c1acb147-515b-c51b-607a-c1c92d633d9d.png">


２：エミュレーターの設定画面を開き、Settingsを選択
<img width="194" alt="qiitaandroid2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/c09c6285-05dc-5d7d-7765-4b8cfdf5d3ed.png">


４：GeneralからAdvancedに変更する
<img width="197" alt="qiitaandroid3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/8226bf5a-9e0e-a5ff-b5ff-5e102d1f2fc8.png">

５：OpenGL ES renderer(requires restart)の設定を変更
<img width="323" alt="qiitaandroid4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/4dda8a95-2b86-e7c1-1964-a45b5a2c44b7.png">

６：変更したら、エミュレーターを再起動

これで対応しました。

５に関しては、どの選択を選べばいいかは、環境によって違うらしいので、エラーがでない選択肢を探してみてください。
TidalCycles TIPS パート2「乱数で自動作曲する」

前回に続いて、乱数を用いた楽曲制作方法について紹介します。

今回は、複数の楽器のサンプル、シーケンスパターン、エフェクトパラメータを一気に変更し、自動作曲のようなことをやってみます。

以下の順で説明します。

1. 1つの楽器のサンプル変更
2. 複数の楽器のサンプル一括変更
3. 複数の楽器のサンプル、シーケンスパターン、エフェクトパラメータの一括変更

# 1つの楽器のサンプル変更

まず最初に、１つの楽器のサンプルの変更をやってみます。

サンプル名称のリストを事前に準備し、ランダムに取り出した値を各種楽器に適用する、というアプローチを取ります。

まず、Dirtのサンプルの名称をリスト化しておきます。（全サンプルでも構いません）

```haskell
sampli = ["bd","cp","hh","sd","bass","arpy","808"]
```

次に、randomRIO関数で取得した値をインデックスとして、先程作成したリストの中からひとつを選び出し、変数randsamに格納します。

```haskell
tmp <- randomRIO (0,(length sampli -1)) -- インデックス番号を生成

randsam = sampli !! (fromIntegral tmp) -- リストから取得

d1 $ s "bd" (# s randsam) -- 楽器に適用
```

これで、d1のサンプルをランダムに変更することができました！！

# 複数の楽器のサンプル一括変更

次に、同様のアプローチで、複数の楽器のサンプル一括変更を試みます。

楽器ごとの乱数を取得します。


```haskell
tmp1 <- randomRIO (0,(length sampli -1)) 
tmp2 <- randomRIO (0,(length sampli -1))
tmp3 <- randomRIO (0,(length sampli -1))
-- 3行同時に実行するとエラーとなる
```

・・・実は、アクション（<-）は複数行同時実行ができません。
これだと楽器の数だけ実行が必要となり、非常に面倒です。。。

複数行同時実行ができない理由が気になる方は下記を参照してください。

<font color="Gray">理由：アクションは、ghciという対話環境以外ではdoブロック内でしか複数行同時実行できないという制約があります。TydalCyclesの実行環境はghciという対話環境で実行されており、doブロックを作ることができません。（実はTydalCyclesの記法のdoは、haskellのdoとは別物です。）</font>

そのため今度は、アクションで乱数のシードのみを生成し、
サンプルリストからランダムに抽出した別のリストを生成するというアプローチを取ります。

```haskell
seed <- randomRIO (0, 1000) -- シード生成

rnumlist = take 10 $ randomRs (1,(length sampli - 1)) (mkStdGen (fromIntegral seed))
randsampli = [sampli !! x | x <- rnumlist]
-- リスト生成　2行同時実行可

randsampli -- ["bass","808","hh","arpy","808","808","bd","sd","hh","arpy"]

```

作ったリストrandsampliを複数の楽器に適用します。

```haskell
d1 $ s "bd" (# s randsampli !! 1) -- "808"
d2 $ s "bd" (# s randsampli !! 2) -- "hh"
d3 $ s "bd" (# s randsampli !! 3) -- "arpy"
```

できました！！


# 複数の楽器のサンプル、シーケンスパターン、エフェクトパラメータの一括変更

いよいよ最後です。
シーケンスパターン、エフェクトのパラメータにも同様のアプローチを適用してみましょう。


## シーケンス
適当に作成したシーケンスパターンを同じくリスト化しておきます。

```haskell
seqli = ["v*8", "v ~ v ~", "[~ ~v]*2? v v? v*4"]
```

## エフェクト（pan）のパラメータ
今回はpan用に、以下を用意してみます。エフェクトに合わせたリストを作ります。
```haskell
panli = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
```

では、、、

```haskell
seed <- randomRIO (0, 1000) 

rnumlist = take 10 $ randomRs (1,(length sampli - 1)) (mkStdGen (fromIntegral seed))
randsampli = [sampli !! x | x <- rnumlist]
rnumlist = take 10 $ randomRs (1,(length seqli - 1)) (mkStdGen (fromIntegral seed))
randseqli = [seqli !! x | x <- rnumlist]
rnumlist = take 10 $ randomRs (1,(length panli - 1)) (mkStdGen (fromIntegral seed))
randseqli = [panli !! x | x <- rnumlist]

d1 $ s (randseqli !! 1) (# s randsampli !! 1) # pan (panli !! 1)
d2 $ s (randseqli !! 2) (# s randsampli !! 2) # pan (panli !! 2)
d3 $ s (randseqli !! 3) (# s randsampli !! 3) # pan (panli !! 3)
```

できました！！！

これで自動作曲・・・に近づきました・・・？
SV3C ビデオカメラ 動画ファイル デコード

マイポータル
https://qiita.com/carpenders/items/adb743f0a308f6786c73

```sv3c.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct pack_ {
        char code[4];
        int len;
        int magic1;
        int magic2;
};

static void dump(struct pack_ &pack)
{
        char code[5];
        memcpy(code,pack.code,sizeof(pack.code));
        code[4] = 0;
        printf("code [%s] len %d(0x%x) magic1 0x%x magic2 0x%x\n",
                code,pack.len,pack.len,pack.magic1,pack.magic2);
}

int main(int argc,char *argv[])
{
        FILE *ifp,*ofp;
        ifp = fopen(argv[1],"rb");
        char ofname[4096];
        sprintf(ofname,"%s.264",argv[1]);
        ofp = fopen(ofname,"wb");
        if(ifp != NULL && ofp != NULL){
                struct pack_ pack;
                int size = sizeof(pack);
                int rd,wr;
                bool ok = true;
                if(ok){
                        rd = fread(&pack,1,size,ifp);
                        ok = rd == size;
                        if(ok){
                                dump(pack);
                        }
                        while(ok){
                                if(ok){
                                        rd = fread(&pack,1,size,ifp);
                                        ok = rd == size;
                                        if(ok){
                                                dump(pack);
                                        }
                                }
                                if(ok){
                                        void *buf;
                                        buf = malloc(pack.len);
                                        rd = fread(buf,1,pack.len,ifp);
                                        ok = rd == pack.len;
                                        if(ok){
                                                wr = fwrite(buf,1,rd,ofp);
                                                ok = wr == rd;
                                        }
                                        free(buf);
                                }
                        }
                }
                if(ifp != NULL){
                        fclose(ifp);
                }
                if(ofp != NULL){
                        fclose(ofp);
                }
        }
        return 0;
}
```

参考
https://oxynotes.com/?p=11912
クラス、インスタンスをまとめてみた


#現在の学習進捗

Proggate 1-4まで修了
※各lessonを３周はしている
4まで進めましたが、1-3と比べてとっつきにくい内容でしたね。
3周しましたがまだ頭に落とし込めていない箇所が多々あります。

 
4章の内容
- クラスとインスタンス
- インスタンスメソッド
-「料理注文システム」を作ろう
最終的には料理注文システムを作っていくプログラムになっております。


 


 

#クラスとは
- データとそのデータを取り扱うメソッドをひと固まりにまとめたもの
- プログラミングで設計図のことをクラス、「もの」のことをインスタンスという
参考にしたURL
https://www.sejuku.net/blog/12879

# initializeの基本的な使い方

・classデータの初期化処理
・newされた際に一度だけ実行される
・オーバーロードできない
・メソッド内ではreturnは使えない
参考にしたURL
https://www.sejuku.net/blog/21170

# インスタンス
- インスタンス化とは、classの定義の元に新たな変数を作成する

参考にしたURL
https://www.sejuku.net/blog/12879
勉強ログ_day5_MySQL入門④(レコード編集、演算、制限）

# はじめに
非エンジニアの勉強ログ。
**超初心者プレイ**のため、内容は自分の勉強メモです。

### 今日のゴール
- MySQL　レコード編集してみる

### 環境
- ホストOS：Windows10 Pro 1903
- [こちら](https://qiita.com/kantan/items/099e2c3ed700f1781df8)で構築した環境を利用する
- MySQL:5.7.27
- SQL開発ツール：A5:SQL Mk-2 2.14.4

### 参考資料・引用元など
- ドットインストール：[MySQL入門](https://dotinstall.com/lessons/basic_mysql_v3 "MySQL入門") ←勉強はこれを基軸に進める
- Qiita：[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)

# レコードの編集
### 更新と削除
- updateとdelete
- これもwhereで条件つけて更新可

```ruby:mysql
update users set user_name = 'kato', age = 53 where user_name = 'sato';
delete from users where age > 90;
```

# 演算
- roundで四捨五入
- floorで切り捨て
- ceilで切り上げ
- randでランダムな値を出す

### たとえばランダムに3名えらぶとか

```ruby:mysql
select * from users order by rand() limit 3;
```

### 文字列も演算できるよ
- length で文字のながさ
- substr で文字列を切り出す
- upper で全部大文字、lowerで全部小文字
- concat で文字列をつなげる
- カラムに別名つけて保存するときは「as」

# レコード入力の制限
- enum で、カラムに入れられる文字列を選択肢みたいに出来る
- set で、カラムに入れられる文字列を選択肢かつ複数選択にできる

```ruby:mysql
create table adresses (
    prefecture enum('Tokyo', 'Osaka', 'Fukuoka'),
    pets set('Dog', 'Cat', 'bird')
);
```

# あとがき
- 今回からひっそりSQL開発ツール入れた。黒い画面より全然やりやすい。地味に仮想サーバにつなぐ設定が難しかった
IMEの予測入力を無効にするには

#IMEの予測入力を無効にするには

今日のハイライトをメモ
※問い合わせを受けて調べたことを共有する、後で自分で見返せるのでメリットはあると思う

## 設定前
予測入力が有効になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/58b84785-de59-8e1c-b8c0-6e3ce9772469.png)


## 設定方法

### タスクバーにあるMicrosoft IMEを右クリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/88a98d48-f8b6-653e-1a7c-865cf0bda72d.png)

### プロパテイをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/8c579e79-0dfd-755d-597c-fbab6281597a.png)

### 詳細設定をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/42748b38-54a1-e0e1-7fc7-195a68a7a4f0.png)

### チェックボックス「予測入力」のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/a206da89-a295-f723-2bce-7a3f1b2db43b.png)

### 設定後
予測入力が無効になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/a3dfa87c-c221-821e-0141-d2b4e86aa341.png)

めでたしめでたし

## ちょっと待て、予測入力サービス「りんな」って何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/2248b34b-2b56-7c0f-77c3-1934bd7fe61f.png)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/c0945de6-db32-7548-2033-9b281094c52a.png)

詳細はこちら
https://www.rinna.jp/platform/ime

おわり

<!-- 
'執筆時間(22:15 - 22:35)
-->
AtCoder Beginner Contest 014 D - 閉路 (ダブリング 、二頂点のLCAの検出)

# AtCoder Beginner Contest 014 D - 閉路 (ダブリング 、二頂点のLCAの検出)

https://atcoder.jp/contests/abc014/tasks/abc014_4

LCA(lowest common ancestor)を求めるアルゴリズム。計算量は前処理のダブリングテーブルの構築に$O(n 
\log n)$、各クエリごとに$O(\log n)$。

```python
from collections import defaultdict, deque, Counter
from heapq import heappush, heappop, heapify
import math
import bisect
import random
from itertools import permutations, accumulate, combinations, product
import sys
import string
from bisect import bisect_left, bisect_right
from math import factorial, ceil, floor
from operator import mul
from functools import reduce


sys.setrecursionlimit(2147483647)
INF = 10 ** 13
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())
def LS(): return sys.stdin.buffer.readline().rstrip().decode('utf-8').split()
def S(): return sys.stdin.buffer.readline().rstrip().decode('utf-8')
def IR(n): return [I() for i in range(n)]
def LIR(n): return [LI() for i in range(n)]
def SR(n): return [S() for i in range(n)]
def LSR(n): return [LS() for i in range(n)]
def SRL(n): return [list(S()) for i in range(n)]
def MSRL(n): return [[int(j) for j in list(S())] for i in range(n)]
mod = 1000000007



class LCA(object):
    def __init__(self, G, root=0):
        self.G = G
        self.root = root
        self.n = len(G)
        self.logn = (self.n - 1).bit_length()
        self.depth = [-1 if i != root else 0 for i in range(self.n)]
        self.parent = [[-1] * self.n for _ in range(self.logn)]
        self.dfs()
        self.doubling()

    def dfs(self):
        que = [self.root]
        while que:
            u = que.pop()
            for v in self.G[u]:
                if self.depth[v] == -1:
                    self.depth[v] = self.depth[u] + 1
                    self.parent[0][v] = u
                    que += [v]

    def doubling(self):
        for i in range(1, self.logn):
            for v in range(self.n):
                if self.parent[i - 1][v] != -1:
                    self.parent[i][v] = self.parent[i - 1][self.parent[i - 1][v]]

    def get(self, u, v):
        if self.depth[v] < self.depth[u]:
            u, v = v, u
        du = self.depth[u]
        dv = self.depth[v]

        for i in range(self.logn):  # depthの差分だけuを遡らせる
            if (dv - du) >> i & 1:
                v = self.parent[i][v]
        if u == v: return u  # 高さ揃えた時点で一致してたら終わり

        for i in range(self.logn - 1, -1, -1):  # そうでなければ上から二分探索
            pu, pv = self.parent[i][u], self.parent[i][v]
            if pu != pv:
                u, v = pu, pv
        return self.parent[0][u]

n = I()
G = [[] for _ in range(n)]
for x, y in LIR(n - 1):
    G[x - 1] += [y - 1]
    G[y - 1] += [x - 1]

lca = LCA(G)
q = I()
ans = []
for a, b in LIR(q):
    ans += [lca.depth[a - 1] + lca.depth[b - 1] - 2 * lca.depth[lca.get(a - 1, b - 1)] + 1]

print(*ans, sep='\n')

```
Automation Anywhere Enterpriseを使う際に役立つサイト等をまとめてみた （リンク集）





#公式サイト
Apeople - 公式のユーザコミュニティ。日本語での投稿もOK。
https://apeople.automationanywhere.com/s/

製品ドキュメント - 日本語表示も可能
https://docs.automationanywhere.com/

Automation Anywhere University - eラーニングサイト。日本語コンテンツで基礎から応用まで学べる
https://university.automationanywhere.com/


Bot Store – Automation Anywhere - ロボットの部品が色々落とせます。
https://botstore.automationanywhere.com/

Automation Anywhere - YouTube
https://www.youtube.com/channel/UCZP7bD2cUzaBp_bEgHidoPw

Automation Anywhere Japan - YouTube
https://www.youtube.com/channel/UCskvD3HvVZ9KifHZxAvUCmA

Automation Anywhere Japan Presentations on SlideShare
https://www.slideshare.net/AutomationAnywhereJapan/presentations


#ブログ・Qiitaなど

Blogs -> 公式フォーラム「Apeople」にある、Automation Anywhereの社員によるお役立ち情報などのブログです。
https://apeople.automationanywhere.com/s/topic/0TO2t000000XklRGAS/blogs

AutomationAnywhere - Qiita
https://qiita.com/tags/automationanywhere

monaka_aries - Qiita -> 初めて学ぶ人向けにとても分かりやすく解説してくれている。オススメ。
https://qiita.com/monaka_aries

Automation Anywhere用語集 （非公式）
https://scrapbox.io/AutomationAnywhere/

Automation Anywhere A2019 ポータル （非公式）
https://scrapbox.io/a2019/

Automation Anywhere アーカイブ | BTC RPA
https://rpa.bigtreetc.com/column/tag/automation-anywhere/

AI/RPA｜技術ブログ｜C&S ENGINEER VOICE
https://licensecounter.jp/engineer-voice/blog/category/ai-rpa/

Automation Anywhere 導入マニュアル | RPA Knowledge
https://rpa-knowledge.com/category/introduction/


#参考になる記事
Automation Anywhereとは？機能〜勉強方法まで解説！ | RPA HACK
https://rpahack.com/automationanywhere

【RPA】Automation Anywhere Community Editionをインストール【Automation Anywhere】 - だって楽したいじゃんか！
http://makimakimakino.hatenablog.com/entry/2019/03/30/151419


#書籍
KEYS TO RPA SUCCESS 日立ソリューションズのRPA成功法則 (Shoeisha Digital First) 
https://www.amazon.co.jp/dp/4798162256/ref=cm_sw_em_r_mt_dp_U_JdUUDbYW8KEMJ 

現場の業務を完全自動化 AI搭載RPAツール Automation Anywhere Enterprise 開発・運用ガイド
https://www.amazon.co.jp/dp/4800712637/ref=cm_sw_em_r_mt_dp_U_R5cdFbNN55H5P 

Automation Anywhere A2019シリーズではじめるRPA超入門~初心者でも手軽に業務改革~ 
https://www.amazon.co.jp/dp/4822296911/ref=cm_sw_em_r_mt_dp_U_T7cdFb3X9W97N
picoCTF 2019 Client-side-again - Points: 200

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/83263581-8037-14bc-7fde-22d4abfd0fbe.png)

#解いてみた

サイトにアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/62885fdb-6708-b56e-49a4-732d933c7a5e.png)

ログイン画面がありました。
ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e3dae873-497d-e72b-f92a-1911186724b5.png)

入力したパスワードを10行目のjavascriptが何か判定をして正解か不正解かを判定しているようです。
とりあえずjavascriptを整形してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/93f44935-1e3d-11f8-1efb-5109c76f9853.png)

かなり厳しいif文がありますね。
webページを保存していろいろやってみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5a180436-fcdf-a8c8-e016-b778f2ef5cee.png)

29行目にalertを入れてcheckpassを表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/45ff441c-9c8f-2c45-36a9-904b7afa5bf9.png)

入力した文字が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/865f1475-cb34-113a-c855-bb24aecdcd8b.png)

ということで、比較する右側が答えで左側が入力したもののようです。
右側を表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8b425f67-ba49-80fa-7c3f-5a1e6a5f75b5.png)

最初のif文の右側を表示させてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e0e6aaec-3f2f-8676-76e8-133c1c5c8fd6.png)

フラグと同じものを書けば最後まで行けそうな気がします。
一気に全部alertで書いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/dbfdbac5-bb81-de38-ea86-db838c6ab9e7.png)

あーなんかダミーあるんですね。
左側も出力するようにします。
先に左側を全部出力して、次に右側を出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/089baeca-7589-de3f-8738-e5652f79fb6f.png)

こんな感じになったので、これをうまく並び替えたら答えです。
【Python】APDS9960の環境光RGBを測定するコード

## RGBを調べるサンプルコードがなかったので作りました。
今回は、こちらのライブラリを使っています。
https://github.com/liske/python-apds9960
今回はMicroPythonではないプログラムです。

```APDS9960
from apds9960.const import *
from apds9960 import APDS9960
import RPi.GPIO as GPIO
import smbus
from time import sleep

port = 1
bus = smbus.SMBus(port)

apds = APDS9960(bus)

try:
    apds.enableLightSensor()
    oval = -1
    print("LoggingStart")
    while True:
        sleep(0.1)
        print("RedLight={}".format(apds.readRedLight()))
        print("GreenLight={}".format(apds.readGreenLight()))
        print("BlueLight={}".format(apds.readBlueLight()))

finally:
    GPIO.cleanup()
    print ("Bye") 
```

他の事もしたいという人は、このコードを見てみてください。
https://github.com/liske/python-apds9960/blob/master/apds9960/device.py
React Native「WebView」内で開いたサイトのリンクをsafariで開く

#概要
普段はReact NativeでIOSアプリを開発してます
今回はreactnativeのWebViewでサイトを開いた際に最初のページだけはアプリ内を、
開いた後のリンクはsafariで開く方法を共有します


アプリ登録は省略します

```WebViewPage.js
import React, { Component } from 'react';
import { WebView, Linking } from 'react-native';

class WebViewPage extends Component {
  render() {
    const uri = 'https://qiita.com/';
    return (
      <WebView
        ref={(ref) => { this.webview = ref; }}
        source={{ uri }}
        onNavigationStateChange={(event) => {
          if (event.url !== uri) {
            this.webview.stopLoading();
            Linking.openURL(event.url);
          }
        }}
      />
    );
  }
}

export default WebViewPage;
```

動かなかったり、改善点など共有していただけると幸いです

#参考文献
[stackoverflow: React Native - open links in browser
](https://stackoverflow.com/questions/35531679/react-native-open-links-in-browser)
MySQL8系はパスワードが空だとアクセスできないらしい

# LaravelでDB Migrateしようとするとエラー

ローカルでLaravelでプロジェクトを作成して、envファイルが以下のようにパスワードが空の状態で、MySQL 8.0に対してmigrateを行うとエラーがでた。

```
// .env
DB_USERNAME=root
DB_PASSWORD=
```

以下を実行するとエラーが起きた

```terminal
$ sudo php artisan migrate
```

エラー内容

```
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
 
   at /Users/mbp/Documents/sample-laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
     661|         // If an exception occurs when attempting to run a query, we'll format the error
     662|         // message to include the bindings with SQL, which will make this exception a
     663|         // lot more helpful to the developer instead of just the database's errors.
     664|         catch (Exception $e) {
     665|             throw new QueryException(
     666|                 $query, $this->prepareBindings($bindings), $e
     667|             );
     668|         }
     669|
 
   Exception trace:
 
   1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)")
       /Users/mbp/Documents/sample-laravel/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
 
   2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel", "root", "", [])
       /Users/mbp/Documents/sample-laravel/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
 
   Please use the argument -v to see more details.
```

PDOExceptionが出てる。MySQL5.6とかでは気にしてなかったんだけど。。。


# 解決
単純にパスワードが空だとダメらしい。これはMySQLが使っている認証プラグインに起因するとのこと。
参考：[stackoverflow](https://stackoverflow.com/questions/52364415/php-with-mysql-8-0-error-the-server-requested-authentication-method-unknown-to)

MySQLにrootで入って、以下を打つ。

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password
BY 'password';
```

passwordのところは、rootに設定したい任意のパスに変更する。
他のユーザでログインする場合はrootのところをユーザ名に変更する。
Raspberry Piを使い、MCP3008を通して感圧センサーのデータを採取したいです。

###前提

○使用している機材
・Raspberry Pi
・MCP3008（A/Dコンバータ）
・1pc DF9-40（感圧センサー）
https://www.amazon.co.jp/gp/product/B07X8SPLJ4/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1
※SPIのインストールは完了しています。

○参考にしたPythonコード,配線
http://kousen-tech.blogspot.com/2016/10/raspberry-pi_30.html

○実現したいこと
RaspberryPiを使って感圧センサーから、
圧力のデータを採取したいです。

###問題点
ターミナル、エディタともに正常に実行できているのですが、
数値として表示されるデータがどれだけ圧力をかけても
0,0,0,0,0…としか表示されません。

該当の感圧センサーは
RaspberryPiと対応してないのでしょうか？

お手数ですが、
ご教示のほどよろしくお願い申し上げます。
picoCTF 2019 Based - Points: 200

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/65285e2e-a54e-eabe-5a33-6e3ec3ce272d.png)

#解いてみた

問題サーバにアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0005191a-979b-5fdf-4ec0-95ffaec30eac.png)

2018にも同じ問題があった気がします。

やることは2進数、8進数、16進数が出てくるので、それを文字に変換して答える問題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1903fe38-3045-42d2-9e87-2323bd6332e3.png)

時間制限があるので、cyberchefを使って必要な変換以外はオフにしておけば素早く変換できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1df18650-e1ba-0b3f-950f-c100c8af25d3.png)
lua でよく見かける function tab:func() の動きについて個人的にメモ

`:func` の動きがおまじないぐらいでしか分かってなかったけど，なんとなく分かったのでメモ

`my_table.function()` と `my_table:function()` の呼び方二通りがある

### my_table.func()

```lua
local my_table = {}

function my_table.func()
    print('funk')
end

my_table.func() -- funk
```

### my_table:func()

```lua
local my_table = {}

function my_table:func()
    print('funk')
end

my_table.func() -- funk
```

これらの違いは第一引数に `self` を取るかどうか  
上のを書き換えると

`function my_table:func(arg1, arg2)` -> `function my_table.func(self, arg1, arg2)`

になる

文字列 `string` に対して一部を切り出すには `sub` メソッドを使うが，これは以下のように書き換えられる

```lua
local s = 'string'
print(s:sub(3)) -- ring
```

そのまま呼ぶのは宣言されていないからか出来ないっぽい

```lua
print('string':sub(3)) -- ')' expected near ':'
```

## self に何が入るか

最上位のテーブルに項目名で値が代入される

```lua
local my_table = {
    pink =  'Yup',
    green = 'Yup',
    white = 'Yup'
}

function my_table:check(s)
    if self[s] then
        print(self[s])
    else
        print('hmm')
    end
end

my_table:check('pink') -- Yup
my_table:check('green') -- Yup
my_table:check('white') -- Yup
my_table:check('yellow') -- hmm
```

この使い方ができるのでクラス的な書き方ができる

```lua
local person = {}

function person:init(first, last)
    self.first = first
    self.last = last

    return self
end

function person:say()
    local fmt = "I'm %s %s"
    print(fmt:format(self.first, self.last))
end

local p = person:init('John', 'Henry')
p:say() -- I'm John Henry
--[[
    {
        last = "Henry",
        init = "function: 0x7fe8115000f0",
        say = "function: 0x7fe811500120",
        first = "John"
    }
]]
```
Swift：省略記法を使わないflatMap，compactMap

```swift:flatMap
let array: [[String]] = [["apple", "banana"], ["grape", "peach"]]

let flatArray = array.flatMap { (innerArray) -> [String] in
    return innerArray
}

Swift.print(flatArray)
// -> ["apple", "banana", "grape", "peach"]
```

```swift:compactMap
let array: [String?] = ["apple", "banana", nil, "grape"]

let nonNilArray = array.compactMap { (str) -> String? in
    return str
}

Swift.print(nonNilArray)
// -> ["apple", "banana", "grape"]
```

私は`$0`を使う省略記法あまり好きではないです...
CygwinでEmacs Diredを使ってWindowsアプリを起動する話

##はじめに
Emacs標準ファイラのDiredでWindowsアプリを起動したくなったので設定してみた

##概要
既に[dired-open.el](http://emacs.rubikitch.com/dired-open/)というDiredからWindowsアプリでファイルを開くパッケージがリリースされているけれど、拡張子ごとに設定をしなければならないのが面倒だったので、追加パッケージ無しでWindowsの関連付けに基づいてファイルが開けるスクリプトを考えた。

##環境
Windows10 Pro 64bit
Cygwin 64bit
GNU Emacs 26.3 (build 1, x86_64-pc-cygwin)

##スクリプト
###本体
CygwinにはWindowsコマンドプロンプトの`START`コマンドに相当する、`cygstart`コマンドが存在するためこれを利用する。カーソル位置またはマークしたファイル/フォルダに対して`cygstart`コマンドを実行する。

```emacs-lisp
;; markしたファイルに対して`cygstart`コマンドを実行する
(defun dired-do-open-with-application ()
  (interactive)
    (let ((files (dired-get-marked-files t current-prefix-arg)))
      (dired-do-shell-command "cygstart ?" nil files)))
```
ちなみに、MacOSの場合は`cygstart`の部分を`open`コマンドに書き換えることで簡単に対応できる

###キー割り当て
```emacs-lisp
;; キーバインド
(define-key dierd-mode-map (kbd "C-c o") 'dired-do-open-with-application)
```
[Swift5] もう迷わないファイル入出力

## ファイル読み込み

```swift
import Foundation

let fileName = "hoge.txt"

// ファイルを読み込みモードで開く
let file = FileHandle(forReadingAtPath: fileName)!

// 内容を読み込む(Dataが得られる)
let contentData = file.readDataToEndOfFile()

// Data->Stringに変換
let contentString = String(data: contentData, encoding: .utf8)!

// ファイルを閉じる
file.closeFile()
```

## ファイル書き込み(追記)

```swift
import Foundation

let fileName = "hoge.txt"
let contentString = "testContent"

// ファイルを書き込みモードで開く(ファイルの内容は消えない)
let file = FileHandle(forWritingAtPath: fileName)!

// String->Dataに変換
let contentData = contentString.data(using: .utf8)!

// 一番うしろにシーク
file.seekToEndOfFile()

// Dataを書き込み
file.write(contentData)

// ファイルを閉じる
file.closeFile()
```
react-navigationで同一ページに遷移する

#概要

普段はReact NativeでiOSアプリを開発してます

今回は、react-navigationで同一ページ（そのページ内での詳細は別）への遷移をした際に正常に動かせるまでのメモを共有します

#現象
ナビゲーターは以下の通り

```navigator.js
import Page from "./page.js"
import { createStackNavigator} from "react-navigation";
const Rooter = createStackNavigator({
  Page: {
    screen: Page,
  },

});
export default Router;

```

アプリ登録は省略します、該当コンポーネントは以下の通り

```Page.js
import React, { Component } from 'react';
import {
  TouchableOpacity,
  View,
  } from 'react-native'
class Page extends Component {

  render() {
  
      return(
        <View>
          <TouchableOpacity onPress={()=>{
             this.props.navigate.navigate("Page")
          }} >
            {"Button"}
          </TouchableOpacity>
        </View>

      );


  }
}
export default Page;
```

以上2点が主なコードです
ただこの構成ではうまく同一ページに遷移することができません

#解決
変更点はPage.jsのみです

```Page.js
import React, { Component } from 'react';
import {
  TouchableOpacity,
  View,
  } from 'react-native'
class Page extends Component {

  render() {
  
      return(
        <View>
          <TouchableOpacity onPress={()=>{
             //this.props.navigate.navigate("Page")
             this.props.navigate.push("Page")
          }} >
            {"Button"}
          </TouchableOpacity>
        </View>

      );


  }
}
export default Page;
```
navigateをpushにすることで同一ページへの遷移を行わせることが可能になります

#参考資料
[React Navigation API Reference: Navigator-dependent functions](https://reactnavigation.org/docs/en/navigation-prop.html#navigator-dependent-functions)

[stackoverflow: Stack same screen multiple times with React Navigation
](https://stackoverflow.com/questions/55211289/stack-same-screen-multiple-times-with-react-navigation)
#Linux の curl を ssh proxy を経由で実行する

なにやらsshでportを立てて、それ経由でcurlできるっぽい

```
ssh -D 8080 -f -C -q -N user@remote.host
curl -x socks5h://0:8080 https://example.com
```

[curl HTTPS via an SSH proxy - Stack Overflow](https://stackoverflow.com/questions/51579063/curl-https-via-an-ssh-proxy)

# ssh -D

アドレスをポートにバインドする

```
     -D [bind_address:]port
             Specifies a local ``dynamic'' application-level port forwarding.
             This works by allocating a socket to listen to port on the local
             side, optionally bound to the specified bind_address.  Whenever a
             connection is made to this port, the connection is forwarded over
             the secure channel, and the application protocol is then used to
             determine where to connect to from the remote machine.  Currently
             the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
             as a SOCKS server.  Only root can forward privileged ports.
             Dynamic port forwardings can also be specified in the configura-
             tion file.
```

# ssh -f

バックグラウンドでなんとか

```
     -f      Requests ssh to go to background just before command execution.
             This is useful if ssh is going to ask for passwords or
             passphrases, but the user wants it in the background.  This
             implies -n.  The recommended way to start X11 programs at a
             remote site is with something like ssh -f host xterm.

             If the ExitOnForwardFailure configuration option is set to
             ``yes'', then a client started with -f will wait for all remote
             port forwards to be successfully established before placing
             itself in the background.

```

# ssh -C

圧縮がなんとか

```
     -C      Requests compression of all data (including stdin, stdout,
             stderr, and data for forwarded X11, TCP and UNIX-domain connec-
             tions).  The compression algorithm is the same used by gzip(1).
             Compression is desirable on modem lines and other slow connec-
             tions, but will only slow down things on fast networks.  The
             default value can be set on a host-by-host basis in the configu-
             ration files; see the Compression option.
```

# ssh -q

お静かにモード

```
     -q      Quiet mode.  Causes most warning and diagnostic messages to be
             suppressed.
```

# ssh -N

コマンド実行しない
portを待ち受ける時に便利らしい

```
     -N      Do not execute a remote command.  This is useful for just for-
             warding ports.
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Flutterでmaxlinesの大きさだけTextFieldの高さが大きくなってしまう問題について



Flutterでは `maxLines` の高さを大きくしたら最初からその高さ分大きくなってしまいます。

例えば下記のようなコードを書いた時に


```dart

TextField(
  keyboardType: TextInputType.multiline,
  maxLines: 2,
  decoration: InputDecoration(
     hintText: "Comment ✍️",
     focusedBorder: _inputBorder,
     enabledBorder: _inputBorder,
   ),
),

```

<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139360/06850f5c-601d-25a2-5469-14d6bf38f8f0.gif">

こんな感じになってしまいます。


## minLinesも設定する

この問題は `minLines` も設定することで解決できます。

```dart

TextField(
  keyboardType: TextInputType.multiline,
  maxLines: 2,
  minLines: 1,
  decoration: InputDecoration(
     hintText: "Comment ✍️",
     focusedBorder: _inputBorder,
     enabledBorder: _inputBorder,
   ),
),

```


<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139360/7aafadf0-7087-2acf-5ef6-1e6785ca7d17.gif">


以上です。
初心者によるプログラミング学習ログ 142日目

# 100日チャレンジの142日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

142日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>142日目<br><br>メンターさんのjavascript課題<br><br>やることあったので、あまりできませんでした。<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/javascript?src=hash&amp;ref_src=twsrc%5Etfw">#javascript</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1188204994303938560?ref_src=twsrc%5Etfw">October 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Java (add)

Javaの勉強をしているので、備忘録としてUPします。

【add】
ArrayListに要素を追加する際に使用するメソッドである。

変数名.add()の中に追加したい値を入れて使用する。

    ArrayList<String> array = new ArrayList<String>();
    
    array.add("日本語");
    array.add("英語");
    array.add("フランス語");

リストの中を出力すると以下のようになる。

    System.out.println(array);

    日本語,英語,フランス語

この後に続けて追加すると以下のように、追加されていく。

    array.add("中国語");
    array.add("ドイツ語");

    System.out.println(array);

    日本語,英語,フランス語,中国語,ドイツ語
PL/SQLの基本的な形と実行について

#はじめに

業務でPL/SQLを使う機会がありました。ネットで調べると基本的な説明や書き方はすぐに見つか流のですが、全体的な形が中々イメージできなかったため苦戦してしまいました(特にパッケージを使ったサンプル等がなかなか見つかりませんでした)。
今回は未来の自分のメモとしての役割も含め、PL/SQLの大まかな形をまとめてみることにしました

#PL/SQL

以下にPL/SQLの簡単なサンプルを記載します。

```sql:program.sql

--パッケージ仕様
CREATE OR REPLACE PACKAGE PACKAGENAMES AS
    --関数定義
	FUNCTION FUNCTIONNAME(
		 argument    IN    NUMBER
		) RETURN NUMBER;
END PACKAGENAMES;
/

SHOW ERRORS


--パッケージ本体
CREATE OR REPLACE PACKAGE BODY PACKAGENAMES AS

    -- ここに関数の処理を記述する
	FUNCTION FUNCTIONNAME(
		 argument		IN	NUMBER
		) RETURN NUMBER
	IS
    -- ここで変数を定義する
	error_code number(5);
	error_message varchar2(1024);

	BEGIN
        -- ここにSQL文を記載する

    -- 正常終了
	RETURN 0;

    -- エラーが起こった場合の処理
	EXCEPTION
		WHEN OTHERS THEN
            -- 異常終了
			RETURN 1;
	END FUNCTIONNAME;

END PACKAGENAMES;
/
SHOW ERRORS


```

#実行について

PL/SQLを作成したということはどこかで実行することになると思われます。
今回はBATで実行するための手順を記載します。

まずは上で作成したprogram.sqlを実際に呼び出すためのPL/SQLを作成します。


```sql:call.sql
set serveroutput on;
DECLARE
    ResultCD NUMBER;
BEGIN
    ResultCD := PACKAGENAMES.FUNCTIONNAME(&1);
    
    DBMS_OUTPUT.PUT_LINE('ResultCD='||ResultCD);
END;
/

exit;


```

次にこのcall.sqlを呼び出すためのBATを作成します。

```call.bat

@echo off

rem 引数を設定
set argument=25

sqlplus ユーザー/パス@接続 @実行ファイル %argument%
PAUSE

exit

```

#おわりに
PL/SQLの書き方やコンパイルの仕方については、少し調べたら出てくるので今回は省略しています。かなりあっさりとした内容になってしまいましたが、PL/SQLを書くときの基本形はこんな感じかなと思います。


#参考サイト
[PL/SQLパッケージの使用](http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19257-01/packages.html)
mysqlが起動できない！のエラーが出るときの対処法

## 事象
mysqlを起動しようとして以下のコマンドを打ったときに
`$mysql.server start`

mysqlが起動できずに以下のエラーが置きます
`ERROR! The server quit without updating PID file`

エラー通りに
`/usr/local/var/mysql/`
にpidファイルを作っても起動ができません。

## 対処法
以下のファイルを消してから
`/tmp/mysql.sock`

mysqlの起動を行いましょう
`$mysql.server start`

## 対処法までのたどり着き方
エラーの対処までのたどり着き方も大事なので見ていきましょう。

まずmysqlのlogファイルをみてみましょう。
以下のファイルをみてみましょう。
`$tail -f /usr/local/var/mysql/***.err`

このコマンドを打ちながら別のターミナルタブを開いて
`$mysql.server start`
を打ってみましょう。

そうすると
`[ERROR]`
となっているところがあります。

そこに `mysql.sock`が邪魔してます的なことが書いてあります。

そこを読んで `mysql.sock`を消した所mysqlを起動することができました。
Unity2019でARCoreの環境構築と平面検出

世に出ている記事が古くなってきているので、現時点（2019/10/31）最新の情報を備忘録として残します。

#環境構築
###1.Unityをインストール
2019/10/31時点の最新バージョン 2019.2.10f1
[Unity download](https://unity3d.com/jp/get-unity/download)

その他Android SDK、JDK、NDKが必要ですが、下記のような詳細手順からインストールします。
[Unity2018インストールからAndroidビルドするまでの手順](https://qiita.com/taroyan/items/2ff7f6aadd640221bde5)

###2.GitHubからARCore SDKをダウンロード
2019/10/31時点の最新バージョン 1.13.0
[arcore-unity-sdk](https://github.com/google-ar/arcore-unity-sdk/releases)

###3.Unityで必要なパッケージをインストール
下記2つのパッケージが無いとエラーが出るのでインストールします。
**Multiplayer HLAPI**
**XR Legacy Input Helper**

手順：Unityのメニュー「**Window>Package Manager**」を起動して、一覧から検索かけてウィンドウの右下にある「install」ボタンを押します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/64caf60c-af7d-e100-920a-135561c590e3.png)

###4.ARCore SDKをインポート
**Assets>Import Package>Custom Package**のメニューから、2でダウンロードしたARCore SDKを選択し全てインポートします。
インポートに成功するとAsset Browser内に「**GoogleARCore**」というフォルダが作成されます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/6bbdabc4-a50a-c5ea-dbfb-a3ff13aa622e.png)


###5.PlatformをAndroidに変更
UnityのBuild Settingsで「**Android**」を選択し「**Switch Platform**」を押します。

###6.Player Settingsを変更
Player Settingsを開いて下記の設定をします。

**Other Settings：Graphics APIからVulkanを削除する
Other Settings：Minimum API Levelを7.0以上にする
XR Settings:ARCore Supportedにチェックを入れる**

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/3a3f286a-b0ea-0f99-3e3a-26063f6c5959.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/a0b120cd-d91f-6d03-ee5a-c6ece74eaaff.png)


#ARCoreプロジェクトの基本（平面の検出）
###1.SDK内のprefabを配置
Asset Browserの「GoogleARCore>Prefabs」内にある下記2つのPrefabをHierarchy Viewにドラッグドロップして配置します。
**ARCore Device
Environmental Light**

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/34625d11-103e-9480-4a4b-394b3bf8fe75.png)


###2.SessionConfigファイルを作成
Asset Browserで「Crerate>Google ARCore」からSession Configを選択し新規作成します。
そして1で配置した**ARCore Deviceオブジェクト**のInspectorを開き**Session Config**に、今作成したSessionConfigファイルを設定します。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/7a42a0a8-dc3e-52d6-d795-01c08170194b.png)


###3.平面検出用オブジェクトを作成
Hierarchy Viewで空のGame Objectを作成します。
Inspectorの「Add Component」から「**Detected Plane Generatorコンポーネント**」を選択します。
アタッチしたDetect Plane Generatorコンポーネントの「Detected Plane Prefab」に、Asset Browserの「**GoogleARCore>Examples>Prefabs>DetectedPlaneVisualizer**」を指定します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/1a870448-27a6-6a1f-aa8e-807a77d70a19.png)


###4.Build And Run!!
あとは実機をUSBでつなげてBuild And Runすれば平面を検出するアプリが起動されます。

<img width="70%" alt="スクリーンショット 2018-10-23 11.22.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/88b0f110-f16c-92be-e1ea-58bb524a9997.png">

環境構築は大変だけど、そのあとは素敵なARライフが待ってますね😀
FlutterのTextFieldで複数行テキストを入力するようにする

FlutterのTextFieldはデフォルトでは改行ができなくなっています。

<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139360/eca682eb-b9e1-5bd1-db64-ab43bd95d3de.gif">


```dart

TextField(
   decoration: InputDecoration(
     hintText: "Comment ✍️",
     focusedBorder: _inputBorder,
     enabledBorder: _inputBorder,
   ),
),

```

## 複数行入力できるようにする


下記の二つを追加します。

```dart
keyboardType: TextInputType.multiline,
maxLines: null,
```

<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139360/72a39186-8bfa-36cb-f509-59a9b2149ad8.gif">


```dart

TextField(
   keyboardType: TextInputType.multiline,
   maxLines: null,
   decoration: InputDecoration(
     hintText: "Comment ✍️",
     focusedBorder: _inputBorder,
     enabledBorder: _inputBorder,
   ),
),

```


以上です。
シンプルにCentOS7にruby on railsを入れるの巻

これまた備忘録です。
他の人が書いた優秀な記事はたくさんありますが、少なくとも私の環境では…って感じです。



## 前提
 - OS: CentOS Linux release 7.7.1908 (Core)
 - 最小限のインストール

## ruby on railsのインストール

### gitのインストール

```
# yum install git
```

### rbenv/ruby-buildのインストール
ユーザのホームディレクトリにrbenvを導入する。

```
# su - <一般ユーザ>
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

一般ユーザで再ログインしてインストール確認

```
$ rbenv
rbenv 1.1.2-11-gc46a970
Usage: rbenv <command> [<args>]
.
.
```

ruby-buildのインストール

```
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
  →　Available versionsがたくさん表示される。
```

### rubyのインストール

2019/10/31時点での安定板は2.6.5のため、これをインストールする…
んだけどビルドが失敗するので、前提パッケージを入れる必要がある。

```
(前提パッケージのインストール)
# yum install openssl-devel readline-devel zlib-devel gcc gcc-c++ bzip2

(一般ユーザに戻ってruby2.6.5のインストール)
$ rbenv install 2.6.5
```


### railsのインストール

Railsを入れるためのgemがこの段階ではまだ使えないので、rbenvのshellオプションで利用可能にしてからgemする。

```
$ rbenv shell 2.6.5
$ gem install rails
```

### bundlerのインストール

パッケージマネージャのbundlerのインストール

```
$ rbenv exec gem install bundler
```

## Railsプロジェクトの作成

どうも記事執筆時点でのバージョンは6.0.0で「なんか枯れてなさげじゃね？」って心のどこかで思いますが…
そんなことは置いておいてプロジェクトを作ってみるのですが、
…が、最初にやったときはsqlite3関連のパッケージが入ってなくて怒られたので言われるがままにインストールします。

```
(rootユーザ)
# yum install sqlite-devel

(一般ユーザ)
$ gem install sqlite3 -v '1.4.1' --source 'https://rubygems.org/'
```


```
$ rails new hello_world
```

できたぁぁぁぁ




## 参考サイト

 - https://tsuchikazu.net/linux_ruby_on_rails_install/
 - https://qiita.com/rry/items/12d794437cde733f8ece
   - https://qiita.com/kasumani/items/042bf799d6794bd2e4f2