OmniAICreator/Qiita-1.07M huggingface dataset:
docker-machineコマンド導入

<h1>はじめに

UdemyにてDockerの学習をしていてDockerをインストールしただけではdocker-machineコマンドが使えなかったので、導入の方法を記載しておこうと思います。
以前のDockerでは同時にインストールされていたようですが、別途インストールが必要になったようです。

<h2>環境

・Mac OS
・Docker install済

<h2>導入

以下のコードをターミナルで実行することでdocker-machineコマンドが使用することが可能になる。

```
$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine
```

参考元
https://docs.docker.com/machine/install-machine/
SQLiteのテーブル参照方法

#SQLiteに作成したテーブルの確認方法
VSCode拡張機能「SQLite」を使用してモデルから作成されたテーブルを参照する。

##1.拡張機能をインストール
![sqlite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/b9e0b6fb-612b-81e0-21d7-0970bf72987d.png)

##２.コードウィンドウに移動し、「Ctrl + Command + P」を実行してInputBoxを開き、「sqlite」と入力する。

##３.表示されたリストから、「Open Database」を選択する。
![スクリーンショット 2020-11-25 22.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/589e7364-91c2-dc09-b952-2b55a3cb15b9.png)

##４.表示されたdatabaseの候補から、参照したいデータベースファイル（今回はdata.sqlite）を選択する。
![スクリーンショット 2020-11-25 22.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/b34f9d18-f6bc-6734-353f-7d308ae711c9.png)

##５.サイドバー下部に「SQLITE EXPLORER」というタブが表示されているのを確認し、選択する。

##６.選択可能となっているデータベースを選択し、表示されるテーブルリストから参照したいテーブルをクリックする。

##７.SQLiteタブが表示され、テーブルの内容が表示される。![スクリーンショット 2020-11-25 22.41.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/974f9ca2-d59a-898a-1a05-c389d2112e40.png)

##８.テーブルの参照内容を変更したい場合は、テーブルを選択した状態で右クリックからコンテキストメニューを開き、「New Query」を選択して開かれたQueryタブに必要なSQLスクリプトを入力して実行する。![スクリーンショット 2020-11-25 22.47.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/d96ac56b-25ec-7596-d008-811219253e94.png)
----

#最後に
今までOracleばっかりかつSqlDeveloperとかツールを使っていたから拡張機能を使ってテーブルを参照するとか面倒、というかビジュアル的に見難さを感じるけど、なれるしか無い。
Nuxt.js + Vuetify.js + PurgeCSS

## はじまり

Nuxt.js + Vuetify でいい感じのページできた！
SSGでホスティングサイトへシュゥゥゥーッ!!
超!でかいCSS!!（絶望）

## PurgeCSS

[これ](https://github.com/tokyo-metropolitan-gov/covid19/pull/477)がヒントになった。なにが幸いするかわからん。

## 設定

下記のページを参考にして設定書いたら（というかとりあえずコピペ）Vuetify絡みのCSSのサイズ1/3くらいになりました。
最適化の余地は全然あるけどとりあえずいいか…

- [PurgeCSSの公式](https://purgecss.com/guides/nuxt.html#nuxt-js-plugin)
- [Gridsome, Vuetify, PurgeCSS を使ってブログサイトを作ってみた](https://qiita.com/0622okakyo/items/4e5d4a4d29e4cd2b1576#purgecss-を利用して使われていないcss-を削除する)

```nuxt.config.js
  purgeCSS: {
    enabled: ({ isDev }) => !isDev,
    paths: [
      'components/**/*.vue',
      'layouts/**/*.vue',
      'pages/**/*.vue',
      'plugins/**/*.js',
      './node_modules/vuetify/dist/vuetify.js'
    ],
    styleExtensions: ['.css'],
    // whitelist: ['body', 'html', 'nuxt-progress', ''],

    whitelist: ['v-application', 'v-application--wrap','layout','row','col'],
    whitelistPatterns: [
      /^v-((?!application).)*$/,
      /^theme--*/,
      /.*-transition/,
      /^justify-*/,
      /^p*-[0-9]/,
      /^m*-[0-9]/,
      /^text--*/,
      /--text$/,
      /^row-*/,
      /^col-*/,   
    ],
    whitelistPatternsChildren: [/^v-((?!application).)*$/, /^theme--*/],
    
    extractors: [
      {
        extractor: content => content.match(/[A-z0-9-:\\/]+/g) || [],
        extensions: ['html', 'vue', 'js']
      }
    ]
  },
```
無料でFPGAを学ぶ方法 ①

#ACRi
『ACRi ルームは、道具を揃える面倒な手間をスキップして、手軽に FPGA 開発をはじめられるリモート環境を提供します。』
『はじめてのディジタル回路設計やプロセッサ開発には Arty を、FPGA の計算パワーを味わうには Alveo を、といった具合に興味や目的に応じてご利用ください。』

めちゃきくちゃありがたい話です。
FPGAボードも安くなったとはいえ、準備がなかなか面倒だったりします。XilinxのIDEは安定しないのにバンバンバージョンアップしたりしますし、アレですし…。

ここまでおぜん立てしてくれているのに使わないはないですね！
※中の人がすっごく頑張ってくれたんでしょう。

#IDを申請する

##利用規約
https://gw.acri.c.titech.ac.jp/wp/manual/tos
ちゃんと利用規約を読んだうえで、アカウント申請をしましょう。

##アカウント申請
https://gw.acri.c.titech.ac.jp/wp/manual/apply-for-account

アカウント申請後、数日すると2通のメールが届きます。
私の時は、

- ACRi ルーム: 予約システムアカウント作成通知
- ACRiルームのLinuxサーバにログインするためのアカウントのお知らせ

の2つです。

# 接続イメージ

FPGA環境へのアクセスはステップサーバを経由して、FPGAホスト（仮想サーバ）にアクセスしますが、まずは利用するマシンを予約する必要があります。

![ACRi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121950/010d3076-3e36-7b0c-bbde-af81b17cfd61.png)

明確には書かれていませんが、使用できる時間は3時間です。（予約Slotが3時間ごとなっている）
おそらく2時間55分時点でリセットがかかるので長い時間の作業はできなさそうです。

#Windowマシンから接続する

接続方法は下記を参考にされるとよいと思います。

https://www.acri.c.titech.ac.jp/wordpress/archives/283

RDPで接続すると普通のUbuntuが使えます
Active Storage の導入まとめ

###はじめに

・Active Strage の導入を自分なりにまとめたもので、メモのようなものです。
・投稿者は初学者ですので誤った情報を投稿してしまうことがあります。その時はぜひ、遠慮会釈なしにご指摘いただけると幸いです。

###Active Strageとは
ファイルアップロード機能を手軽に実装できるGemのこと。
元々はインストールが必要だったが、Rails5.2.0以降、初期段階から統合される事となった。このGemを用いると、ファイルアップロードのメソッドを使用できたり、画像を保存するテーブルを簡単に作成できる。

###Active Strageのお供
Active Strageと一緒に導入すると画像の加工の幅が広がる物を3つ列挙します。

・ImageMagick
・MiniMagick
・ImageProcessing

ImageMagickはソフトウェアで、MiniMagickとImageProcessingはGemになります。

`ImageMagick`
コマンドラインから画像に処理を加えることができるツールのこと。
画像の作成やサイズ変更、保存形式の変更などが可能となる。
Homebrewよりインストールする。

`MiniMagick`
ImageMagickをRubyで扱えるようにしてくれる接合の役割を担うGemのこと。

`ImageProcessing`
ImageMagickでの画像サイズ機能を拡張してくれるGemのこと。


###導入の手順

１、ImageMagickをHomebrewからインストールするために、下記のコードをターミナルに入力する。

```
% brew install imagemagick
```


２、MiniMagickとImageProcessingをインストール。

```Gemfile.
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
```

```
bundle install
```

`'~> 1.2'`と表記があるが、これは、1.2.0以上、1.3.0未満のバージョンを指定、という意味。


３、ローカルサーバーを再起動

```
rails s
```

４、Active Strageをインストール
導入手順１でrailsアプリの中にActive Strageを入れた。
ここでのインストールはActive Strageを用いるための周辺準備のためのインストール。

```
rails active_storage:install
```

これにより、Active Strageに関連したマイグレーションファイルが作成される。

続けて、以下のように`migrate`をすることでテーブルが作成される。

```
rails db:migrate
```


#####余談　※読み飛ばし可＊
導入手順１と４はどちらもインストールであるが、何が違うのかを自分なりに解説。

アパートの引越しで例えるならば、

導入手順１は「仲介業者と賃貸の契約」
導入手順４は「家具や消耗品を部屋へ搬入」

である。

仲介業者と契約を結んだだけでは(導入手順１)その部屋で快適には過ごせない。冷蔵庫に電子レンジ、シャンプーにお皿などの生活用具を部屋に運搬して(導入手順２)初めて生活ができる空間となる。

###まとめ
`Active Strage`を調べていく中で、`CarrierWave`という、同じく画像アップロード実装のGemを見つけました。
CarrierWaveは10年ほど前から利用されている古い技術ということで今はActive Strageが主流なのかと思いましたが、意外にもCarrierWaveも現役選手でした。
`Active Strage`はシンプルなファイルアップロード。
`CarrierWave`はアップロード＋細かな設定。
それぞれ別の役割がしっかりと備わっているようなので、CarrierWaveのことも調べて実装したいと思います。
【VSCode tips】VSCode の Python Extension のエラーを修正する 【#3】

## 現象

Windows 10 にて Visual Studio CodeのPython拡張機能をインストール・有効化すると、`C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps\python3.exe` というログが出力される。

## 原因

Windows 10 の機能である `アプリ実行エイリアス` にて、上記パスを参照しているが、`python3.exe` は存在しない（実行ファイルでない）ため、エラーが出力されている。 

## 対処

1. `アプリ実行エイリアス` から python を参照している、該当すエントリーを削除する
2. Visual Studio Codeを再起動する
JavaScript  アウトプット

・変数宣言（var,let,const）をしないとすべてグローバル変数になる（関数で厄介）。

・Functionコンストラクター（new Function）は、関数内部でもその配下の変数は全てグローバルスコープとみなされるので、利用はおすすめしない。

・与える因数の数が、関数側で要求する数と異なる場合も、チェックしない（エラーにならない）。

・引数は、後ろの引数だけ省略できる。

・高階関数で配列をリスト化したり合計値を算出したりできる。

・スコープチェーンとは、グローバルオブジェクトとCallオブジェクト（ローカル変数）を生成の順に連結したリスト。変数のメカニズムがわかる。

・関数リテラルは、匿名（無名）関数を使用する。

・closure関数が呼び出されると、
　・匿名関数（関数名を記述せずに引数や代入に使用する関数　
　　例：const myfunc = function (name)）を表すCallオブジェクト（ローカル変数）
　・closure関数のCallオブジェクト
　・グローバルオブジェクト
　というスコープチェーンが形成される。

・プロパティの宣言→コンストラクターで・メソッドの宣言→プロトタイプで

・プロパティの宣言　→　コンストラクターで

・メソッドの宣言　→　プロトタイプで

・静的メソッド、プロパティ　↔︎　インスタンスメソッド、プロパティ

・グローバル変数はできるだけ減らすこと（多いとややこしくなる）、そのために静的メンバーを使うこと

・プロトタイプチェーン・・・暗黙の参照で継承関係している。終端には必ず、Object.Prototypeがある。インスタンスが生成された時点で固定され、その後の変更にかかわらず保存される。

・querySelector(All)はより細かいものまで特定できるが、低速なので単純なものはgetElemnt~にする。

・タグ内のJSは、イベントハンドラーの呼び出し程度にすること。

・ページの初期化処理は、DOMContentLoadedイベントリスナーで表すのが基本

・getAttribute／setAttributeメソッドは、
　・HTMLとJavaScriptとで名前の相違を意識する必要がない
　・（文字列として指定できるので）　取得／設定する属性名を、スクリプトから動的に変更できる

・一般的には、HTML文字列を埋め込むのでなければ、まずはtextContentプロパティを優先して利用することをおすすめ（読み込みの速さなど）

・ユーザーからの入力値など外部からの入力値を、innerHTMLプロパティで出力しないこと（不特定のユーザーのブラウザー上で勝手に実行されてしまう可能性がある）

・引数（ひきすう）とは関数に与える追加情報

## 参考
JavaScript本格入門
ARモデルのテクスチャを変えるメモ

A-Frameにて、ARモデルのテクスチャを変えて、ARモデルの雰囲気を変更するメモ。
ARモデル作成時に自動的に作成されるテクスチャファイルの4象限を、好みの風合い（色彩やタッチ）を直接更新すると、ARモデルのテキスチャが自動的に変わる。

#テクスチャファイルを直接更新する
（例）更新前のテクスチャファイル（Tex_Penguin.png）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/ce13986a-250c-839b-e78e-e0b76baf18b9.png)

（例）更新後のテクスチャファイル（Tex_Penguin.png）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/60b1cd65-109c-0f36-657e-2af5c6646b7e.png)

#更新後のイメージ
（例）更新前のARモデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/85a71c7b-74b6-e7b5-1537-af910f9cc9fc.png)

（例）更新後のARモデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737339/3be71082-62e3-8254-6b2d-901e1b3c74c8.png)
Javascript(React) 株価取得WebAPI グラフ表示(Function Component)

![FireShot Capture 008 - React App - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450388/a5625f73-4528-a518-6869-7f05b2a40da3.png)

API-GRAPH-REACTという名前で
githubにて公開中です。

検索欄入力の際チィッカーシンボルを入力してください
例：
Amazon =>　AMZN
Microsofl => MSFT
Apple => APPL
Facebook => FB
  
＃連想配列
reactでstateを別コンポーネントに渡すときの呼び出される側

## 呼ばれる側
- コンポーネントが呼ばれて返す値に`state`をセットすると別コンポーネントから呼び出すことができる

```react
class GetPod extends Component {
    constructor(props) {
        super(props);
        this.state = {
            podstatus: ''
        }
    }

    // renderの前に実行される
    componentWillMount() {
    const request = axios.create({
            baseURL: "http://127.0.0.1:1323",
            method: "GET"
        })
        request.get("/getpodstatus")
            .then(request => {
                this.setState({
                    podstatus: request.data.items[0].status.phase
                })
                console.log(this.state.podstatus)
            })
    }

    // コンポーネントが呼ばれたらstateを返すようにする
    render() {
        return <p>{this.state.podstatus}</p> ;
    }
}
```
すでに作ったLaravelプロジェクトにLaradockいれてEC2でデプロイする

#背景
Laravelでプロジェクトつくって、EC2にデプロイする手順は下記の通りかと思っています。（間違っていたらすいません）
1.Laradockをいれる。
2.プロジェクトをLaradock配下でcomposerで作成する。
3.作成したプロジェクトをコーディングしていく。
4.githubにあげる。
5.EC2/VPCでgit cloneしてLaradock起動する。

最初にLaradockで作っていくのが良い例かと思いますが、
初心者であった自分はdockerはポートフォリオ作成と並行して勉強していたので、あとからdockerをプロジェクトに入れることが必要になりました。。。
Laradockを最初から使わずに制作していた自分みたいな人にむけて、他の人の参考にでもなればと思い、メモとして残しておきたいと思います。

#参考にしたサイト
大いに参考にさせていただいたサイトは次のものです。
既存のLaravelプロジェクトにLaradockを導入する方法は下記のとおりです。

A : https://qiita.com/segur/items/600eaef70fef896f2d0d
このあとにLaradockのsubmoduleが読み込まれないところで詰まった点については下記のサイトを参考にしました。
B : https://karoten512.hatenablog.com/entry/2017/11/09/013845


# 手順

メモなので、ざっと書きます。
手順は下記の13の手順です。
①すでにローカル環境でLaravevlプロジェクトを作成する。
②　参考サイトAを参考にルートプロジェクト下にLaradockを入れる。(git submoduleする)
③　githubにLardockを入れたプロジェクトごとpushする。（git push(
④　AWS/EC2を起動する。その時使ったインスタンスは,t2.smallです。理由はcomposer installするときにt2.microだと固まってしまうからです。(EC2/VPCの作成)
⑤ インスタンス内で参考サイトBをgit clone --recursive｛git repository　url｝をする。
⑥　git cloneしたプロジェクト配下にlaradockがあるので、そのなかにcd(cd プロジェクト/laradock)
⑦　docker-composeでイメージ立ち上げる。（docker-compose up -d nginx mysql）
⑧　ルート権限にする。（sudo su)
⑨ docker-compose exec workspace bashで作業ディレクトリに入る
⑩ rootで/home/ubuntu/プロジェクト名/laradock　に移動して、composer install 
⑪　php artisan key:generateする。
⑫　EC2のグローバルIPにブラウザでアクセスする。
⑬　作ったアプリが確認できます。

#終わりに
次からはDockerイメージ作成してからプロジェクト作成します。。。
以上
Azure Databricks のテーブルをADLSGen2と組み合わせて行レベルセキュリティが実装できるか試みた

## はじめに

delta lakeテーブルのパーティションと、Azure DatabricksのAADパススルー、Azure Data Lake Storage Gen2のACLを組み合わせればDatabricks上で行レベルセキュリティが実装できるんじゃないかと思い試してみました。
(2020/11時点情報)

参考  
[Azure Data Lake Storage Gen2 のアクセス制御リスト | Microsoft Docs​​​​​​​](https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-access-control)  
[Azure Active Directory 資格情報パススルーを使用して Azure Data Lake Storage へのアクセスをセキュリティで保護する](https://docs.microsoft.com/ja-jp/azure/databricks/security/credential-passthrough/adls-passthrough)


## 結論

特定のパーティションを参照するようにwhere文を指定していれば機能しましたが、通常の行レベルセキュリティの使用感とは異なる形です。  
権限をもたないレコードにはアクセスできないようにするという意味では達成していますが、実用は少し厳しいかもしれません。　　
Current_User()を利用して、ユーザ情報を取得・利用した認可用制御用のテーブルをかませてあげればよさそうですが、その場合ACLを使う必要はなくなりますね
[動的ビュー関数](https://docs.microsoft.com/ja-jp/azure/databricks/security/access-control/table-acls/object-privileges#dynamic-view-functions)

## 手順






### データ作成

適当なクラスターでストレージにdeltaフォーマットデータを書き込みます。

``` :python

df = spark.read.json("dbfs:/databricks-datasets/iot/iot_devices.json")
# partitionをcca2（国コード）で分割して保存
location = "/mnt/mymt/iot"
df.write.partitionBy("cca2").format("delta").save(location)

```

### aclの権限付与

[Azure Data Lake Storage Gen2 のアクセス制御リスト (ACL) を再帰的に設定する](https://docs.microsoft.com/ja-jp/azure/storage/blobs/recursive-access-control-lists?tabs=azure-powershell#prerequisites)
が私のローカルのAzure Storage Explorerからだと効かなかったのでちょっと頑張ります

以下のように権限を振ります。

- ルートのコンテナ:x(実行)を付与
  - iotフォルダ:x
    - _delta_logフォルダとその配下ファイル:x,r,w
    - cca2=ADフォルダとその配下ファイル:x,r,w

### テーブル作成

adパススルーを有効にしたクラスタで以下を実行

```:python

location = "/mnt/mymt/iot"
configs = { 
"fs.azure.account.auth.type": "CustomAccessToken",
"fs.azure.account.custom.token.provider.class": spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}

spark.sql("""
  CREATE TABLE iot2
  USING DELTA
  LOCATION '{}'
""".format(location))

```

### SQLによる確認

まずは、権限をもったパーティション

```:python

%sql
select * from iot2
where cca2='AD'

```

成功します。

![スクリーンショット 2020-11-25 220011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2d59c1b5-54e0-3bdd-678c-1359f296b449.png)

次に権限をあたえていないパーティション

```:python

%sql
select * from iot2
where cca2='CA'

```

失敗します。

![スクリーンショット 2020-11-25 220204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3025ff5d-6975-9a2a-8896-9d163302b1f0.png)
Linuxのコマンドをまとめました。

## はじめに
個人アプリの開発を進めていく中で、環境構築をする際Linuxコマンドに触れることが多くなってきた為、備忘録もかねて今までに出てきたコマンドをまとめました。


## ディレクトリに関するコマンド
| コマンド| 説明|使用例|
|----|---- |------|
| cd | ディレクトリ（フォルダ）移動 |cd 移動したいフォルダ名|
| ls | フォルダの内容をリスト形式で表示する |中身をみたいフォルダに移動して、ls
| pwd| 現在いる位置を表示する |現在いる位置を表示する
| mkdir | フォルダを作成する　 |mkdir フォルダ名
| touch| ファイルを作成する |touch ファイル名
| rmdir| 空のフォルダを削除する |rmdir フォルダ名
| rm | ファイルやフォルダを削除する|mv|(移動先ファイル名/フォルダ名)　
| mv| ファイルを移動 |mv (移動元ファイル名/フォルダ名) (移動先ファイル名/フォルダ名)　
| cat| デファイルの内容を表示する |cat ファイル名
| grep | 指定した文字列がテキスト内に存在した場合その行を抽出する |grep "検索したい文字" * ファイル名
| chmod| ファイルやフォルダのアクセス権限を変更する |chmod 権限ファイル名
| chown | ファイルやフォルダのオーナーやグループを変更する |chown 変更したいユーザー名 変更したいファイル名
| find | ファイルの検索をする |find / -name ファイル名|
| diff| ファイルとファイルの内容の違いを表示する |diff 旧ファイル名 新ファイル名
| history| コマンドの履歴を表示する |-
| ln| ファイルやフォルダにリンクを設定する|ln リンク元ファイル名　リンク先ファイル名/フォルダ名
|apropos| manページの内容を検索する| apropos キーワード |
| less| テキストファイルを閲覧する|less ファイル名
| more| ファイルをページ単位で閲覧する|more ファイル名　
| clear| 消さずに画面を綺麗にする |-
mv (移動元ファイル名/フォルダ名) (移動先ファイル名/フォルダ名)　



## ネットワーク関連を設定したい時
| コマンド| 説明|
|----|---- |
| ssh | sshでログインする
| ftp | ファイルをFTPで転送する
| route | ルーティングの表示や設定を行う

## システム管理したい時
| コマンド| 説明|
|----|---- |
| free| 空きメモリや、使用中メモリを表示する
| last| ファイルをFTPで転送する最近ログインしたユーザー名を表示する
| finger|ユーザー情報を表示する


## ユーザー管理したいとき
| コマンド| 説明|
|----|---- |
| useradd/adduser| ユーザーを新規作成する
| deluser | ユーザーを削除する
| groupadd| グループを新規作成する
| groupdel | グループを削除する
| groupadd| ルーティングの表示や設定を行う
| chfn| ユーザー情報を変更する

## コマンドのオプションや使用方法を知りたいとき

```
man コマンド名
```
Nuxt.jsでのgenerateに--fail-on-errorをつけたら幸せになった話

# はじめに
Nuxtを使って静的サイトをCI/CDでデプロイしている方に朗報です!!
generate時にエラーが発生してしまい、ページの一部が生成されずに、404エラーになってしまった経験をお持ちの方は多いのではないでしょうか？？

そんなトラブルもたった一行で即解決！
Nuxtのバージョン更新可能な方はすぐに実装をおすすめです。

# バージョン
nuxt.js 2.14.4以降

# 実装内容
generateのオプションでたった一文を追加するだけで、エラーをキャッチしてビルドが中止されるので、ページが生成されていない404エラーとはおさらばです。

```json:package.json
{
  "scripts": {
    "generate": "nuxt generate --fail-on-error",
  }
}
```

# おわりに
うっかりミスもこれで安心。

# 参考
[Nuxt.js Release Notes v2.14.4](https://ja.nuxtjs.org/docs/release-notes/#v2.14.4)
Javascript(react) 多次元配列をテーブルに挿入するfunction component


オライリージャパンreatビギナーズガイドの練習課題『高機能excel作成を作ろう』にて
多次元配列の処理をclass componentで書かれていた。
function componentの理解のため、function componentに書き換えていく。

参考書籍：reactビギナーズガイド
サンプルコード：https://github.com/stoyan/reactbook
該当フォルダ・ファイル：chapters/03.04.table-sortby.html

![FireShot Capture 003 - React App - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450388/9f852652-5b8b-cce0-b0f5-0f52657d7324.png)
配列の要素は適当に違う値を使用します。

#土日がない？休みなんか必要ないですよね？笑


```react:Table.jsx

function Table() {

  const heads = ["月", "火", "水", "木", "金"]
  const heads1 = heads.map((head) =>
    <th>{head}</th>
  )

  const data = [
           [1, 2, 3, 4, 5], 
           [6, 7, 8, 9, 10,], 
           [11, 12, 13, 14, 15], 
           [16, 17, 18, 19, 20,], 
           [21, 22, 23, 24, 25], 
           [26, 27, 28, 29, 30,]
               ]



  return (
    <div>
      <table border='1' cellSpacing='0'>
        <tr>{heads1}</tr>
        {data.map(row1 =>
          <tr>
            {row1.map(row2 =>
              <td>{row2}</td>
            )}
          </tr>
        )}
      </table>
    </div>
  );
}

export default Table;
```
(随時更新予定)

＃react
＃ファンクションコンポーネント
＃Table
＃多次元配列
＃二次元配列
＃map関数
【JavaScript】コールバック関数メモ

配列arryに数字を格納し、それを1つずつコンソールに出力させる処理

```JavaScript:app.js
const arry = [1, 2, 3, 4]

arry.forEach(function() {
  console.log(val)
})
```

```sh:出力結果
1
2
3
4
```
手振りモデルのノート

モデルの結果の使い方のファイルパス
//mediapipe/mediapipe/python/solutions/drawing_utils.py

handlandmarksから手振り認証
https://dev.classmethod.jp/articles/mediapipe-recognize-hand-pose-with-multi-hand-tracking/

https://gist.github.com/TheJLifeX/74958cc59db477a91837244ff598ef4a


OpenCV Python
https://github.com/skvark/opencv-python


tesseractでのOCR
https://nanonets.com/blog/ocr-with-tesseract/　　一番いい

https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/

https://www.pyimagesearch.com/2018/09/17/opencv-ocr-and-text-recognition-with-tesseract/
Tesseract OCRの結果を改善のため
https://github.com/tesseract-ocr/tessdoc/blob/master/ImproveQuality.md


画像をスキュー除去の方法
https://stackoverflow.com/questions/46731947/detect-angle-and-rotate-an-image-in-python　わかりやすい

https://www.pyimagesearch.com/2017/02/20/text-skew-correction-opencv-python/
http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/

参考：https://gist.github.com/endolith/334196bac1cac45a4893

OCRステップバイステップ
https://nanonets.com/blog/ocr-with-tesseract/

Raspberry 32bit か 64bit　か

```
$ uname -m
```
You will get a response something like armv7l or armv8.
ARMv7 and below are 32-bit. AMRv8 introduces the 64-bit instruction set.

install miniconda 
https://stackoverflow.com/questions/61508312/installing-anaconda-on-raspberry-pi-4-with-ubuntu-20-04

```
# Update linux
sudo yum update -y

# Install python3
sudo yum install -y python3

# Download miniconda installation (32-bit version)
curl "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-armv7l.sh" -o "Miniconda.sh"

# Run miniconda installation
bash ./Miniconda.sh
```

```
# Add Raspberry Pi channel for conda installations
conda config --add channels rpi

# Update conda
conda update conda
```

connect camera module to raspberry
https://projects.raspberrypi.org/en/projects/getting-started-with-picamera

install opencv
https://www.tomshardware.com/uk/how-to/raspberry-pi-facial-recognition
https://qengineering.eu/install-opencv-4.5-on-raspberry-pi-4.html

Pythonのnamedtuple
https://qiita.com/Seny/items/add4d03876f505442136
https://www.geeksforgeeks.org/namedtuple-in-python/
Ubuntu22.04LTSを導入して最新のRのインストール、パッケージtidyverseを構築する

## 1.はじめに
以前の情報がだいぶん古くなったので更新しました！

　Ubuntu 22.04.1 LTS を導入するにあたっての初期化に伴い、Rの再インストール及びパッケージの再構築をしました。

　tidyvers派の人にとっては、まず最初にインストールするパッケージですが、ubuntuではすんなりといかないことが多く、ここでubuntuでのR利用を諦める人もいるかと思いますので、その過程を記録します。【令和6年7月22日現在】
## 2.環境
```
OS:　Ubuntu 22.04.1 LTS 
     Windows11             
 　（デュアルブート）
CPU:　AMD® Ryzen 5 5625u    
メモリ：　13.6GiB
```
## 3.R 及び RStudioのインストール
ターミナルを立ち上げ、次のコマンドを打ちます。

```
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/'
sudo apt update
sudo apt install r-base
```
R version 4.4.1 がインストールできました。

次に、最新のRStudio Desktop 1.3.1093をダウンロードします。
Ubuntu 22/Debian 12 を選択します。
https://rstudio.com/products/rstudio/download/#download
ダウンロードしたdebファイルは、コマンドプロンプトを開き、次のようにインストールします。
(hogehogeは、対象とするファイル名です。パス付きファイル名）

```
sudo apt install  hogehoge
```

## ４．パッケージtidyverseのインストール
Rのターミナルに次のコマンドを打ちます。

```
install.packages("tidyverse")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161102/8d45d4e9-e7f2-df31-2b2f-61c5cfec8625.png)

どうやらCの開発環境が入っていないようです。
RのパッケージはCで開発されていることが多いので、Cの開発環境が必須になります。
makeとgccのインストールが必要です。
```
sudo apt update
sudo apt install make
```

次にgccとはCのコンパイラのことですが、次のコマンドで、Cの開発環境をインストールできるらしい。

```
sudo apt update
sudo apt install build-essential
```
これでCの開発環境はインストールできました。再度、tidyverseのインストールを試みます。

```
install.packages("tidyverse")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161102/093f5028-ae52-f78d-2d7a-92851ca3e722.png)

ubuntu自体に必要なライブラリが入っていないため、エラーが吐き出されます。
以下のライブラリをコマンドプロンプトで入れたところ、無事にインストールできました。

すべて sudo apt install hogehoge です。（名前を変えてください）

libxml2-dev
libfontconfig1-dev 
libcurl4-openssl-dev 
libharfbuzz-dev
libfribidi-dev 
libtiff5-dev

## 5.最後に
ベイズ推定をするにはrstanは必須ですが、rstanのインストールはさらに難航しました。
特にRcppEigenの依存パッケージが入らなくて困りましたが、
（いろいろライブラリをインストールしてもだめだった）

```
sudo apt install gfortran
```
を入れてみてください。これで解決しました。

## Enjoy!
【備忘録】Swift 実践入門について　第1章

Swift 実践入門のまとめ。
分からない部分の抜粋も記載し、解決できたら随時更新していきます。
なお、ここに記載している以外でも「わけわからん…」となっている部分も多々ありますが、今は必要ない、と言い聞かせて飛ばしています。


第1章
理解度：50％切るかも…
言語の特徴に関して、聞いたこともない単語が多い。
ジェネリクスから始まり、
Objective-Cと連携可能、ツールチェイン、コマンドライン、REPLはサッパリワカラン。


上記は飛ばすとして、以下の内容はいずれ理解する必要があるのかも。

5ページ

max(_:_:)関数は、比較可能な2つの引数を受け取り、大きいほうを戻り値として返します。max(_:_:)関数の宣言は次のようになっています。

func max<T>(_ x: T, _ y: T) -> T where T : Comparable

宣言にあるTは型引数と言い、引数のxとyに応じて具体的な型に置き換えられます。T : ComparableはTがComparableプロトコルに準拠している必要があることを意味します。プロトコルとは型のインタフェースを定義するものであり、Comparableプロトコルに準拠するということは、価どうしの比較のためのインタフェースが用意されていることを意味します。


Swift実践入門は10日で終わらせる予定。ビジネスロジック、Github入門と続く…
ProvisioningProfileの有効期限をチェックする

InHouse配布のiOSアプリは、ProvisioningProfileの有効期限が切れるとアプリが起動しなくなる。
アプリが起動しない状況を未然に防ぐため、
ProvisioningProfileの有効期限をチェックする機構を検討した。

# 前提条件
- ProvisioningProfileはFastlane Matchで管理されていること

# 仕組み
主にFastlaneを利用する。
1. Fastlane MatchにてProvisioningProfileを取得する
2. OpenSSLにてProvisioningProfileをデコードし、Plistファイルを得る
3. Plistファイルから有効期限を取得する

# サンプル
Fastlaneにて有効期限をチェックするサンプル

```Ruby
  lane :check_provisioningprofile do
    # Fastlane MatchにてProvisioningProfileを取得する
    match(
      readonly: true,
      git_url: #{matchリポジトリのURL},
      app_identifier: #{Bundle ID},
      output_path: "/tmp/check_provisioningprofile"
    )

    Dir.glob("/tmp/check_provisioningprofile/*.mobileprovision") do |mobileprovision|
      # OpenSSLにてProvisioningProfileをデコードし、Plistファイルを得る
      sh("openssl smime -inform der -verify -noverify -in #{mobileprovision} > /tmp/decoded.plist")

      # PlistファイルからProvisioningProfileの名称を取得する
      profile_name = get_info_plist_value(path: "/tmp/decoded.plist", key: "Name")

      # Plistファイルから有効期限を取得する
      expiration_date_value = get_info_plist_value(path: "/tmp/decoded.plist", key: "ExpirationDate")
      expiration_date = DateTime.parse(expiration_date_value.to_s)
      
      # 有効期限が30日後に迫っていたらエラーとする
      warning_threshold = DateTime.now + 30
      if warning_threshold > expiration_date
        UI.user_error!("It will expire soon.\n---> #{profile_name}")
      end
    end
  end
```
Bitbucket で運用途中にLFSを導入したメモ

```
git clone --mirror git@bitbucket.org:project/repo.git
cd repo.git
```
(以下のファイルパターンリストは `git lfs migrate info` などを見て適宜変える)

```
git lfs migrate import --include='*.exr,*.fbx,*.png,*.xls,*.otf,*.dll,*.db,*.psd,*.pptx,*.exe,*.dic,*.pdf,*.bin' --everything
git reflog expire --expire-unreachable=now --all && git gc --prune=now
```
(ここまでに “repo_lfs” レポを新たに作成しておく)

```
git remote add --mirror=push new git@bitbucket.org:project/repo_lfs.git
git push new
```
ﾜﾀｼの日記帳へようこそ

[
11/26　しもた　見つかってしもた様ですは ｺｺは　気付かないﾌﾘをして置こう
11/27　書き込みをｻﾎﾞる
11/28　昼間？　ああ寝てた　天気のｲｲ日はよく寝れますね
11/29　暇なのでｱﾏﾌﾟﾗでも観る　「ｱｲｱﾝ・ｽｶｲ」結構面白いじゃん　あと　ｸﾘｱｻ呑み過ぎて腹ﾕﾙいぞ
11/30　家着いたんだがこのまま寝ようとしてる　ﾌﾛ入んなくてもｲｲよね　ね　...やっぱ入りましょう
12/1　ﾏｯｸのﾚｼｰﾄの裏にｸｰﾎﾟﾝ付いてましてね　それで🍟のM買えるんですよね　150円でですね
12/2　さむいさむいさむい
12/3　22円かい　2年振りじゃんね
12/4　ﾊﾟｿ美　ｺｹる　resetData ｶﾏす 小麦ﾊﾞｰｶﾞｰんまい
12/5　ちょっと joiful 行って来る　今週で閉店なのよね　あそこのﾄﾞﾘﾝｸﾊﾞｰの洗い切れてない 積まれたｶｯﾌﾟ見るのもこれで見納めなのよ
12/6　かなりひさしぶりにﾜｲのぷろばいだのhomepageｽﾍﾟｰｽにｱｸｾｽしてみる　いやﾁｮｲと必要があって...
12/7　おう BitCoin ｶﾞﾝｶﾞﾚや　ﾜｲもﾋﾞｯﾄｺｲﾝ保持者なんやで 0.0001btc持ってるﾝやで ｶﾞﾝｶﾞﾚや
12/8　会社着いてから変調に気付く「今日休む」つって帰ってきますた　会社休んで食うｶﾚｰまじ旨いｪ
12/9　なんか今日も会社休みますた　一日中寝てましたよ
12/10　寝てても調子良くならんので出勤してみますた　体調治りますた
12/11　あした　晴れっかな...
]
(http://www.catv296.ne.jp/~du_sanjp/nikki -- Apostille TX def1e92c29ba6f9e96738c5ebc9b841a61015894da042fc9f497e93bf8886663 -- Date 2020-12-12.png "ここｸﾘｯｸしたら出てくる画像な この画像はｱﾎﾟｽﾃｨｰﾕされている　試してみ　監査かけてみ")

[↑ ｺｲﾂのしょうめいしょ](http://www.catv296.ne.jp/~du_sanjp/Certificate of nikki -- TX def1e92c29ba6f9e96738c5ebc9b841a61015894da042fc9f497e93bf8886663 -- Date 2020-12-12.png)
Vuejsのモジュールのインポートエラー

 
<h1>Vuejsのモジュールのエラー</h1>
エラーの内容: モジュールのインポートができなかったため、"./components/sample"
以外の方法で調べた。
エラー内容：
エラー解決の手順
１、App.vueとmain.jsモジュールインポートのコードの変更
２、App.vueのコンポーネントの追加
３、開発用にファイルをビルトする。
技術：Vuejs2,VueCli

### App.vueのエラーコード
```javascript
import sample from "./components/sample";

export default{
  data() {
    return{
      number: 10
    }  
  },
  components: {
    Sample
  } ,
```
<h1>App.vueの構成とコンポーネントの追加</h1>
1、"./"を"@/"に変更
2、コンポーネントの追加

```javascript
import GoodHeader from "@/components/Sample.vue";
import About from "@/components/Sample1.vue";
import Home from "@/components/Sample2.vue";

export default {
  data() {
    return {
      number: 10
      
      }
  },
  components: {
    Sample,
    Sample1,
    Sample2
  }

```

<h1>main.jsのエラー解消前</h1>
ここのファイル変更して、App.vueと同期する

```javascript
import Vue from 'vue';
import App from './App.vue';
import GoodNum from "./components/sample.vue";

```
<h1>エラーの解消内容</h1>
App.vueと同様に、main.jsも"@/components/"に変更した。

```javascript

import Vue from 'vue';
import App from './App.vue';
import sample from "@/components/sample.vue";
```
<h1>モジュール変更後の処理</h1>
開発用に、ファイルの構成をビルトした

```javascript
npm run build 
npm run serve　//サーバーの立ち上げ
```
[Rails]オーバーライド(継承)について勉強してみた！[初心者]

#オーバーライドとは?
親クラス(スーパークラス)で定義されたメソッドについて、小クラス(サブクラス)で同じ名前で再定義すること。

#クラスの継承とは?
他のクラスをベースとして新しいクラスを作成することをクラスの継承と言います。

利用したいクラスが複数存在する場合、全てを1から作成していると骨が折れますし、共通する部分を複数のクラスに重複して定義する必要があります。
そこで、あるクラスが既に作成されている場合、そのクラスを拡張することで、新しいクラスを作成することができます。

クラスの継承は以下のように記載します。

````ruby:
class 子クラス名 < 親クラス名
end
````

#継承の具体例

````ruby:
class Days
  def study
    puts "勉強する"
  end
end

class Holiday < Days
  def sleep
    puts "寝過ごす"
  end
end

holiday = Holiday.new
holiday.study
````

````ruby:実行結果
勉強する
````

#オーバーライドの具体例

````ruby:
class Days
  def study
    puts "勉強する"
  end
end

class Holiday < Days
  def sleep
    puts "寝過ごす"
  end

  def study
    super
    puts "休日だろうと勉強しなければ"
  end
end

holiday = Holiday.new
holiday.study
````

````ruby:実行結果
勉強する
休日だろうと勉強しなければ
````

#サブクラスにメソッド定義がない場合
サブクラスで定義していないメソッドが呼び出された時は、スーパークラスに同じ名前のメソッドがある場合に限り、スーパークラスのメソッドが呼び出せます。
具体例を以下に載せました。

````ruby:
class Days
  def study
    puts "勉強する"
  end
end

class Holiday < Days

end

holiday = Holiday.new
holiday.study
````

````ruby:実行結果
勉強する
````

#superclassメソッド
全てのクラスは、クラスメソッドとして``superclassメソッド``を持っています。
また、スーパークラスのメソッドを引数なしで呼び出したい時には、``super()``も使用できます。
【Nuxt.js】「dotenv」を使った環境変数の設定方法

#「dotenv」をインストール

プロジェクト直下で`npm install --save @nuxtjs/dotenv`を実行

```:ターミナル
$ npm install --save @nuxtjs/dotenv
```

#package.jsonで確認
```json:package.json
  "dependencies": {
    "@nuxtjs/dotenv": "^1.4.1",    <-
    "core-js": "^3.6.5",
    "nuxt": "^2.14.6"
  }
```

#プロジェクト直下に`.env`ファイルを作成

```:ターミナル
$ touch .env
```

**`.env`ファイルに適当な値を定義します。**

```:.env
TEST = 'テスト'
```

#`nuxt.config.js`の設定

```javascript:nuxt.config.js

//...省略

  // Modules (https://go.nuxtjs.dev/config-modules)
  modules: [
    '@nuxtjs/dotenv'
  ],

//...省略
```

#console.logで確認
きちんと設定されているか確認します。
`pages/index.vue`に`console.log`を設置。

```vuejs:pages/index.vue
<script>
export default {
  created() {
    console.log(process.env.TEST)
  }
}
</script>
```

![スクリーンショット 2020-11-25 21.00.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/ab6044b8-8b62-c072-e056-5600290f49a2.png)

OKです！

#`.gitnore`ファイルの確認
最後に`.gitnore`ファイル内に`.env`の記述があるか確認します。
`nuxt-create-app`を使用すればデフォルトで記述されますが、
無い場合は記述しておきます。

![スクリーンショット 2020-11-25 21.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/f72a2706-cdf8-1df6-1a6b-f68656c7b318.png)

これでgitの管理対象外となります。
gunicornで起動するworkerに連番を割り振る

複数の Worker を起動するアプリケーションにおいて、各 Worker に一意な連番を割り振りたい場面があったのでメモ。

設定ファイルの`Server Hooks`を使えばワーカーの起動時に呼ばれる処理を定義できるため、ここでワーカープロセス毎に環境変数を設定する。

# 実装

FastAPI + gunicorn の例

`pre_fork`イベントを利用する

```python:gunicorn.config.py
import os

workers = 4

def pre_fork(server, worker):
    print('## called pre_fork')
    os.environ['WORKER_ID'] = str(server.worker_age - 1)
```

```python:main.py
import os
from fastapi import FastAPI

app = FastAPI()

worker_id = os.getenv('WORKER_ID')
print('## WORKER_ID:', worker_id)

@app.get('/')
def index():
    return {'msg': 'hello!'}
```

### 起動コマンドと出力

```shell
$ gunicorn main:app -c gunicorn.config.py
```

```
[2020-11-25 21:07:32 +0900] [18136] [INFO] Starting gunicorn 20.0.4
[2020-11-25 21:07:32 +0900] [18136] [INFO] Listening at: http://127.0.0.1:8000 (18136)
[2020-11-25 21:07:32 +0900] [18136] [INFO] Using worker: sync
## called pre_fork
[2020-11-25 21:07:32 +0900] [18139] [INFO] Booting worker with pid: 18139
## called pre_fork
[2020-11-25 21:07:32 +0900] [18140] [INFO] Booting worker with pid: 18140
## called pre_fork
## WORKER_ID: 0
[2020-11-25 21:07:32 +0900] [18141] [INFO] Booting worker with pid: 18141
## WORKER_ID: 1
## called pre_fork
[2020-11-25 21:07:32 +0900] [18142] [INFO] Booting worker with pid: 18142
## WORKER_ID: 2
## WORKER_ID: 3
```

`pre_fork`が4回呼び出され、ワーカー毎に0～3の番号が環境変数にセットされた
SafeAreaのTopまでViewをアニメーションする方法

最近SafeAreaというのを知りました！
iPhoneXが出たことにより、SafeAreaが誕生したみたいです。
こんな問題がありました。
アニメーションさせたときにViewがSafeArea外まで表示されてしまって困っている。
解決したのでここにメモをしていきますね　:relaxed:

#SafeAreaのサイズ
このオレンジの部分がSafeAreaです。
![スクリーンショット 2020-11-25 20.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/8f40b97d-4202-ba15-2d4b-8da8b0b60af3.png)


#SafeArea取得
この取得で必要になるのが`safeAreaInsets`です！
`safeAreaInsets`にTopまたはBottomでSafeAreaの上と下を取得することができます。
こちらを上手く使うと、SafeArea外に入ることなくアニメーションが可能です


```
let safeAreaTop = self.view.safeAreaInsets.top
let safeAreaBottom = self.view.safeAreaInsets.bottom
```

#SafeAreaのTopまでAnimationさせてみる
ファイル構成は`sampleViewController.swift``sampleViewController.xib`
のみ使っていきます！⚠️あとのファイルは気にしないでください。

![スクリーンショット 2020-11-25 21.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/c0b21891-2350-3498-34ed-71881d9d7d68.png)

まずはViewを置いて、紐付けしていきます。

コードはこんな感じです。

```Swift:sampleViewController.swift
import UIKit

class sampleViewController: UIViewController {
    
    @IBOutlet weak var sampleView: sampleHomeView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Animation()
    }
    
    
    
    func Animation() {
       UIView.animate(withDuration: 0.3,
                      delay: 0.0,
                      options: .curveEaseInOut,
                      animations: {
             self.sampleView.frame = CGRect(x: self.view.frame.minX,
                                            y: self.view.safeAreaInsets.top,
                                            width: self.sampleView.frame.width,
                                            height: self.sampleView.frame.height)
                       }
        )
    }
}
```

Animationの部分で`self.View.safeAreaInset.top`というコードを書くだけです。
safeAreaの上の部分を取得してViewを動かすことができます！

実際に動いたのがこちらです。
![スクリーンショット 2020-11-25 20.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/bddc6e85-35a8-d5c7-a8b1-432ab5f516af.png)

このようにSafeArea内にViewが動いてますね(^ ^)
以上SafeAreaのTopまでViewをアニメーションする方法でした！！
BigQueryのTPC-Hテーブルスキーマ情報

末尾に|(パイプ)が一本多いのでnullカラムを全てのテーブルで埋め合わせのために入れています。

# PART table
```
p_partkey:INTEGER,p_name:STRING,p_mfgr:STRING,p_brand:STRING,p_type:STRING,p_size:INTEGER,p_container:STRING,p_retailprice:FLOAT,p_comment:STRING,null:BYTES
```

# SUPPLIER table
```
s_suppkey:INTEGER,s_name:STRING,s_address:STRING,s_notionkey:INTEGER,s_phone:STRING,s_acctbal:FLOAT,s_comment:STRING,null:BYTES
```

# PARTSUPP table
```
ps_partkey:INTEGER,ps_suppkey:INTEGER,ps_availqty:INTEGER,ps_supplycost:FLOAT,ps_comment:STRING,null:BYTES
```

# CUSTOMER table
```
c_custkey:INTEGER,c_name:STRING,c_address:STRING,c_nationkey:INTEGER,c_phone:STRING,c_acctbal:FLOAT,c_mktsegment:STRING,c_comment:STRING,null:BYTES
```

# ORDERS table
```
o_orderkey:INTEGER,o_custkey:INTEGER,o_orderstatus:STRING,o_totalprice:FLOAT,o_orderdate:DATE,o_orderpriority:STRING,o_clerk:STRING,o_shippriority:INTEGER,o_comment:STRING,null:BYTES
```

# LINEITEM table
```
l_orderkey:INTEGER,l_partkey:INTEGER,l_suppkey:INTEGER,l_linenumber:INTEGER,l_quantity:FLOAT,l_extendedprice:FLOAT,l_discount:FLOAT,l_tax:FLOAT,l_returnflag:STRING,l_linestatus:STRING,l_shipdate:DATE,l_commitdate:DATE,l_recieptdate:DATE,l_shipinstruct:STRING,l_shipmode:STRING,l_comment:STRING,null:BYTES
```
# NATION table
```
n_nationkey:INTEGER,n_name:STRING,n_regionkey:INTEGER,n_comment:STRING,null:BYTES
```

# REGION table
```
r_regionkey:INTEGER,r_name:STRING,r_comment:STRING,null:BYTES
```

# スクリプト
```script.sh
data_folder_path="gs://tpch_benchmark/100/"
dataset=tpch_100g

tables="part supplier partsupp customer orders lineitem nation region"
part_schema=p_partkey:INTEGER,p_name:STRING,p_mfgr:STRING,p_brand:STRING,p_type:STRING,p_size:INTEGER,p_container:STRING,p_retailprice:FLOAT,p_comment:STRING,null:BYTES
supplier_schema=s_suppkey:INTEGER,s_name:STRING,s_address:STRING,s_notionkey:INTEGER,s_phone:STRING,s_acctbal:FLOAT,s_comment:STRING,null:BYTES
partsupp_schema=ps_partkey:INTEGER,ps_suppkey:INTEGER,ps_availqty:INTEGER,ps_supplycost:FLOAT,ps_comment:STRING,null:BYTES
customer_schema=c_custkey:INTEGER,c_name:STRING,c_address:STRING,c_nationkey:INTEGER,c_phone:STRING,c_acctbal:FLOAT,c_mktsegment:STRING,c_comment:STRING,null:BYTES
orders_schema=o_orderkey:INTEGER,o_custkey:INTEGER,o_orderstatus:STRING,o_totalprice:FLOAT,o_orderdate:DATE,o_orderpriority:STRING,o_clerk:STRING,o_shippriority:INTEGER,o_comment:STRING,null:BYTES
lineitem_schema=l_orderkey:INTEGER,l_partkey:INTEGER,l_suppkey:INTEGER,l_linenumber:INTEGER,l_quantity:FLOAT,l_extendedprice:FLOAT,l_discount:FLOAT,l_tax:FLOAT,l_returnflag:STRING,l_linestatus:STRING,l_shipdate:DATE,l_commitdate:DATE,l_recieptdate:DATE,l_shipinstruct:STRING,l_shipmode:STRING,l_comment:STRING,null:BYTES
nation_schema=n_nationkey:INTEGER,n_name:STRING,n_regionkey:INTEGER,n_comment:STRING,null:BYTES
region_schema=r_regionkey:INTEGER,r_name:STRING,r_comment:STRING,null:BYTES

for table in ${tables};
do
  schema_val=${table}_schema
  bq load --source_format=CSV -F '|' ${dataset}.${table} ${data_folder_path}${table}.tbl ${!schema_val}
done
```
TypeScriptを最小限の環境構築でブラウザコードとして動かす

Node.js環境でTypeScriptを手軽に動かしたければ[ts-node](https://github.com/TypeStrong/ts-node)を利用することで簡単に実現できます。
しかし、ブラウザ環境では実行前にコンパイルが必須ですし、工夫しなければ分割されたモジュールの依存を解決できません。

ブラウザ環境で何か軽い検証をしたいときにいちいちWebpackの環境構築などしていられないという人のための記事です。
TypeScriptで記述したコードを最小限の手間で最もシンプルにモジュール分割に対応したブラウザコードとして実行する方法を紹介します。

## パッケージは最小限に
最小限がテーマです。typescriptだけを導入しましょう。

```
npm init
npm install typescript --save
```

## TypeScriptの設定をする
最小限の手間がテーマです。configはテンプレートを活用しましょう。

```
npx tsc --init
```

生成されたtsconfig.jsonを下記のように変更してください。
（面倒であればコメント行を消去する必要はありません。）

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "ES5",                          
    "module": "amd",                     
    "outDir": "./dist",                        
    "strict": true,                           
    "esModuleInterop": true,                  
    "skipLibCheck": true,                     
    "forceConsistentCasingInFileNames": true  
  }
}
```
デフォルトから変更しているのは下記２項目のみです。

```                 
    "module": "amd",      // 最重要 ブラウザで実行できる形式                     
    "outDir": "./dist",   // 必須ではありませんがディレクトリ汚さないように
```


## ディレクトリ構成
必要性はありませんが、コンパイル前後のファイルがずらりとrootに並んでいると妙なミスをして無駄な時間を過ごしかねません。
最小限には整理したディレクトリ構成にします。

root/
　┣ dist/
　│　└ index.html 
　┣ src/
　│　┣ index.ts 
　│　└ util.ts 
　┣ package.json
　┣ package-lock.json
　└ tsconfig.json

## TypeScriptコードの作成
いよいよTypeScriptを書きます。
なんでも良いですが、ここではimport, exportをブラウザコードにコンパイルできていることを確認できるようなコードにします。

```typescript:util.ts
export function testFunc() {
  window.alert('testFunc');
};
```

```typescript:index.ts
import { testFunc } from './util';

(function main(){
  testFunc();
})();
```

## HTMLの作成
記述したtsのコードを実行するためのhtmlファイルを作成します。
Emmetを使えばすぐです。

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title></title>
  </head>
  <body>
    <h1>Minimum ts env</h1>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"
      data-main="./index.js"
      integrity="sha512-c3Nl8+7g4LMSTdrm621y7kf9v3SDPnhxLNhcjFJbKECVnmZHTdo+IRO05sNLTH/D3vA6u1X32ehoLC7WFVdheg=="
      crossorigin="anonymous"
    ></script>
  </body>
</html>
```
途中のscriptタグはRequireJSをCDNで読み込んでいます。
AMD形式にコンパイルされたjsであればdata-main属性に指定したファイルをエントリポイントとして依存関係を解決してくれます。

cdnjsのWebサイトでRequireJSを検索し、そこで入手したscriptタグをそのままペーストするだけです。
[cdnjs](https://cdnjs.com/)

## ビルドする
以下のコマンドでtsをコンパイルします。

```
npx tsc
```
watchしたければ-wオプションを与えてください。

## 動作確認
dist/index.htmlをブラウザで開けば動作確認ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601155/06526398-d18d-42e1-937d-6ff37191f48d.png)


## 終わりに
tscだけではnode_modulesのパスが解決ができないのでライブラリの利用には工夫が必要です。
ライブラリが使える簡易環境を作るなら[parcel](https://github.com/parcel-bundler/parcel)の活用がオススメです。
（この記事で紹介した手順とさほど変わらない手間でモジュールバンドラーを導入できます）

あくまで簡易なのでできないことは多いですが、サクッと環境作る方法を１つ知っておくだけで色々な検証がやりやすくなります。
自分なりの環境構築を１つ覚えておくと良いでしょう。
rtl-sdr その3

#概要

購入した。

#写真

![i-img600x450-1595760085rh36yn22319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2eb45421-0394-4a13-8f53-580fa13e98a1.jpeg)



#ドライバーをあてた。

windows 7 64bit

![zadig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a14dc205-6d68-00be-9740-3004c7830fb7.png)



以上。
Rails 6用のJavaScriptをRails 5.2で使う

RailsアプリケーションでRailsをバージョンアップするときには、段階的に修正しては本番サーバーを更新、ということをやっています。

- JavaScriptの修正、パッケージの更新。
- 新しいRailsでwarningが出るところを修正。
- 最後にRailsをバージョンアップ。

といった感じです。ここでは、Rails 5.2を6.0に上げる準備として、Rails 6.0で導入されたJavaScriptのパッケージを5.2アプリケーションで使ってみます。

## コピペ元の6.0アプリケーションを作っておく

5.2と6.0のコードを比較したりコピペ元として使ったりするために、6.0アプリケーションを作成します。

```zsh
% rails --version
Rails 6.0.3.4
% rails new foo --webpack=vue
```

## JavaScriptパッケージの導入

Railsがデフォルトで使うJavaScriptは、6.0からはassetsからWebpackerに移されました。次の4つです。

- @rails/actioncable
- @rails/activestorage
- @rails/ujs
- turbolinks

5.2アプリケーションで、yarn add でパッケージを追加します。

```zsh
% yarn add @rails/actioncable @rails/activestorage @rails/ujs turbolinks
```

6.0アプリケーションの app/javascript/packs/application.js から requireの 行を5.2アプリケーションの application.js にコピーします。使わないものはコピーしなくてもよいです。

```javascript:app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
```

ActionCable を使う場合は、6.0アプリケーションの app/javascript/channels 下から consumer.js と index.js もコピーします。

## assetsのJavaScriptを削除

5.2アプリケーションで、assets の application.js からWebpackerに移すものを削除します。

```diff:app/assets/javascripts/application.js
- //= require rails-ujs
- //= require activestorage
- //= require turbolinks
```

ActionCableも移す場合は、各チャンネル用の xxx.coffee ファイルをバックアップしておいてから、channelsディレクトリを削除します。

## assetsのJavaScriptを全部削除する場合

5.2アプリケーションで、JavaScriptをすべてWebpackerに移す場合は、app/assets/javascripts ディレクトリを削除します。

また、manifest.js からJavaScriptの設定を消します。

```diff:app/assets/config/manifest.js
- //= link_directory ../javascripts .js
```

Gemfile から uglifier と coffee-rails を削除して bundle install します。さようならCoffeeScript。

```diff:Gemfile
- gem 'uglifier', '>= 1.3.0'
- gem 'coffee-rails', '~> 4.2'
```

produciton.rb から uglifier の設定を消します。

```config/environments/production.rb
  # Compress JavaScripts and CSS.
  # config.assets.js_compressor = :uglifier
```

## ActionCableを移す場合

ActionCable用のJavaScriptを移す場合は、6.0アプリケーションで、rails g を使ってチャンネル用のJavaScriptのひな形を作ります。次の例では、5.2アプリケーションにuserチャンネルがあるものとします。

```zsh
% bin/rails g channel user
```

6.0アプリケーションの app/javascript/channels から user_channel.js をコピーして5.2に移します。あとは、保存しておいた user.coffee のコードを user_channel.js で動くように移植します。

## 動作確認

このやり方で、ActionCable用のJavaScriptが動くことは確認しました。Turbolinksとrails-ujsも、まあたぶん大丈夫でしょう。

ActiveStorage用のJavaScriptについては確認していません。すいません。
デザインから画像を書き出したら、なんか1pxズレる問題の対策方法

# どうも7noteです。web用に画像を書き出し保存した時に、なんか1pxズレる問題の解決法

***「横幅1000pxの画像のはずなのに、書き出すと1001pxになってしまう！」***

フォトショップで確認するとこんな感じに薄い1px分の領域ができてしまう。
![hikaku.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/633f3fc1-62a8-7275-47da-977e01a3cddb.jpeg)


## 原因は表示位置にありました。

原因は、**画像の配置されている位置が「xx.15px」のように小数点が使われているのが問題でした。**

![zureru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/1b96a91d-206f-1762-a250-ccfd81424cbf.png)

## 対策方法

X座標とY座標を整数にしてから書き出し保存することで解決できます。

![zurenai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/c6581fd3-b31a-c6f4-71e9-c01c643e8fab.png)
（私はいつも0⇒tab⇒0と入力してから書き出し保存しています。）


## まとめ

特にjpgの画像などを書き出すと、淵が1px分白っぽくなるのですが、
書き出すときに対策をすることで解決することができるので、覚えておいて損はないと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
CASE式を使って検索項目が空欄の場合に条件を無視する

#if文を使わず、SQLのCASE式でnullを無視した検索を実行する
以下のような形で検索に使用する入力項目がいくつもあった場合に、コントローラー側でif文を使って空欄時とそうでないときの場合分けをするとif/elseがずらーっと並ぶ上、同じようなメソッドをいくつも使ってコードが汚くなるので、SQLでどうにかできないかといろいろ調べてみたところ、SQLのCASE式を使えばif文を使わずに、よりスマートにコードがかけることがわかったので備忘録として残します。
![スクリーンショット 2020-11-25 20.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637360/a1530747-9ecd-9c85-a940-b6b36ae823f7.png)

```repository.java
    @Query(value = "SELECT * FROM mst_asset" 
                 + " WHERE id = CASE WHEN :id = 0 THEN id ELSE :id END" 
                 + " AND category_id = CASE WHEN :categoryId = 0 THEN category_id ELSE :categoryId END" 
                 + " AND admin_name LIKE concat('%', CASE WHEN :adminName = '' THEN admin_name ELSE :adminName END, '%')"
                 + " AND asset_name LIKE concat('%', CASE WHEN :assetName = '' THEN asset_name ELSE :assetName END, '%')" 
                 + " AND delete_flag = false ORDER BY id ASC"
                 +  , nativeQuery = true)
	List<Asset> findByIdAndCategoryIdAndAdminNameAndAssetName(
        @Param("id") Integer id,
        @Param("categoryId")Integer categoryId,
        @Param("adminName") String adminName,
        @Param("assetName") String assetName);
```
どうやら、WHERE句の[カラム名]=[カラム名]の場合には条件としてカウントしないという性質があるらしくそれを、CASE式に応用することで画面で検索キーワードが入力されなかったパラメータを無視してSQLを実行することができるらしい。
上記のコードでは、Integer型の入力欄のパラメーターに関しては空欄のままだとnullとして受け取ってしまうので、その場合はサービスの中でif文を使って0にセットしてます。String型のパラメーターに関しては、入力された際にはそれをサービスの中でトリミングしてconcatを使って部分一致検索にしてます。
月月火水木金金があるのなら日日日日日日日があってもいいんじゃない？

#そう思わない?
昔々日本では月月火水木金金という休みを返上して働くという~~いわゆるブラック企業的な悪習~~がありました。
もしその時に消されてしまった日曜日~~(土曜は知らん)~~が全部戻ってくるとしたら…私たちは何連休になるでしょうか?

#そもそも月月火水木金金って何?
もとは大日本帝国海軍で用いられたのが始まりで日露戦争勝利後も、「勝って兜の緒を締めよ」とばかりに休日返上で猛訓練を行っていました。1908年（明治41年）に津留雄三（当時海軍大尉、のち海軍大佐）が、「これでは、まるで月月火水木金金じゃないか」とふと同僚に漏らした言葉が、やがて海軍中に広まったものとされています。また戦時中には、勤務礼賛の意味で国民の間で広く使われたようです。これを元にした軍歌もあるようです。


[(Wikipedia参照)](https://ja.wikipedia.org/wiki/%E6%9C%88%E6%9C%88%E7%81%AB%E6%B0%B4%E6%9C%A8%E9%87%91%E9%87%91)

#早速調べてみるか
###(閏年を考えないver)
ってことでn年月月火水木金金をやっていたら日日日日日日日がm回来るかを調べてみましょう。

```sample.c
#include<stdio.h>
int main(){
    int year;
    scanf("%d",&year);
    int sunday=year*365/7;
    printf("日日日日日日日が%d回あります",sunday/7);
    return 0;
}
```

では実行してみましょう。

```
$ gcc -o ./a sample.c
$ ./a

1
>>日日日日日日日が7回あります
7
>>日日日日日日日が52回あります
15
>>日日日日日日日が111回あります
```

一年間のうち一週間(七日間)がいくつかあるかを調べれば無くなった日曜日の数を知ることが出来ます。その日曜日を七個づつ集めてその塊を数えれば日日日日日日日の数を知ることが出来ます。

###(閏年を考えるver)
今度は閏年も考えてやってみましょう。閏年というのは四年に一回来る2/29がある~~めんどくさい~~年です。

```sample.c
#include<stdio.h>
int main(){
    int year,start,a[2]={0,0},i=0;
    scanf("%d%d",&year,&start);
    
    while(i<year){
        if((start+i)%4==0){
            a[1]++;
        }
        else{
            a[0]++;
        }
        i++;
    }
    double sunday=(double)a[0]*365/7+(double)a[1]*366/7;
    printf("日日日日日日日が%dあります",(int)sunday/7);
    return 0;
}
```

閏年とそうでない年に分けてそれぞれの都市の日数で計算しています。
さて、結果を表示してみましょう。

```
$gcc -o ./a sample.c
$./a

1 2011
>>日日日日日日日が7回あります
1 2012
>>日日日日日日日が7回あります
7 2011
>>日日日日日日日が52回あります
7 2012
>>日日日日日日日が52回あります
15 2012
>>日日日日日日日が111回あります
15 2013
>>日日日日日日日が111回あります
```

閏年を考慮した場合でも短い期間ではほとんど違いはないことが分かりました。(ちなみに小数点以下はちょっと違う値になります。)

#まとめ
今回は月月火水木金金を何年やると日日日日日日日が何回来るかを調べました。
実際に調べてみると思ったほど多くはなくてちょっとがっくりしました…
いつから始めたかをもうちょっと詳しくしてみたり、閏秒を入れてみたりしてみてもいいですね。
HomeKit対応機器+HomeBridge+Nature Remoで家を快適にする話

* この記事は[N高等学校 (1) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/n-highschool) 4日目の記事です。

#お前は誰だ
Soukenといいます。N高1期生で2019年3月に卒業しています。
昨日担当の@KjumanEnobikto くらいしか知っている人がアドベントカレンダーにいなくて少し寂しさを感じています。

# 記事公開時点での使用機器一覧

1. Raspberry Pi 3 model A+
    2. Homebridge-Config-UI-xをインストール
3. [Phillips Hue (すべてE26、フルカラー2つ、ホワイトグラデーション1つ)](https://www.philips-hue.com/ja-jp)
4. [Nature Remo mini](https://nature.global/jp/nature-remo-mini)
5. [Nature Remo 3](https://nature.global/jp/nature-remo-3)
6. Nationalの2000年製くらいのエアコン(型番確認できず)
7. [+Style Original スマートWiFiプラグ](https://plusstyle.jp/shopping/item?id=419)

また、ホームハブとして[HomePod mini](https://www.apple.com/jp/homepod-mini/)を使用しています。


# 導入
[この記事](https://qiita.com/sskmy1024y/items/181640b20653ae595b0a)がとても参考になったのでその通りにすることをおさすめします



# 導入でつまずいた点
## その1
* センサーのRequestが多すぎてよく429エラーを吐く

Homebridge Nature Remo Sensorのドキュメントでは、"sensors"の項目はoptionalだと述べられているので、省いて１つのリクエストで3つのセンサーの値を取得しましょう。

## その2
* Homebridge Nature Remo Sensorで複数のセンサーの区別をどうしていいかわからない


"deviceName"にRemo本体の名前を入れて識別させることができます。

## その3
* ホームアプリのオートメーションでセンサーの値をトリガーにできない

"Eve for HomeKit"アプリでトリガーとして設定可能です

## その4
＊ +Style スマートWiFiプラグと同様の形のものがHomeBridgeで動かせるからそれも動かせそうだ

可能でした。 +StyleはTuyaの製品の日本版のようなのでTuya Smartアプリに製品を登録し[Homebridge Tuya](https://www.npmjs.com/package/homebridge-tuya)プラグインを導入することで制御が可能となりました。

#できたこと
1. 特定時間になったらエアコンを消してくれること
2. 温度に応じてエアコンを自動的に消してくれること
3. 日没とともに電気をつけること
4. 外から家の室温や照明の状況を見ることができること
4. (Apple WatchのAutoWakeアプリとともに使って)朝眠りが浅くなったタイミングで電気をつけてくれること

#将来的な展望
現在は自室のみHomeKit完全対応していますが、将来的には[SESAMI Smart Lock](https://jp.candyhouse.co)を買ったり家の共用部分にもHueやHomePodを置いたりしてもっとスマートにしたいところです。
この記事を書いている間に[Hue ホワイトグラデーション E17](https://www.philips-hue.com/ja-jp/p/hue-white-ambiance-1-pack-e17/8718699726270)が出たので導入してみたいです。

 * 明日は@sizumitaさんです。よろしくお願いします。
JavaScript で配列要素の特定プロパティの値を map と reduce で連結する

## サンプルコード

```js
// データ
const arr = [
  {foo: 'hello',   bar:   1},
  {foo: 'world',   bar:  20},
  {foo: 'goodbye', bar: 300}
]

// foo の文字列をつなげる
const foo_list = arr.map(x => x.foo).reduce((acc, cur) => acc + ', ' + cur)
console.log(`foo_list = ${foo_list}`)

// bar の値を足す
const bar_total = arr.map(x => x.bar).reduce((acc, cur) => acc + cur)
console.log(`bar_total = ${bar_total}`)
```

実行結果の例 (Node.js v14.15.1 を使用)。

```
foo_list = hello, world, goodbye
bar_total = 321
```

## 参考資料

[Array\.prototype\.map\(\) \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

> map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。

[Array\.prototype\.reduce\(\) \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)

> reduce() メソッドは、配列の各要素に対して (引数で与えられた) reducer 関数を実行して、単一の出力値を生成します。