OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode Organizerした際のエラーについて

# 基礎中の基礎 バンドルIDエラー
コンパイルが通ったため App Store Connect へのビルドを敢行した際の出来事

<img width="500" alt="バンドルID違い.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283579/888c59a2-3a3c-9d43-1483-ce43cd1af46f.png">

バンドルIDが違うと、他のエラーメッセージも出ないため凶悪
一度申請するとバンドルIDは不変のため、出ることはないはずですが
初期申請時には確認をお忘れなく

# plistエラー
Xcodeの開発時から触っていなかったplistが火を吹く
<img width="686" alt="plistエラー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283579/263aa8a8-a519-f5ee-e2dc-aa1ac01d4560.png">

原因は初期値のTest.storyBoardがセットされていたこと
<img width="625" alt="plist.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283579/94ae8c8d-2b78-3c7a-3ba8-1adc596c74c8.png">
削除でOK

### 参考
[stack overflow:ストーリーボードファイル「MainStoryboard_iPad〜ipad.storyboardc」が見つかりませんでした(英語)](https://stackoverflow.com/questions/19967328/storyboard-file-mainstoryboard-ipadipad-storyboardc-was-not-found/29191015)
herokuCLIを通したherokuの開始（入門者用）

# Herokuとは？
`Herokuは はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォームで、アイデアを出してから運用を開始するまでのプロセスを迅速に進めることが可能です。また、インフラストラクチャの管理の問題からも解放されます。`--[公式フォムページ](https://jp.heroku.com/home)から抜粋

補足するとHerokuはPaaS(Platform as a Service)として開発者はアプリケーション開発のみ集中すれば、アプリケーションの配布と運用が出来るということです。[GitHub](https://github.com)と連動されているのでgitにpushだけでデプロイが可能なのでCI/CDに適切なプラットフォームです。現在`Node.js`,`Java`,`PHP`,`Go`などの言語を対応しています。

# Heroku-CLIのダウンロード
Heroku-CLIはターミナル上でHerokuアプリをよりやすく扱えるツールです。
[こちら](https://devcenter.heroku.com/articles/heroku-cli)でダウンロードできます。(**gitを事前にインストールしてください。**)
自分のOSに合わせてインストールしてください。

# コマンドの操作
## ログイン
※会員登録は[Herokuのフォームページ](https://signup.heroku.com/)で行ってください。
インストールが終わったら下記のコマンドでHerokuにログインができます。
`heroku login -i`
`-i`オプションは「コマンド内部でログインします」の意味です。このオプションがないとブラウザーが開いて、ブラウザーでログインするようになります。
ログインが終わるとHerokuアプリで作りたいディレクトリに移動して`git init`でgitを立ち上げます。
もし、既存のソースがない場合は、下記のリンクでHerokuのチュートリアルコードがcloneできます。
[Node.js](https://github.com/heroku/node-js-getting-started) [Java](https://github.com/heroku/java-getting-started) [PHP](https://github.com/heroku/php-getting-started)

## リポジトリのClone
`heroku start`でHeroku上にアプリが自動に生成されて。この場合は、アプリの名前がランダムで生成されるので後で変更するかもしくは先にアプリを作って`heroku git:clone -a [アプリ名]`でcloneできます。

## ソースコードのコミット
PHPとJavaで「hello world」を出力するコードを上げてみます。
※PHPは必ずindex.phpであげてください。
※javaはspring-bootを使用したコードです。

### PHP
```php:index.php
<?php
echo 'hello world';
```
### Java
```java:DemoApplication.java
package com.example.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@SpringBootApplication
public class DemoApplication {

	@RequestMapping("/")
	@ResponseBody
	String home() {
		return "hello world";
	}

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

```
Herokuはウェブアプリケーションなので、ただの`System.out.println()`では見れません。
Springなどのウェブフレームワークを使ったほうがいいと思います。

`git add .
git commit -am "コミットメッセージ"
git push heroku master
`
上のコマンドでHerokuにソースをPushができます。
`heroku open -a [アプリ名]`のコマンドでブラウザで自分のアプリが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/d4269366-fb19-9be7-4cb4-9926d8e95e6c.png)
Herokuフォームページの「Open app」ボタンでも確認が出来ます。

# 終わりに
Herokuに簡単にデプロイする方法についてご紹介させていただきました。どんどんサーバーレス、コードレスのやってきていると思うので、HerokuやAWS Elastic Beanstalkなどのクラウドサービスを身に着けると将来的にすごい強みになるかと思います。
ご覧いただきありがとうございます
コマンドプロンプトからpsqlで接続したpostgreSQLにSQL文を流す

### version
postgresql-server     x86_64    8.4.1
win10

cドライブ直下のtest.sqlを実行したい
psqlのメタコマンド`\i`を使って実行する

>メタコマンド
psql内で入力されたコマンドのうち、バックスラッシュで始まり、引用符で囲まれていないものは、psql自身が実行するpsqlのメタコマンドとして扱われます。 これらのコマンドを使うと、データベースを管理したりスクリプトを作成するにあたって、psqlがより便利になります。 メタコマンドは一般的にスラッシュコマンド、またはバックスラッシュコマンドと呼ばれます。
psqlコマンドは、バックスラッシュ、コマンド本体、引数の順につなげた形式になっています。 引数とコマンド本体の間と引数間は、空白文字によって分割されています。

なるほど


>
\i filename
filenameファイルから入力を読み取り、キーボードから入力された場合と同じように実行します。
注意: 読み取られた行を画面に表示させる場合は、ECHO変数をallに設定する必要があります。

実行

```
#DBにログイン
$ psql -U user_name -d db_name (-h ホスト名) 
#
$ postgres=> \i C:\test.sql
```

サンコウ

- 公式
https://www.postgresql.jp/document/8.4/html/index.html
[PostgreSQL 8.4.4文書](https://www.postgresql.jp/document/8.4/html/app-psql.html)

- [PostgreSQLコマンドチートシート]
(https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621)
>ファイルからコマンドを実行
postgres=# \i filename.sql
ファイルから入力を読み取り、実行する。
【jQuery】右クリックしたら他のサイトへ飛ばす

右クリック禁止！というサイトがありますが、もういっそ右クリック禁止の約束を破ったら帰ってもらったらいいんじゃないかと思って、右クリックしてしまったら別のサイトに飛んでもらうjQueryを作ってみました。
デモページ

デモページは以下から。右クリックすると別ページの飛ぶので注意。

##右クリックしたら他のサイトへ飛ばすのデモページ
<a href="http://webdrawer.net/sample/js/escape/index.html" target="_blank">デモページ</a>

##JavaScript

デフォルトだと、みんな大好きyahoo.jpに飛びます。optionのurlを指定し、飛ばしたいサイトのurlを入れておけばそちらのサイトに飛ぶようになります。

```javascript
(function($){
  $.fn.rightClickEscape = function(options){
    var defaults = {
      url : 'http://www.yahoo.jp/'
    };
    var setting = $.extend(defaults,options);
    
    $(this).bind('contextmenu', function() {
      location.href=　setting.url;
      return false;
    });
  };
})(jQuery);

$(function(){
  //デフォルト
  $('body').rightClickEscape();
  //指定したサイトに飛ばしたい場合
  $('body').rightClickEscape({
    url : 'http://webdrawer.net/'
  });
});
```

##転載元の記事
<a href="http://webdrawer.net/javascript/rightclickescape.html" target="_blank">サイトで右クリックしたら他のサイトへ飛ばすjQuery</a>
ネットワーク系コマンド備忘禄

http://cya.sakura.ne.jp/pc/ncmd.htm

● ネットワーク環境（ローカルホストの IPアドレスや サブネットマスク、デフォルトゲートウェイ、DNSサーバ、DHCPサーバ、WINSサーバ等の設定）を確認する。

【書式】	ipconfig /all  Win
【書式】	ifconfig -a  Unix(net-tools)
【書式】	ip addr show  Unix(iproute2)
【説明】	

● ローカルホストのホスト名を確認する。

【書式】	hostname  Win Unix
【説明】	


● DNSサーバと正常に通信しているか確認する。

【書式】	nslookup ホスト名(IPアドレス)  Win Unix
【説明】	応答が返ったか確認する。


● IPアドレスからホスト名を割り出す。
● ホスト名からIPアドレスを割り出す。
● ホスト名(IPアドレス)からユーザアカウント名を割り出す。

【書式】	nbtstat -a ホスト名(IPアドレス)  Win
【説明】	

● ping を繰り返し実行する。

【書式】	ping -t ホスト名(IPアドレス)
【説明】	[CTRL+[C]で処理を止めるまで実行する。

【書式】	
ping -n 回数 ホスト名(IPアドレス)
【説明】	回数分、処理を実行する。

● 指定の宛先までに存在したルータの一覧表示、および、そのルータへの通信品質(応答往復時間(RTT)とパケット喪失率)を表示。

【書式】	pathping ホスト名(IPアドレス)  Win Unix

【説明】	
各ルータに ICMPのEchoパケットを、0.25秒間隔で100パケット送信、その結果を表示している。
送信間隔やパケット数はオプションで変更できる。
pingや tracertの機能を拡張したようなコマンド。

● ネットワークのMTU(一度に送信可能なパケットサイズ)を調べる。

【書式】	ping -f -l 1472 -n 1 ホスト名(IPアドレス)
ping -f -l 1473 -n 1 ホスト名(IPアドレス)

【説明】	
-fオプションで、IPフラグメントを禁止。
-lオプションでデータサイズを指定。
1472バイトで応答があり、1473バイトでエラー(Packet needs to be fragmented but DF set.) が返れば、このネットワークのMTUは、1472バイト(データ・サイズ)＋8バイト(ICMPヘッダ)＋20バイト(IPヘッダ)=1500バイトである。

● ドメインのメールサーバ情報を確認する。

【書式】	nslookup -type=mx ドメイン名  Win Unix
【書式】	nslookup
> set type=MX
> ドメイン名
【説明】	

● 使用中のIPアドレスを調べる。

【書式】	for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.1.%i && arp -a 192.168.1.%i >> ip.txt
【説明】	電源が入っているマシンを検出して一覧を作成する。

● 使用中のファイルを調べる。

【書式】	openfiles /local on  Win
【説明】	maintain objects listを有効にする(再起動が必要)。

【書式】	
openfiles /query /v  Win
【説明】	オープンされているファイル一覧が表示される。

【書式】	
openfiles /query /v /s ホスト名  Win
【説明】	指定ホストのオープンされているファイル一覧が表示される。

【書式】	
openfiles /local off  Win
【説明】	maintain objects listを無効にする(再起動が必要)。

● ネットワークの経路を調べる(経路上のルータのルーティング設定が正しいかどうかを確認する)。

【書式】	tracert IPアドレス(ホスト名)  Win
【書式】	traceroute IPアドレス(ホスト名)  Unix
【説明】	目的のホストまでに通過したルータと応答時間を表示する。

● ルーティングテーブルを調べる。

【書式】	route print  Win
【書式】	route  Unix(net-tools)
【書式】	netstat -r  Win Unix(net-tools)
【書式】	ip route  Unix(iproute2)
【説明】	

● 同一ドメインのホスト名を一覧する。

【書式】	net view  Win
【説明】	

● ネットワーク経由で接続しているホストがあるか調べる。

【書式】	net session  Win
【説明】	接続しているホストがあれば，コンピュータ名、ユーザー名、開いているファイル、アイドル時間が一覧表示される。

● 指定した端末へメッセージを送信する。

【書式】	msg ユーザー名(セッション名/セッションID) メッセージ文  Win
【説明】	

● リッスンしているポート番号とプロセス(PID)を一覧する。

【書式】	netstat -oan  Win
【説明】	Local Addressは、ローカル側のIPアドレスとポート番号。
Foreign Addressは、通信相手のIPアドレスとポート番号。
PID(プロセスID)からプログラム名を取得するには、tasklistコマンドを使う。

● 実行中のプログラム名とプロセス(PID)、および、サービス名を一覧する。

【書式】	tasklist /svc  Win
【書式】	ps  Unix
【説明】	netstat -an 等から検出するPIDからプログラム名を割り出すときに使う。

● 過去通信していたホストのIPアドレスとMACアドレスを一覧する。

【書式】	arp -a  Win Unix(net-tools)
【説明】	ARPキャッシュの寿命はデフォルトで10分。
IPアドレスからホスト名を割り出すには、「nbtstat -a IPアドレス」。

● ホストのMACアドレスを確認する。

【書式】	ping ホスト名(IPアドレス)
arp -a ホスト名(IPアドレス)  Win Unix(net-tools)
【説明】	pingでホストと通信を行い、arpで確認する。

● NICのMACアドレスを確認する。

【書式】	getmac /v  Win
【書式】	ifconfig  Unix
【説明】
SSD換装で頭を抱えた話（MBRとGPT）

# はじめに

自宅のPCの起動＆処理がとても重くSSD換装を決意

HDDの時は起動までに2分半かかっていたので、1分ぐらいになるといいなぁと期待

### 用意したもの
* 自宅のPC（HP 15-bw002AU ストレージ：500GB HDD）
* SATA 変換アダプター
* Transcend SSD 2.5インチ 512GB
* ドライバー
* EaseUS Todo Backup Free 11.5 (クローンコピー用)
* TxBENCH 0.96 beta (SSD内のデータ削除に使用)
* ~~あきらめない心~~

# SSD換装してよかったこと
SSD換装を検討している人がいれば、
「こんなメリットがあるんだー」
ぐらいの参考にしていただければ

### 処理がとにかく速くなった

PC軌道からホーム画面が表示されるまでの時間
換装前（HDD）：２分３０秒
乾燥後（SSD）：３０秒
まさかの1/5倍！

CrystalDiskMarkとやらで測ってみたけど段違い
換装してよかった…

換装前
![before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/6aae5dc5-028d-8907-1f54-ca1fd67bdd88.jpeg)

換装後
![after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/089d3e36-07e5-3160-b8a2-93b4dfbabee5.jpeg)

### 起動音がうるさくない

HDDの時は、起動するだけで「ウィーーン！！」ってとにかくうるさかった
今は何も音がなく静かです

### PCに詳しくなった（気がする）

換装し終わったときには、HDDやSSDの知識以外にもバックアップの取り方など知ることができた

# 作業開始！
PC改造は初めて
とりあえず似ているPCの換装方法を調べた

私は[こちら][1]を参考にしました。

SSDにクローンコピー，稼働チェック，PC解体，HDDとSSDの取り替えが問題なく完了
クローンのコピーには約2時間半かかった

ここまでは順調でした…

## boot device not found
ブートドライブがないよーってエラー
SSDはちゃんと刺さっているのに…と心が折れてしまった。

折れた心を修復しつつ、色々調べてやってみたこと

* クローンコピーのやり直し SSD削除の仕方は[こちら][2]
* BIOSメニュー（起動後F12）でboot,hard driveの優先順位を変える

どちらも微動だにしない…
とりあえず前のHDDに戻して数日が経った…
いくつか調査したところ、MBRとGPTという単語が目に入った

## MBRとGPTってなに？
どちらもWindowsのパーティション方式のこと

### MBR(マスターブートレコード)
古くからあるパーティション形式

* パーティションが最大4個まで
* Windows XP 以前のOSでも使用可能
* HDDの容量は2TBまで

### GPT(GUIDパーティションテーブル)
新しいパーティション形式

* パーティションが最大128個まで
* Windows Vista以降でしか使用できない
* 64bit環境が必要
* HHDの容量は8.5ZBまで

特にパーティション形式を気にしていなかったため、MBRになっていた

MBRにするためには、設定を少し変える必要があるらしい

今回その設定方法がわからなかったため、GPTで作成しなおすことにした

## GPTで再接続
TxBENCHを使用してSSDを削除する

次のディスクの初期化（コンピュータの管理-ディスクの管理）するときにラジオボタンをGPT変更
![ssd6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/1bcd1fc6-c380-dccb-eee7-5085c1304d25.png)

EaseUSを使って再度クローンコピーを行なう
![ssd7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4f7d4bc4-8756-58ec-538a-a90731559c97.png)

再度2時間半ほど待ち、外付け状態のままでSSDが認識されているのを確認

換装し、いざ電源を入れて…

**無事電源が付きました！**

# おわりに
冒頭でも話した通り、処理がとても速くなりました
SSDに換装したことによって、快適にPCを使用しています！

ただよくよく見てみるとHDD（MBR）からSSD（GPT）なので大丈夫なのかなぁと思っています…

また、時間を見つけてその辺の仕組みを調査してみます。

「こんな風にしたほうがいいよ」などご意見を書いていただけたら光栄です。(/ω・＼)

[1]:https://little-beans.net/review/hp15-bw000-02/
[2]:https://marvelsoflife.com/2017/06/06/post-5534/
[MacOS] アクティビティモニタの表示の並べ替えUIがおかしいときの対処法

## 問題
macOS のアクティビティモニタアプリで、表示の並べ替えを行うUI (下記添付参照) が真っ黒になってしまうことがある。

※macOS Catalina v10.15.1 で確認


不具合時のイメージ

<img width="1004" alt="スクリーンショット 2019-11-22 8.36.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17330/437e2dac-5fd3-f69a-d69b-b3f3708d5bfd.png">

## 対処手順
- `/Users/{ユーザー名}/Library/Preferences/com.apple.ActivityMonitor.plist` を削除する
- アクティビティモニタを再起動する

これでアクティビティモニタの設定がリセットされて、UIが正しく表示される。

<img width="1004" alt="スクリーンショット 2019-11-22 8.36.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17330/17bf25c3-5ddd-61ad-2e51-113c47af4bf8.png">
ANDROID STUDIO KOTLIN ERROR : Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' optio

ENVIRONMENT
　-　AndroidStudio3.5.2　アンドロイドスタジオ
　-　KOTLIN　コトリン
　-　MinRequirementAPI lolipop22 /TestMachine Nexus6

ERROR Contents　エラー内容

```
: Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option
```

新規にプロジェクトを構成し適当なテンプレートを選択してビルドすると上記エラーが出る場合があります。以下２ステップでエラーを解消できます。

#STEP１　ターゲットJVMを1.8に変更します。

「ファイル」「設定」「Kotlinコンパイラー」を選択し、ターゲットJVMバージョンを1.6から1.8へ変更します。

![0132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/3c4ad782-21ae-397b-dde2-540dde9cfc58.png)

ターゲットJVMバージョンを1.6から1.8へ変更します。

#STEP２　Gradleスクリプトのbuild.gradle(モジュール:app)を変更します。

build.gradle(モジュール:app)を変更します。

![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/6c6d1338-6130-0b34-bb67-bafe77642c69.png)

付与するコードは以下です。

```
  kotlinOptions {
    jvmTarget = '1.8'
  }
```
全体コードは以下です。

```
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.."
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.1.0'
    implementation 'androidx.navigation:navigation-ui:2.1.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
    implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
    implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

```

#ビルドが通ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/2d9276d8-6c6d-60bd-7965-e69f08072995.png)


では
【AWS】S3で独自ドメインでhttpsホスティング

## はじめに

S3を使うと手軽に静的ウェブサイトホスティングすることができ、
Route53でCNAMEを指定すれば[独自ドメインでホスティング](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html)することができます。
ただhttps化することはできずChromeでは「保護されていない通信」扱いされてしまいます。
そこでCloudFrontを使ってS3で独自ドメインhttpsホスティングさせたときのメモです。

## 前提

独自ドメイン取得済みでACMなどの設定済

## S3バケット作成

1. 任意の名称でS3バケットを作成する

## CloudFront Distributions 作成

1. [CloudFront](https://console.aws.amazon.com/cloudfront/home?region=ap-northeast-1)へアクセス
2. 「Create Distributions」-Web:「Get Started」
3. 下記設定項目入力  
![cloudfront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485398/099a2f2d-1afd-6d54-23f3-e2983b818c27.png)

4. S3許可用のOrigin Access Identity追加
![origin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485398/147c4361-51e9-d857-c716-5f08aaf49523.png)

5. Distributionsの「Origins and Origin Groups」よりOriginsを編集
![origin - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485398/55489fc9-7096-d14e-2743-86e95099bda1.png)

## S3バケットにCloudFrontからのみ許可設定

1.  バケット設定の「アクセス権限」-「バケットポリシー」に下記を設定しCloudFrontからのアクセスを許可する  
(バケット名とOrigin Access Identity IDは適宜)  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
        }
    ]
}
```

## Route 53へCNAMEを登録する  
下記CloudFrontのDomain NameをRoute 53へCNAMEとして追加する

![r53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485398/dea268f5-2eae-ea0f-9d9a-0570417ed926.png)

## 補足

CloudFrontは高速化のためにコンテンツをキャッシュしているためS3のコンテンツを更新後
速やかに反映させたい場合は[Amazon CloudFrontのキャッシュ削除(Invalidation)](https://dev.classmethod.jp/server-side/aws-amazon-cloudfront-deleting-cache-by-invalidation/)を実行する必要がある。
OutSystemsのTableRecordsで、行のデータによって特定列の見栄えを変える

TableRecordsで、Source Record Listに紐づけたデータの値によって色を付ける方法です。
注意すべきポイントをユーザに分かりやすくするということですね。
以下の方法では、CSSで実現するため、別のスタイルを当てる(フォントサイズを大きくするなど)ことも可能。

# サンプル
Forgeコンポーネント：https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7064
ConditionalStyling Screenを参照してください。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.9)

Traditional Web。

# 実現すること
組み込みのScreen Templateを使って作った以下の画面を対象に。
PriorityはStatic EntityでLowとHighの値があります。この値がHighの行のRequest Name列の背景色を赤にしてみます。
![qConditionalStyling1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1a539b08-8be9-250e-8071-55f01c91116d.png)

# 設定
TableRecordsは、配置すると(HTMLのTableタグのように)行に相当するWidgetとCellに相当するWidgetがあります。
今回は、特定列だけ色を付けたいので、色を付けるRequest Name列のCellに注目。
![qConditionalStyling3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/97617f8d-3d8d-0650-cf59-cb70bc0a13c9.png)

Cellには、Extended Propertiesというプロパティがあります。このプロパティはHTMLに出力されるときの属性を指定できるものです。また、値の部分にはOutSystemsの式が書けます。

そこで、style属性を以下の値で書きました。
`If(Table.List.Current.Sample_Request.Priority = Entities.Sample_Priority.High, "background-color: red", "")`

TableRecordsのSource Record List(Table.List)の対象行(.Current)のPriorityがHighであれば、背景色赤を指定しています。

同じ設定を複数の場所で使う場合は、Style Sheet Editor(Servive Studioの上の方にあるCSSアイコンで開く)で、テーマか画面にclassを書いておき、Extended Propertiesではstyleの代わりにclassを設定するといいと思います。

# 動作イメージ
![qConditionalStyling2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1fa0c6f7-722a-478c-b761-c65e3adc0322.png)
Vmware のリソースがdmsファイルで送られてきたのでPythonとcatで見てみた

サーバの仮想環境をvmawareで運用しているお客さんからあらたなサーバの更新に当たって、今のリソースがdmsファイルで送られてきた。

dmsファイル？？？？

参照の仕方がわかればみてくださいとのことで、なんじゃこりゃ？？
となった。（医療関係のシステム営業職）

そうだ。

あれだ。

趣味で長らく続けてるPythonの出番だ。


というわけで、ググりながらこんなコードを書いてみた。

```python:vmread.py

#!/usr/bin/python
# coding: UTF-8

f = open('vmware01c.dms')
#vmware01c.dmsというファイルが送られてきたので、このスクリプトと同じディレクトリにそのファイルを保存。

lines2 = f.readlines() 
f.close()

for line in lines2:
    print(line, end=" ")
print
```

そうするとこんな感じで出力。

```
MacBook-Air% python3 vmread.py
名前,状態,ステータス,プロビジョニングした領域,使用領域,ホスト CPU,ホスト メモリ,ゲスト OS,メモリ サイズ (MB),CPU
 Acronis Backup VA ESXi host 3,パワーオン,正常,10.16  GB,10.16  GB,99,4065,Other 3.x or later Linux (64-bit),4096,2
      
```

なんとなくわかる。でもわかりづら。。。

次にやったのは、出力したものをコピペでCSVに展開。

ちゃんと見れた。

でも、なんか違和感がある。うーん。

そうだ。ターミナルからcatで出せばいいのだ。そしてそれをcsvで保存だ。

```
MacBook-Air% cat vmware01c.dms >vmware01c.csv
```
そうすると、一発でCSVに変換できて閲覧できました。うれしかった。

参照させていただいた記事
 <a href="https://yukun.info/python-file/">Yukun's Blog</a>

<a href="https://qiita.com/matyahiko2831/items/b26bba961f2178bbce57">【Linux】catコマンドとリダイレクトを使いこなして作業効率アップ！</a>
julia1.2 mapよりforが高速な件 は間違っていた

実行環境 julia1.2/MacOS

forとmapの性能差について、聞いてはいたが、どっちが速いのか忘れたので確認してみた。

最初、「mapよりforが高速な件」として書いたのだけれど、その後、間違っていることがわかったので、

以下、間違った記事も残し、最後にやりなおしたコードを含めた。


まず
```julia
xm=collect(1:1000000)
ym=collect(1:1000000)

@show :map
GC.gc()
@time map((x,y)->[x,y],xm,ym)


@show :for
xym=[]
GC.gc()
@time for i in 1:length(xm) ; append!(xym,[xm[i],ym[i]]) end

```

追記
juliaでは、map((x,y)->[x,y],xs,ys)とするとxsとysの対応する要素のリストが作られる。
forでこれをやろうと思っても、Juliaでは簡単に書けない。つまり、疑似コードで書くと
for x in xs as y in xs ... end
みたいには書けない。
そこで、index ixを1からlength(xs)まで走らせて対応する[xs[ix],ys[ix]]を作ることになり
これだとなんとなく遅くなるのではと思い、上記のテストをしてみたという話。

さらに

'''julia
function elemf(x)
  length(x)
end

function loopm(ls::Array)
  map((x)->elemf(x), ls)
end

function loopf(ls::Array)
  a = []
  for x in ls
    push!(a, elemf(x))
  end
  a
end

ddk=map((x)->[x], collect(1:1000))
@show :size1000
GC.gc()
@show :loopm; @time loopm(ddk)
@show :loopf; @time loopf(ddk)

ddm=map((x)->[x], collect(1:1000000))
@show :size1000000
GC.gc()
@show :loopm; @time loopm(ddm)
@show :loopf; @time loopf(ddm)

ddm=map((x)->[x], collect(1:10000000))
@show :size10000000
GC.gc()
@show :loopm; @time loopm(ddm)
@show :loopf; @time loopf(ddm)
```

ループの中で重い処理をすれば、mapとforの違いは無視できるのかと思い、
こういうことをしてみた。

```julia
:size1000 = :size1000
:loopm = :loopm
  0.025073 seconds (83.41 k allocations: 4.265 MiB)
:loopf = :loopf
  0.014806 seconds (8.37 k allocations: 405.388 KiB)
:size1000000 = :size1000000
:loopm = :loopm
  0.007201 seconds (7 allocations: 7.630 MiB)
:loopf = :loopf
  0.021993 seconds (24 allocations: 9.001 MiB)
:size10000000 = :size10000000
:loopm = :loopm
  0.086593 seconds (7 allocations: 76.294 MiB)
:loopf = :loopf
  0.260839 seconds (28 allocations: 129.001 MiB)
```

となった。
mapのほうはサイズがかわっても処理時間はあまりかわらない。
mapのほうが高速ということか。

先の例でも1000個を1000000個にしたらmapのほうが速かった。


```julia
xm=collect(1:1000000)
ym=collect(1:1000000)

@show :map
GC.gc()
@time map((x,y)->[x,y],xm,ym)


@show :for
xym=[]
GC.gc()
@time for i in 1:length(xm) ; append!(xym,[xm[i],ym[i]]) end

```

を実行した結果は以下のとおり。

```julia
:map = :map
  0.273464 seconds (1.07 M allocations: 102.574 MiB, 61.44% gc time)
:for = :for
  0.530627 seconds (8.00 M allocations: 230.577 MiB, 41.02% gc time)
```
JSON.parseからinstanceを作りたいとき

# これ何

API Clientを作っていた時にresponseを抽象化したclassを作りたかった。その作業メモ

# 問題
例えば、モンスターを扱うAPIがあったとする。
API Clientは返って来たデータをMonster classで扱いたいはずだ。

```ruby
class Monster
  def initialize(name:, power:, hp:)
    @name = name; @power = power; @hp = hp
  end
end
```

そして、次のようなApiClientを利用しているとする。
すると、Monster classを利用すると、ArgumentErrorになってしまう。

```ruby
Class ApiClient
  def initialize
    @conn = Faraday.new(:url => 'url')
    @base = 'api/v1/'
    @token = ENV['TOKEN']
  end

  def get
    @conn.post "#{@base}monster", {token: @token}.to_json
    monsters = JSON.parse(response.body)
    monsters.each do |monster|
      Monster.new(monster)
      # => ArgumentError: wrong number of arguments (given 1, expected 0)
    end
  end
end
```

# 原因
なぜArgumentErrorを起こすのだろうか？
理由は簡単で、initializeしようとしているargumentを見るとわかる。
次のようなstring hashになっているため、keyward引数として渡すことができないのである。

```json
{
  "name": "gerugeru",
  "power": 100,
  "hp": 70
}
```

# 解決策
どうすれば良いか、原因は先ほど述べたようにstring hashになっているため、引数に出来なのである。
返ってきた値をJSON.parseする時にsymbol hashにすれば、keyword引数を渡すことができ、instanceを作成することができる。

JSON.parseの引数に、 `symbolize_names: true` とすることでsymbol hashを扱うことができる

```ruby
monsters = JSON.parse(response.body, symbolize_names: true)
# => {
#  :name => "gerugeru",
#  :power => 100,
#  :hp => 70
# }
```

この結果initializerにsymbol hashを渡すことができ、めでたくレスポンスをinstanceとして作成することができた。
Ubuntu minimal-cloudimg ダウンロード

## minimal-cloudimg 

* [20.04](https://cloud-images.ubuntu.com/minimal/daily/focal/current/) : `199MB` QEMU QCOW Image (v2)
* [21.04](https://cloud-images.ubuntu.com/minimal/daily/hirsute/current/) : `248MB`

### Proxmox6 で使うには

```sh
# ダウンロード
wget "https://cloud-images.ubuntu.com/minimal/daily/focal/current/focal-minimal-cloudimg-amd64.img"

# ファイル名を変更しつつqcow2形式に変換。
qemu-img convert -O qcow2 \
 "focal-minimal-cloudimg-amd64.img" \
 "focal-minimal-cloudimg-amd64.qcow2"

# 変換前のファイルは削除
rm "focal-minimal-cloudimg-amd64.img"

# イメージサイズの拡張
qemu-img resize "focal-minimal-cloudimg-amd64.qcow2" 3G
```

```sh
# DISK容量の確認
qemu-img info focal-minimal-cloudimg-amd64.qcow2 
```

## シリアルポートの追加が必要

以下で表示が止まる。

![スクリーンショット_2019-11-22_14-03-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/1a029b42-8d0e-dca1-141a-c47e9e90ddbf.png)

画面は`serial 0`に出力されているため、シリアルポートを追加してあげればよい。[参考](https://bugs.launchpad.net/cloud-images/+bug/1785633)

`Cloud-init`が必要。

* アカウント名 / パスワード
* IPアドレス
* ssh鍵の登録

![スクリーンショット_2019-12-13_14-33-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/0a9a0c5b-d7b5-25a5-d95f-120059db9769.png)

|項目| free -m | df -h |
|:--|--:|--:|
| minimal-cloudimg | 55 | 706M |

## 一度も自動ではアップデートさせたくない場合

* 以下のようにコメントアウトする

```yml:/etc/cloud/cloud.cfg
cloud_final_modules:
#- package-update-upgrade-install
```

----

```md
# 使ってみて必要に感じた以下のファイル

## 設定ファイル

~/.profile
/etc/postfix/main.cf
/etc/aliases
/etc/systemd/timesyncd.conf

## インストールパッケージ

vim
tig
zip
nkf
w3m
lighttpd
php-cli
rsync
postfix
mutt
whiptail
cron

file
ranger
screen
bsd-mailx
logwatch

iputils-ping
net-tools
```


----

## Ubuntu 20.04

* [Ubuntu](http://www.cdimage.ubuntu.com/daily-live/current/) 2.3G
* [Xubuntu](http://www.cdimage.ubuntu.com/xubuntu/daily-live/current/) 1.5G
* [Lubuntu](http://www.cdimage.ubuntu.com/lubuntu/daily-live/current/) 1.6G
* [server](http://www.cdimage.ubuntu.com/ubuntu-server/daily-live/current/) 852M
* [mini.iso](http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/current/images/netboot/)
* [Docker Official Images](https://hub.docker.com/_/ubuntu/)
* [Ubuntu Base](http://www.cdimage.ubuntu.com/ubuntu-base/daily/current/?C=S;O=D)
    * Ubuntu Baseは、aptが利用できる最小イメージ。
    * 圧縮イメージサイズ `26M`
* BOOT直後のメモリ使用量は[極楽はぜのブログ](https://ameblo.jp/gokurakuhaze/entry-12537856770.html)さんが詳しく書かれている。

### インストールに必要な最小DISK容量

* 8GiB のディスクサイズが必要。 (lubuntu)
* 8.6GB のディスクサイズが必要。 (Xubuntu)
bpy.context.selected_objectsで選択中のオブジェクトがreturnされない場合

Blenderで、選択中のオブジェクトを返すbpy.context.selected_objectsというコマンド
実行しても返り値が空だったことがあって迷った。

アウトライナ上で、Disable object in the vieportという項目がチェック外れてるとこうなるっぽい。

Blender2.8 自分用メモ
【画像処理】不透明部分からマスク用の白黒画像を生成するスクリプト

# できること

Before
<img width="240px" alt="before" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213748/fb5020a3-fba2-086a-da40-d78320c51361.png">

After
<img width="240px" alt="after" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213748/c7b1c60d-06ed-8969-bd65-55b4ab36429e.png">

# 嬉しさ
3DCGなどのテクスチャを生成するのが楽になる

# Source
https://github.com/minato-eigenport/toys/blob/master/genmask.py

```genmask.py

import numpy as np
import os
import re

from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

# EDIT HERE
dir_path = 'C:\\Users\\minato\\Desktop\\aaa'
extention = '.png'

# CODES
mask_dir = os.path.join(dir_path, 'mask')
if not os.path.exists(mask_dir):
    os.makedirs(mask_dir)


def make_mask(filename):
    print('  make a file')
    try:
        im = Image.open(filename)
    except:
        print('failed to open an image')
        return 1
    im = im.convert('RGBA')
    image = np.asarray(im)
    height, width, ch = image.shape
    print('  height:'+str(height)+' width:'+str(width))
    newimg = Image.new('RGBA', (width, height))
    white = 0
    black = 0
    for h in range(height):
        for w in range(width):
            alpha = image[h, w][3]
            if alpha <= 100:
                newimg.putpixel((w, h), (0, 0, 0, 255))
                black += 1
            else:
                newimg.putpixel((w, h), (255, 255, 255, 255))
                white += 1
    newimg.save(os.path.join(mask_dir, filename))
    print('  white:'+str(white)+' black:'+str(black))
    print('done')
    print('')
    return 0


targets = os.listdir(dir_path)
os.chdir(dir_path)
skipped_number = 0
file_number = 0
for filename in targets:
    if re.search(extention, filename):
        file_number += 1
        print('filename:'+filename)
        skipped_number += make_mask(filename)

print('RESULTS')
print('     ALL:'+str(file_number))
print('    DONE:'+str(file_number-skipped_number))
print('    SKIP:'+str(skipped_number))

```
キャラクター作成の Volumetric Capture

仮想現実および拡張現実のゲームで人々が Volumetric Capture をどのように使用しているかを聞きたいのですが。私は過去2年間CCCCCで働いていて、それが非常に有用であることがわかりました。私がキャプチャしたキャラクターの既に装備された3Dモデルを提供し、Unityおよび3D MaxのVFXに最適です。 EF EVE Volumetric Capture ソフトウェアと2つおよび4つのKinect紺sensorsセンサーを使用しています。ソフトウェアは、これが精度を与えるカメラを自動的に較正することを可能にします。また、Unityにインポートするために、.OBJおよび.PLYスパンコールでファイルをエクスポートしています。私の質問は、このVolumetric Capture ソフトウェアよりも良いものを見つけましたか？https://ef-eve.com/volumetric-capture/

![Nauji ScreenShots 5-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537204/1c1c9b8e-01fb-a869-c807-87436335a0be.png)


作成者アプリは次のようになります。 4つのセンサーまたは2つのセンサーから完全な記録をインポートし、ボリュームビデオを編集できます。https://www.youtube.com/watch?v=u_ORwJJpcqg
HaskellでHTMLを取得する

HaskellでHTTP通信してみようかな、とふと思い立ったのでやってみました。それ以上の理由はありません。Haskellは大してできない初心者です。学びがてら。

とりあえずHTMLを取得する。

# http-conduit導入

とりあえず、HTTP通信に必要なパッケージを入れなくちゃ、というところでhttp-conduitというのが良さそうなので導入。

そもそもHaskellでパッケージ入れるの初めてなんですが、cabalという便利なやつがいるんですね。

```bash
cabal update
cabal install http-conduit
```

基本いつもパッケージインストーラとか使うとき「updateとかせんでも行けるやろ～」とか言ってるんですが、今回はupdateしないと駄目でした。ちゃんとupdateはしましょう。案外updateに時間がかかりました。って言っても数分とかです。
ついでに本体のインストールにも時間がかかりました。依存してるパッケージが結構な量。10分は掛かった(回線が貧弱だったか？)。

# HTML取得
いざ本番。

今回使うのはgetResponseBody。

```hs
*Main> :t getResponseBody
getResponseBody :: Response a -> a
```

`Response`?ってなっていた。どうやら取得できるデータがすべて入ってるものらしい。これを取得するためには`httpLBS`を使うと良いらしい。

```hs
*Main> :t httpLBS
httpLBS
  :: Control.Monad.IO.Class.MonadIO m =>
     Request -> m (Response Data.ByteString.Lazy.Internal.ByteString)
```

`Request`を取ればいいのか？という感じ。`String->Request`ができればすべて解決ですね。

```hs
*Main> :t parseRequest
parseRequest
  :: Control.Monad.Catch.MonadThrow m => String -> m Request
*Main> :t parseRequest_
parseRequest_ :: String -> Request
```

今回は後者の`parseRequest_`が良さそう。

というところで`String->getResponseBody`までの流れはこんな感じ。

```
String --[parseRequest_]--> Request --[httpLBS]--> Response --[getResponseBody]--> BODY
```


## 完成形

```hs:example.hs
import Network.HTTP.Simple

main :: IO()
main = do
    input <- getLine
    res <- httpLBS (parseRequest_ input)
    print (getResponseBody res)
```
入力でURLを入力してHTMLを出力するだけの。

## Test

```
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> :l example.hs
Ok, one module loaded.
Prelude Main> main
https://example.com/
"<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n"
```

無事取得した。
Cloud Functions

```bash:bash
mkdir firebase
cd firebase
npm install -g firebase-tools
firebase init
firebase login
```
- ロケーションを設定
<img width="743" alt="fbロケーション.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500676/2e0c2ef0-3552-83fe-9052-e83782e04064.png">


```javascript:index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const axios = require('axios');


admin.initializeApp();

const db = admin.firestore();

exports.db = functions.https.onRequest(async (request, response) => {
  const snapshot = await db.collection('users').get();
  const items = snapshot.docs.map(doc => doc.data());
  console.log(items);
  response.send(JSON.stringify(items));
});

exports.query = functions.https.onRequest((request, response) => {
  console.log('query', request.query);
  response.send(JSON.stringify(request.query));
});

exports.html = functions.https.onRequest((request, response) => {
  console.log('query', request.query);
  response.status(200).send(
  `<html>
    <body>
      <div style='color: red'>${JSON.stringify(request.query)}</div>
    </body>
  </html>`
  );
});

exports.schedule = functions.pubsub.schedule('every 1 minutes').onRun((context) => {
  console.log('every 1 minutes');
  return null;
});

exports.axios = functions.https.onRequest(async (request, response) => {
  const { data } = await axios.get('https://xxx.com/query?id=1');
  console.log(data);
  response.send(JSON.stringify(data));
});

```

```bash:bash
firebase deploy --only functions:query,functions:html
```
MySQLが起動しないエラー

## 発生した問題

MySQLクライアントのSequel Proが起動しなくなった。

```
mysql.server start                                                                                                                                                             
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/***.pid).
```

## 環境

- macOS Catalina 10.15.1
- MySQL 5.7.23

## 解決法

mysqlの動いているプロセスを探して

```
ps aux | grep mysql
```

対象のプロセスをkillする

```
sudo kill -9 [対象のmysqlのPID]
```

## やったこと

### MySQLの再起動

そもそも起動ができないので意味がなかった

```
sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/***.local.pid).
```

### 権限の変更

所有権を自分にしてみたが、特に意味がなかった

```
sudo chown -R [権限を渡したいユーザ] /usr/local/var/mysql
```

### エラーログのチェック

「mysqldの別プロセスが動いていないか確認してね」 とのこと。これがあたりっぽい。

```
tail -f /usr/local/var/mysql/***.local.err
[Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
```

エラー内容が違う場合は他を当たったほうがいいかもしれません。

- [MySQLがERROR! The server quit without updating PID fileで起動できないときにやったこと](https://qiita.com/PoohSunny/items/4df890dde4879c2cd29b)

## 参考記事

- [mysqlが起動できなくなった場合の話](https://kaiueo.tumblr.com/post/64245601/mysql%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E8%A9%B1)
- [MySQLが起動しないエラー（The server quit without updating PID file）](https://easyramble.com/mysql-server-pid-file-error.html)
【AndroidStudio】Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

以下の記事の続きです。（自分的に）

- [【AndroidStudio】ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.](https://qiita.com/yamahei/items/499ef3d39b275b108ffe)

AndroidStudioでエミュレータを使ってAndroidアプリをローカル起動しようとした（Run 'app'）ところ、以下のエラー。

```
Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT
```

環境変数がない。
確認したらない（当たり前か

```
C:\Users\ORE>set ANDROID_SDK_ROOT
環境変数 ANDROID_SDK_ROOT が定義されていません
```

AndroidStudio入れる前にXamarinでAndroidアプリ作ってたのがいけなかったのか。。？
ググったら以下の記事を発見。

- [PANIC：AVDシステムパスが見つかりません。 ANDROID_SDK_ROOTを定義してください](https://codeday.me/jp/qa/20190301/343486.html)

AVDマネージャ上に、アプリのAPIバージョン(27)を実行できる仮想デバイスがなかったので作成。

作った仮想デバイスを起動してからアプリ起動、成功。
（上の記事の仮想デバイスの削除はしなくてもよかった）
なんだ単なるイージーミスか。

環境変数はなくてもよかったのね。
firebase.initializeApp() に必要な config 情報に appId がいつの間にか追加されていた

## 経緯

`firebase.initializeApp()` に必要な config の確認を行おうとしたところ、
確認の仕方が以前と少し変わっていました。  

結果としては「[ウェブアプリ用の設定スニペットを入手する](https://support.google.com/firebase/answer/7015592?hl=ja)」のドキュメントに沿う形で、
「アプリを追加」という項目から「ウェブアプリにfirebaseを追加」という手順を進めると config 情報が確認できたのですが、もう既に firebase で ウェブアプリを公開していたので「アプリを追加」という項目に戸惑ってしまいました。

また表示された config 情報には `appId` という項目が増えていました。
現在 `appId` 無しの config で `firebase.initializeApp()` して問題なく動いているので、
そこもまた謎なので調べてみました。

```js:FirebaseConfig
const config = {
  apiKey: "xxxxxxxxxxxxxx",
  authDomain: "xxxxx.firebaseapp.com",
  databaseURL: "https://xxxxx.firebaseio.com",
  projectId: "xxxxxxxxxxxx",
  storageBucket: "xxxxxx.appspot.com",
  messagingSenderId: "xxxxxxxxxxxxx",
  // appId: xxxxxxxxxxxxxxxxxx（新しく増えていた項目）
};
```

## 取り敢えず分かった事

* 以前ウェブアプリの config の中には `appId` は無かった（後から追加されたもの）
* `appId` は無くても動くが、firebase 関連のサービスの中には `appId` が必須なものがある
* 現在 firebase でウェブアプリを公開する手順として「アプリの登録」という手順を踏む。以前だとその様な手順が無かったために、既に deploy 済みであるウェブアプリは「アプリの登録」がなされていないステータスになってる（アプリの追加（登録）を行う事で appId を含む config 情報を確認できる）

## 参考情報について

firebase の公式ドキュメントを漁りましたが、いつ頃 `appId` が config 情報に含まれる様になったかは記載を見つけられませんでした。firebase を使ったウェブサイトの hosting 関連記事について、幾つかの古い記事、新しい記事の比較に基づいた結論です。

[stack_overflow](https://stackoverflow.com/questions/58680378/firebase-init-js-does-not-contain-appid) でも似たような質問が一つ見受けられました。
Vueメモ

#Vue + typescript

## プロジェクト作成

vue-cli
`vue create MyProject`


### Vue + typescript

<img width="572" alt="スクリーンショット 2020-08-12 15.14.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/09e76987-3c85-ee74-7eb7-35c5818e2aa0.png">

<img width="575" alt="スクリーンショット 2020-08-12 15.37.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/7ddbdf39-527d-4b17-27a9-75bb3eaa6e40.png">



~~~vue
<template>
    <div> 
    </div>
</template>

<script lang="ts">
//vue-propaty-decoratorをインポート
import { Vue, Component, Prop, Emit } from "vue-property-decorator";

//コンポーネント　基本的になくてもこれを書く。コンポーネントであることを示す。
@Component({
    components:{
    //コンポーネントを設定
    },
})

export default class *クラス名* extends Vue {
    //Propの設定
    @Prop({default: ""})
    user_name!: string;
}
</script>

<style lang="scss" scoped>

</style>
~~~

###vue-property-decorator
VueをTypeScript特有のクラス構文で書くためのツール

###text box
~~~
<input type="text" placeholder="入力してください v-model="保持しておく変数" />
//maxlength='' で文字数制限
~~~

# 画像アップロード

基本的にはAPIで送信するためにBase64にエンコードしてjsonに入れて飛ばすか、htmlのmultipart/form-dataを使って画像データをバックエンドに飛ばす。
下は、FileReader（）を使用して画像を読み込み、Base64にEncodeしたものをuploadImageUrlにいれる。

~~~sample.vue
<template>
<div class="input-image-size">
    <img v-if="uploadImageUrl" :src="uploadImageUrl" />
        <v-file-input
            v-model="input_image"
            accept="image/*"
            show-size
            label="upload image"
            prepend-icon="mdi-image"
            @change="onImagePicked"
         ></v-file-input>
</div>
</template>

<script>
export default {

  data: function() {
    return {
      input_image: null,
      uploadImageUrl: "",
    };
  },

  components: {},

  methods: {
    //image
    onImagePicked(file) {
      if (file !== undefined && file !== null) {
        if (file.name.lastIndexOf(".") <= 0) {
          return;
        }
        const fr = new FileReader();
        fr.readAsDataURL(file);
        fr.addEventListener("load", () => {
          this.uploadImageUrl = fr.result;
        });
      } else {
        this.uploadImageUrl = "";
      }
    },
}
</script>

~~~


#anime.js
使い方

~~~js
<template>
  <div class="test">
    sample
  </div>
</template>
import anime from "animejs";

mounted(){
  anime({
    targets: '.test',
    left: '240px',
    backgroundColor: '#FFF',
    borderRadius: ['0%', '50%'],
    easing: 'easeInOutQuad'
  });
}
~~~

targetsにアニメーションの指定したいものにclassをつける。
【AndroidStudio】ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.

Windows10にAndroidStudio(3.5.2)をインストール。
gitからプロジェクトをclone。
Make Projectしたら以下のエラー。

```bat
ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.
   platforms;android-27 Android SDK Platform 27
   build-tools;28.0.3 Android SDK Build-Tools 28.0.3
To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

Using Android SDK: C:\Users\ORE\AppData\Local\Android\Sdk
Install missing SDK package(s)
```

検索したらQiitaの記事を見つけた。

- [Androidのlicencesのエラーを解決](https://qiita.com/joji/items/931d5f4e4ee853d7458c)

```shell
cd ~/Library/Android/sdk/tools/bin
./sdkmanager --licenses
```

が、そもそもパスが違う（Windowsだから）。。

sdkmanagerを探して実行

```bat
C:\Users\ORE\AppData\Local\Android\Sdk\tools\bin>"C:\Program Files (x86)\Android\android-sdk\tools\bin\sdkmanager.bat" --licenses

ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
```

javaがない。。
そういえばjava単体では入れてない。

Android Studio入れた時に一緒に入ったjavaのパスで実行

```
C:\Users\ORE\AppData\Local\Android\Sdk\tools\bin>cd C:\Program Files\Android\Android Studio\jre\bin
C:\Program Files\Android\Android Studio\jre\bin>"C:\Program Files (x86)\Android\android-sdk\tools\bin\sdkmanager.bat" --licenses
（いい感じの出力、略）
```

正常に行ったっぽいのにAndroid StudioでMake Projectしたらエラー消えず。
よく見たらsdkmanagerが違うパスにもあった。

自分のホームの下、つまりは先の記事のWindows版ということか。

```
C:\Users\ORE\AppData\Local\Android\Sdk\tools\bin>cd "C:\Program Files\Android\Android Studio\jre\bin"
C:\Program Files\Android\Android Studio\jre\bin>C:\Users\ORE\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --licenses
（いい感じの出力、略）
```

できた。
Make Projectも通って一件落着。
Vue Routerについて

Vue Routerとはシングルページアプリケーションを構築するためのVue.jsの拡張ライブラリ
コンポーネントとURLを紐付けてコンテンツを生成する

router.jsでやる事

```js
import Vue from 'vue'
import VueRouter from 'vue-router'

import コンポーネント名 from 'コンポーネントファイル先指定'

Vue.use(VueRouter) //プラグインとして登録する

//VueRouetrインスタンスを生成する
const router = new VueRouter({
  routes: [
   {path: '/',
    name: 'home',
    component: コンポーネント名 }
   ]
})
```
Automation Anywhere Enterprise v11を使う際の小ワザまとめ

こちらのページにまとめていきます。

## Excelシートを新規作成したい。
-> 標準ではそういったコマンドが無いので、テンプレートか、まっさらなExcelシートを用意しておき、それをCopy Filesコマンドでコピーする。

## Workbenchで、コマンドのツリーを開いた際に楽に閉じたい。
-> ツリーの下位のコマンドを選択した状態で、キーボードのBackspace->Enterと押していくと閉じれて便利。

## Clientで、Botをダブルクリックすると実行されてしまってストレスたまる
-> Clientの上のメニューの、ツール->オプション->詳細設定の画面にある、「タスクをダブルクリックして編集」にチェックを入れれば解決。

## 設定したトリガをまとめてOffにしたい。
-> Clientの左側のメニューにある、「管理」->「トリガー」でまとめてOn/Off可能です。

## ホットキーが設定されたBotがどれか把握したい。
-> AAE v11で、どのBotにホットキーを設定したか忘れるときがありますが、
Automation Anywhere FilesにあるAA.Trigger.xmlにホットキーの設定も格納されるので、このファイルを見ることで確認できます。

## Object CloningやKeyStrokes、Delayコマンドの設定値を一括で変更したい。
-> 下記記事を参照。
[実はあった！Object Cloningコマンド、ウィンドウ名等の一括編集について（Automation Anywhere Enterprise v11） - Qiita](https://qiita.com/zamaezaaa/items/f2a71c6fcb60c2d5eb78)

## Object CloningやKeyStrokes、その他コマンドのWindow名を一括で変更したい。
-> 下記記事を参照。
[実はあった！Object Cloningコマンド、ウィンドウ名等の一括編集について（Automation Anywhere Enterprise v11） - Qiita](https://qiita.com/zamaezaaa/items/f2a71c6fcb60c2d5eb78)

## Webページが全部ロードし終わってから次の何かを実行したい。
-> Object CloningでWebページの最下部にある物（Object)を何でもいいのでキャプチャーし、Get Propertyアクションで適当な変数に値を放り込むようにしておく。
そうすると、ページ最下部にある何かが認識できるようになってから以降の処理が実行される。それでも足りない場合はわずかにDelayを入れることもあり。
でも、ただ単にDelayを適当な秒数入れるよりずっと安定稼働するし最短の待ち時間になる。

## アプリケーションの画面遷移を認識させたい
-> 上記と同様。Windowタイトルを認識するようなコマンドもありますが、それでもうまく行かない場合はObject Cloningで画面遷移後にあるはずのボタンやラベル等をキャプチャーして、Get Propertyアクションを実行するように設定しておきます。
所定の秒数（デフォルトは15秒）の間に見つからなければエラーを吐くので、必要に応じてError Handlingコマンドで対処します。

## Automation Anywhere Enterprise ClientのBot管理画面（My Task)で、Taskファイルをダブルクリックしたら実行されてしまうのが面倒
-> Clientのメニューの、「ツール」->「オプション」-> 「詳細設定」にある、以下の設定を変更すると、
ダブルクリックしたら編集画面が開くように変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/a1ff92ac-99cb-d677-940d-f5e56b5d3a40.png)
homebrewとかyarnとかnodeとかnodenvとかgulpとかの開発環境の諸々のためのインストール。

[【簡単】MacにHomebrewをインストールする方法と基本的な使い方](https://fukatsu.tech/homebrew)

というわけでまずはこれ。

[Homebrew macOS用パッケージマネージャー](https://brew.sh/index_ja)

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

で、色々入ります。

---

次に、yarnのインストール。

[Yarn](https://yarnpkg.com/lang/ja/docs/install/#mac-stable)

```
brew install yarn
```

これでインストール完了。

---

で、からのnodeとかnpmのインストール。

[Node.js 公式](https://nodejs.org/ja/download/)

ここで推奨版の最新のnodeを普通にサイトからインストール。

---

次にnodeのバージョン管理。nodenvを使います。
[Node.jsのバージョンを自動で切り替えられるndenvが超便利 - Qiita](https://qiita.com/tonkotsuboy_com/items/5322d226b6783d25b5df)

```
$ git clone [https://github.com/riywo/anyenv](https://github.com/riywo/anyenv) ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile

$ anyenv install --init 
↓これしようとしたらなんか↑これしろって怒られたからした（必要なのか謎）

$ exec $SHELL -l
```

一応.bash_profileを確認

```
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```
となっているはず。

---

ndenvじゃなく、nodenvを入れる（下記曰く、ndenvはいま非推奨）
[anyenv + macOS環境構築 - Qiita](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)

`anyenv install —init`してなかったらまずは

```
anyenv install —init
```
で、

```
anyenv install nodenv
```
`Install nodenv succeeded!`って出るはず。  
で、`nodenv install -l`で入れられるnodeの一覧みれる

これでローカルでプロジェクトごとにnodeのバージョンを分けられる。

```
$ nodenv install 10.16.00
```
そのディレクトリで

```
nodenv local 10.16.00
```
これでそのディレクトリのnodeのバージョンは`10.16.00`になる。

---

で、gulpのインストール。

[https://qiita.com/miiitaka/items/32836ec7a00e88600de2:embed:cite]

```
$ sudo npm install -g npm
$ sudo npm install -g gulp
$ sudo npm install gulp --save
```
よく使う身体で覚えるべきシェルコマンド一覧

よく使う身体で覚えるべきシェルコマンド一覧


https://eng-entrance.com/linux-command-find

findの使いかた！：

$ find ファイル名


$ find 検索先 -name ファイル名


$ find work -name \*.dat




https://eng-entrance.com/linux-command-grep
grepの使いかた！：

grep 検索正規表現 ファイル名

$ grep a work/*


 grep 検索文字列 ファイル名 | grep 検索文字列2


seq


--------------------------
比較演算子！！

echo $(( 5 + 5))
$ echo $(( 5 - 5))
$ echo $(( 5 * 5))
$ echo $(( 5 / 5))
$ echo $(( 5 % 5))

eq：equal to
ge：greater than or equal to
gt：greater than
le：less than or equal to
lt：less than
ne：not equal to


数値比較の演算子

意味

数値1 -eq 数値2

数値1と数値2が等しければ真

数値1 -ge 数値2

数値1が数値2より大きい、もしくは等しければ真

数値1 -gt 数値2

数値1が数値2より大きければ真

数値1 -le 数値2

数値1が数値2より小さい、もしくは等しければ真

数値1 -lt 数値2

数値1が数値2未満であれば真

数値1 -ne 数値2

数値1と数値2が等しくなければ真
SPAとは

SPAサイトを作りたくて調べていた。
そもそも、SPAとはシングルページアプリケーションの略であり、よく調べると出てくる内容は
単一のWebページを使用して、アプリケーションを構成する設計構造の名称。

##SPAサイトのメリット

####動作性の向上
単一のWebページでコンテンツ切り替えを行なうので、ページ遷移の必要がない。

Webアプリケーションの流れから説明すると、
1ユーザーが何かしらのアクションを実施する（ボタンをクリックするなど）
2そのアクションに対して、サーバーに送信する（リクエスト）
3サーバー側でHTMLを生成し、ブラウザに返す（レスポンス）
4HTMLに反映する
１つのアクションに対して変更がない部分までサーバー側で生成する必要があった。
そういった変更のない部分まで毎回更新しているので処理に時間がかかる。

SPAサイトは
1ユーザーが何かしらのアクションを実施する（ボタンをクリックするなど）
2アクションに対して必要な部分のデータだけをサーバーに要求する
3サーバーから送られてきたデータをJSで処理する
4HTMLに反映する

ブラウザ側でできる処理をJSで行うためサーバーとの通信を最低限に抑える事が出来るため、動作の向上に繋がっている
Raspberry Pi用docker-composeの構築 （1.25.0以降）

[個人用のホームページ](https://tkyonezu.com/)を作成しました。今後は、そちらの方に整理していきたいと思いますので、よろしくお願いします。

2021/01/21 [Raspberry Pi用docker-composeの構築（1.28.0）](https://tkyonezu.com/docker-kubernetes/raspberry-pi%e7%94%a8docker-compose%e3%81%ae%e6%a7%8b%e7%af%89%ef%bc%881-28-0%ef%bc%89/)

[新しいホームページ](https://tkyonezu.com/)の方に、昨日（2021/01/20）に公開された[docker-compose 1.28.0](https://github.com/docker/compose/releases/tag/1.28.0)についての記事を書かせていただきました。

# Raspberry Pi用docker-composeの構築 （1.25.0以降）

docker-compose のバージョン 1.24.1 の頃までには、以下の記事を書いていました。ところが最新の 1.25.0 ではビルド方法が様変わりしていますので、別記事として書くことにしました。

- [Raspberry Pi用docker-composeの構築](https://qiita.com/tkyonezu/items/ceaaf41924df39254058)

一昨日に、docker-compose の [1.25.0](https://github.com/docker/compose/releases/tag/1.25.0) が公開されました。

このバージョンでも Raspberry Pi用のバイナリは提供されていません。ただし、以前のバージョンとは違いマルチプラットフォーム用の [Dockerfile](https://github.com/docker/compose/blob/1.25.0/Dockerfile) と [ビルド用のスクリプト](https://github.com/docker/compose/blob/1.25.0/script/build/linux) を使うことで、簡単にラズパイ 用の docker-compose をビルドすることができます。

以下、ラズパイ用の docker-compose をビルドする手順をまとめてみます。

## 1. docker-compose をクローン

github.com から docker-compose をクローンします。現在の最新版は 1.25.0 ですから、checkout しておきます。

``` sh
$ git clone https://github.com/docker/compose.git
$ cd compose
$ git checkout 1.25.0
```

## 2. docker-compose をビルド

ビルド用のスクリプトで docker-compose をビルドします。

```
$ ./script/build/linux
```

これだけで、マルチプラットフォームに対応したそれぞれのバイナリをビルドすることができます。

ビルドに成功していれば、dist ディレクトリに docker-compose のバイナリができていますので実行してバージョンを確認してみます。

```
$ cd dist
$ ./docker-compose-Linux-armv7l version
docker-compose version 1.25.0, build 4038169d
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
```

ビルドした OS の環境に合わせて docker-compose のファイル名が変わってきます。ラズパイの場合は Linux-armv7l となっています。

## 3. docker-compose のバイナリをコピー

出来上がった docker-compose のバイナリをコピーしておきます。

```
$ sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ cd /usr/local/bin
$ sudo chown root:root docker-compose
$ sudo chmod 755 docker-compose
```

バージョン [1.24.1](https://github.com/docker/compose/releases/tag/1.24.1) までの頃を考えると、非常に簡単にビルドできるようになりました。

以上です。