OmniAICreator/Qiita-1.07M huggingface dataset:
【Databricks】基本的な使い方とCSVのインポート、SQLでの操作までのまとめ

こんにちは！
今回、Databricksを利用することになったのですが、いろいろ機能があるので、自分が直近使う範囲でまとめてみようかと思います。

この記事では、基本的な機能やCSVをNotebookから操作する等を行います。
連投する記事ではモデルの作成等も行う予定です。

## 各タブの機能について
Databricksを開くとサイドバーにいくつかのタブがあります。
現行バージョンの上から順に説明します。

### Databricks Data Science & Engineering
今回利用するDatabricks Data Science & Engineeringについてです。
こちらは、ApacheSparkに基づく分析プラットフォームとされています。
Notebookを利用した共同作業等が可能になっています。

### Create
Notebook,Table,Cluster,Jobを作成することができます。
これらについては以降の項目で触れることになるので割愛します。


### Workspace
workspaceではディレクトリ構造でNotebookなどの作業ファイルを管理することができます。
先ほどのCreateで作成するNotebookはこのWorkspaceのいずれかに配置することになります。


### Repos
Gitからリポジトリを複製して持ってこれます。
`sys.path.append("/Workspace/Repos/<user-name>/<repo-name>")`
のようにすることで、Notebookから参照することもできるようです。


### Recents
最新の変更点等が確認できます。


### Seach
Workspace内を検索できます。


### Data
CSVやDBなどのデータを保存する部分になります。
上述したTableを作成する際はこの中に作成することになります。
Data内ではDBとファイルで管理するタブが分かれています。
ファイルはディレクトリ構造で管理することができ、簡単にNoteBookから参照することができます。

### Compute
少し前までClusterというタブだったものです。
Clusterの作成や管理を行えます。
上述したClusterを作成するとここに追加されることになります。


### Job
定期実行したりする場合はこのJobを使うことになります。
上述したJobを作成するとここに追加されることになります。


基本的な操作については以上です。
では実際にCSVデータを用意して読み込んでみます。

## CSVファイルのUpload
localに適当なCSVファイルを用意してください。
DataタブのDBFSからUploadを選択し、任意のディレクトリにファイルをUploadします。
今回は`/FileStore/testdata/test.csv`とします。
これでCSVは登録完了です。
では、このデータをNotebookから触ってみたいと思います。


## Clusterの作成
まずはNotebookで利用するClusterを作成しましょう。
Computeタブから`Create Cluster`を選択し、あたらしくクラスターを作成します。
クラスター名はtestClusterにしました。
ClusterModeはSingleNode、Runtimeは9.1LSTです。
Terminate…の項目では、利用していない時間がxx分経過したときに自動で停止してくれる設定です。
今回は30分にしました。
WorkertypeはStanderd_F4にしています。



## Notebookの作成
Worckspaceを開き、任意の階層で右クリックすることでCreateのメニューが出てきます。
そこからNotebookを選び、作成します。
名称はtestbookとし、デフォルト言語をPythonにしました。
Clusterには先ほど作成したものを選択しましょう。


## CSVのインポート確認
それでは、CSVが取得できるか確認してみましょう。
pandasが標準で入っているのでこれを利用してデータを表示してみようと思います。
まず、Clusterを開始する必要があります。こちらはComputeタブから特定のClusterを開いて実行することで確認できます。

```python:notebook
import pandas as pd

print(pd.read_csv("/dbfs/FileStore/testdata/test.csv"))
```

こちらを実行するとファイルの中身が表示されると思います。

今回はSQLで操作できるように、一旦Tableに保存したいと思います。

```python:notebook
from pyspark.sql.types import *

inputDF = spark.read.format("csv")\
.options(header="true", inferSchema="true")\
.load("/FileStore/testdata/test.csv") # FileStoreからでいいので注意


inputDF.createOrReplaceTempView('csvloadtest')
csvloadtest = inputDF
```
inputDF =…の部分で先ほどのCSVを読込み、createOrReplaceTempViewによって`csvloadtest`という名前で一時Viewを作成します。
これによりクエリでデータを確認することができます。
実際にSQL文でデータを見てみたいと思います。

```sql:notebook
%sql
SELECT * FROM csvloadtest
```

実行すると表が出てくると思います。
実行セル左下のグラフアイコンを押下することでグラフでの表示も可能です。
どの形式のグラフで表示するかも設定可能です。
PlotOptionではグラフで表示するデータを変更可能です。
Excelチックなので結構わかりやすいと思います。


##まとめ
今回はDatabricksにCSVデータをアップロードし、SQLでの操作確認まで行ってみました。
目標としてはモデルの作成までを理解したいので、次回はそちらを行っていこうかと思います。
Yellowfinの表からチェックボックスでカラムの表示非表示を切り替える



![ベスト表示.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/9f4499ea-eb8b-3f44-6c74-5283cdc09a4d.gif)
#はじめに
ドリルスルー先のレポート上で、予め決めたカラムの表示非表示をチェックボックスで切り替えたいというご要望があったため、実現できるか試してみた記録です。
結論からいうとGifで動いている通り実現できましたが、レポートを保存するたびに要素のクラス名が変更になるのでなかなか面倒くさい感じです。
※2021/11/29追記
要素のクラス名が変更になる部分はJSチャート機能のoptionオブジェクトにレポートIDが入っていたためクリアできました！

また、JavaScriptチャートの機能を使い強引にチェックボックスを実装し、JqueryでCSSの変更をしています。

#要素のクラス名の取得
![youso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/dac2f23e-76d5-f7db-3124-09d8e3a25d9f.png)
デベロッパーツールで対象の列にしかないクラス名を探します。
このAthletes1列の場合はrpt113475~~2の部分です。ヘッダーの部分、表の中の白い数字の部分、小計の部分と3パターンのクラス名が存在しました。
 ~~レポートを更新すると、このrpt******の部分が更新されるため新しくした場合は忘れずに変更してください。~~ 


#JSチャートタブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/09446bbd-ccfe-7d92-b2a9-dafb42de4ea9.png)
JavascriptタブのHtml作成部分に強引にJavaScriptを+でつないで書いていきます。
もっといい方法があればいいのですが・・・・
今回のソースはこちらです。チェックボックスの状態を取得してshow()hide()で切り替えをしています。

```javascript:display.js
//generateChart は必須の関数であり、Javascriptグラフの作成において呼び出しされます
generateChart = function(options) {

   // これはお使いのブラウザのデバッガのブレークポイントのトリガとなるため、Javascriptをデバッグすることができます
   //debugger;
   var reportid = options.reportAPI.reportId;

   // グラフを描画する部分です
   var $chartDrawDiv = $(options.divSelector);
   $chartDrawDiv.html(
            'ベスト表示<input type="checkbox" id="chkbox" name="chkbox">'+
            '<script>'+
            '$(function() {'+
                "$('#chkbox').click(function() {"+
                    "if ( $(this).prop('checked') ) {"+
                        '$(".rpt'+reportid+'hdrf2").hide();'+
                        '$(".rpt'+reportid+'f2").hide();'+
                        '$(".rpt'+reportid+'ttlf2").hide();'+
                    "} else {"+
                        '$(".rpt'+reportid+'hdrf2").show();'+
                        '$(".rpt'+reportid+'f2").show();'+
                        '$(".rpt'+reportid+'ttlf2").show();'+
                    "}"+
                "});"+
            "});"+
            '</script>'
    );
};


```

#さいごに
 ~~製品の仕様で更新した場合に要素クラスの再取得が必要になるなど面倒な部分はありますが、~~ 長いレポートでサマリー列だけ表示させる場合などにはレポート単位でも使えるしいいんじゃないかなと思います。
もちろん1列だけじゃなくて何列か一気に表示非表示を切り替えることができるので、そうなるとかなりスッキリしますねー。
また、JavaScriptチャートに色々仕込むことによって考え方によってはさらにできることが増えるんじゃないかなと思います。
【図解解説】JOI2021-2022 一次予選 第3回 問題4 ボールの移動

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1c-t4.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1c/tasks/joi2022_yo1c_d

## 図解解説
今年度の一次予選のD問題は、以下の５つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる
３．条件分岐（if）を正しく利用できる
４．繰り返し処理を正しく利用できる
５．配列（リスト）を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/5c664eab-9f7f-1e9a-a40f-a18dd7da99a5.png)
箱とボールのどちらを基準にして操作を行うか、入力例１を使ってシミュレーションしてみます。

箱を基準に考えてみると、箱の中にボールが１個も入っていない状況や、箱の中にボールがたくさん入っている状況が発生します。特定のボールがどの箱の中に入っていて、次にどの箱に動かせばいいのか…と考えるのも大変です。

一方、ボールを基準に考えてみると、今、ボールがどの箱の中に入っているのか管理するだけで済みます。変更の発生するところだけ変更すれば済みます。
従って、今回は、ボールを基準にして管理する方法でプログラムを行うことにします。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/d64a4dc9-9b21-801c-dcf3-c67c3f5944e8.png)
そこで、Ballという配列を用意して、その配列の要素の中に箱の番号を入れて状態を管理します。

配列は、要素番号0から始まります。もし、配列の要素数をボールの数と一致させると、箱とボールの番号も0に読み替えて管理する必要があります。0から管理しなくてもすむように、配列の要素数を「ボールの数+1」にして、箱とボールの番号をそのまま使用すると便利です。

## 解答例

```d.py
N,M = map(int,input().split())
#ボールがどの箱に入っているか管理するための配列Ballを宣言し、初期値(ボールの番号=箱の番号)を代入
Ball = []
for i in range(N+1):
  Ball.append(i)
#ボールXが箱Yに移動する操作をM回実行
for i in range(M):
  X,Y = map(int,input().split())
  Ball[X]=Y
#最終的にどの箱に入っているかボール1からボールNまで順番に出力
for i in range(1,N+1):
  print(Ball[i])
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27494039)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
【エラー】【Windowsの人は要注意】npm run watchが動かないときの解決方法

脱gulpにむけて、npm-scriptsに移行中に、参考にしたコードを正確に書いたにも関わらずにうまく動かない。
ファイルの更新を監視するwatchを走らせた際に、なぜかエラーが発生する。

結論から言うと、
**OSがWindowsの人は、シングルクーテーション「'」ではうまく機能しません！！
package.jsonの書き換える必要があります**

#参考にしたwatchは以下の書き方

```cmd:package.json
"scripts"：{ 
  "watch:server": "browser-sync start --server dist --files 'dist, **/*.html, !node_modules/**/*'",
  "watch:css": "watch 'npm run css' ./src/sass",
  "watch:js": "watch 'npm run js' ./src/js",
  "watch": "npm-run-all -p watch:*"
},
```

##npm run watchをした場合の、エラー内容
```cmd:terminal
$npm run watch

> Watching run
> Watching css'      
> Watching ./src/sass
C:\Users\...\node_modules\watch\main.js:73
    if (err) throw err;
             ^

[Error: ENOENT: no such file or directory, stat 'C:\Users\\...\\run'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'C:\\Users\\...\\run'
}

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! sample@1.0.0 watch:css: `watch 'npm run css' ./src/sass`
npm ERR! Exit status 1
npm ERR!
npm ERR!npm Failed at the study@1.0.0 watch:css script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
 ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! sample@1.0.0 watch:js: `watch 'npm run js' ./src/js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the sample@1.0.0 watch:js script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.


```
同じようにWatching ./src/jsもエラーがかえってきます。



##どこが動いていないのか探る
browser-syncを指定したwatch:serverを個別にrunすると、ちゃんとブラウザがたちあがります。watchそのものが動いていないのではないようです。
`npm run css`で指定したscssコンパイルも、`npm run js`でjs圧縮も個別にrunするとちゃんと動きます。
npm-run-allで指定したコマンドですべてを動かすと、動きません。
ということで、

```cmd:package.json
  "watch:css": "watch 'npm run css' ./src/sass",
  "watch:js": "watch 'npm run js' ./src/js",
```
この記述に問題がありそうです。

##GitHubのissueに記述発見！
[GitHub / npm watch#109](https://github.com/mikeal/watch/issues/109)

https://github.com/mikeal/watch/issues/109


こちらによると、
windowsの人は、シングルクオーテーションの部分を以下のように書き換えます。

```cmd:package.json
  "watch:css": "watch \"npm run css\" ./src/sass",
  "watch:js": "watch \"npm run js\" ./src/js",
```

###Windowsの人は、文字列を\でエスケープが必要です！



無事、記述したnpm scriptsが動くようになりました。
ぜひ、Windowsでエラーが起こった人は上記をためしてみてください。

#参考
https://hibi-update.org/javascript/npm-scripts/

https://github.com/mikeal/watch/issues/109
【そのまま提出OK】C++でAtCoderの入力をファイルから受け取れるようにするためのメモ



先日からAtCoderで競プロを始めたのですが、入力を毎回ターミナルに手打ちするのが非常にめんどくさくて、ファイルから受け取れるようにしたのでそのメモです。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
  // この部分を追加. input.txtをプログラムのファイルと同じ階層に準備しておく
  ifstream in("input.txt");
  if (in.is_open())
  {
    cin.rdbuf(in.rdbuf());
  }

  // 以下に回答の処理を書く
}
```

という感じで非常に簡単にできました。
あとはAtCoderのサイトからinput.txtにコピペして、プログラムを実行するだけです。

ファイルの存在確認をしているので、一応本番提出もそのままできます。
ただ、問題によっては予期せぬ挙動をするかもしれないので、本番提出は削除しておいた方が無難です。


## 追記
上記のようなことしなくても、以下のようにリダイレクトするだけでいいですね。
```
$ your_code.out < input.txt
```
【図解解説】JOI2021-2022 一次予選 第3回 問題1 身長

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1c-t1.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1c/tasks/joi2022_yo1c_a

## 図解解説
今年度の一次予選のA問題は、以下の２つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/da8ea9b4-935e-6089-65fb-8b7e187135fc.png)
図のように具体的な数値をあてはめて考えると、理解が進みます。特に入力例は、さまざまなパターンを網羅していますので、正しくプログラミングできているか確認するには最適です。困ったときは入力例を参考にして、考えてみてください。

## 解答例
図解の中に赤字で記述した通りです。

```a.py
A = int(input())
B = int(input())
print(B-A)
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27480333)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
rails 個人的 初学者におすすめな記事

# はじめに
今回は僕がrails初学者の時に（いまでも）よく参考にしていた記事を紹介します。
ぜひrails初学者のみなさんも参考にしてください！超おすすめです！

プログラミングする時はあらゆる記事を自分で探して試して問題を解決していくことが大事ですし、それが当たり前の作業です。
ですが、この世の中には自分よがりなコードや初心者にはわかりにくいコードを紹介している記事も多くあって、そう言った記事を参考にしていると混乱してしまうこともあります。
だからこそ、初めのうちは信頼できる記事を参考にすることが大切なのです。

ちなみに今回はうっす〜い内容です。
では見ていきましょう！

# 用語やコードの意味を調べたい時
https://pikawaka.com/

こちらのサイトはプログラミングの用語をめちゃめちゃわかりやすく説明してくれています。

例えば、「`params`ってなんや？」「データを扱うメソッド（`where`とか`find`とか）ってどうやって使うの？てかそもそもなんやねん！」ってことありませんか？
そんな時にこのPikawakaさんではめちゃめちゃわかりやすく説明してくれています！

さらに調べたものの関連した内容も記載してくれている時もあるので必要としていた以上の知識が得られます！

# 特定の機能を調べたい時
https://techtechmedia.com/

こちらのサイトはrailsのいろいろな機能などに関してわかりやすく説明してくれています。もともとプログラミングの講師をやっていた方が作っているので非常にわかりやすいです。

例えば、「SNS認証ってどうやるんやろ？」「非同期通信のいいね機能を実装したい！」といったような際に便利です！
こちらのサイトは実際に実装できるコードとともに説明してくれているのでほとんどコピペしちゃえば実装できます。
よくある、「記事通りにやったねんけどエラーなったなあ〜」っていうのが今のところ全くないです！


# 最後に
僕はとにかくこの二つのサイトに助けられました！
おそらくこれからもちょくちょくお世話になるとは思います。それくらい信頼しています！
この記事を見ていただいたみなさんもぜひこれらのサイトを見てみてください！
世界変わります！:point_up:
LottieアニメーションをJetpack Composeで使用する

Jetpack Compose自体もUIのアニメーションはシンプルに実装できるフレームワークですが、Lottieを使うとより高度なアニメーションをデザイナー主導でリッチに表現することが手軽にできるようになります。

LottieはJetpack Composeにも対応しており、Jetpack Composeで組み立てているUIの中に簡単にLottieアニメーションを組み込むことができます。

まず、app/build.gradleにLottieの依存を追加します。

```gradle
dependencies {
    implementation "com.airbnb.android:lottie-compose:4.2.1"
}
```

そして、`src/main/res/raw/`ディレクトリがなければ作成して、その中にLottieのJSONファイルを入れます。この記事ではこのファイルを`my_lottie_file.json`だとして扱います。

あとは、Lottieアニメーションを配置したい場所に`LottieAnimation`Composableを入れるだけです。

```kotlin
@Composable
fun MyUi() {
    val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.my_lottie_file))
    LottieAnimation(
        composition = composition,
        iterations = LottieConstants.IterateForever,
    )
}
```

公式のリリースノートにいくつかの使い方の例が載っています。

https://github.com/airbnb/lottie-android/releases/tag/compose-1.0.0-rc01-1

上で紹介したコードはアニメーションを自動で開始して無限に繰り返しますが、一度だけアニメーションを再生したい場合は`iterations`を省略（デフォルト値の1を使用）すれば良いですし、もっと細かくアニメーションを制御したかったら`animateLottieCompositionAsState`を使うと良いみたいです。
コーディング初心者にVSCodeをおススメしたい

VSCodeを他人に勧める際に、いちいち口頭で説明することに飽きたので、こちらの記事にVSCodeの主な機能と紹介をまとめました。この記事のURLを貼るだけで、高機能エディタの基本的な機能について理解してもらえるような記事を目指しています。

この記事は、以下の方々を対象にしています

- 高機能エディターやIDE(統合開発環境)を使ったことがない方
- VSCodeを入れてみたけど、どんな機能があるのかわからないという方
- VSCode以外を使っていて、VSCodeへの乗り換えを検討している方

## VSCode (Visual Studio Code) とは

VSCode (Visual Studio Code) は、エンジニア業界で最も人気のある高機能エディタの一つです。初心者はとりあえずこれを選んでおけばいいかなという印象です。

高機能エディタは IDE (統合開発環境) とは違って、はじめは ただのメモ帳+最低限の機能 しかありません。様々な状況や言語に対応した拡張機能がオープンソースで開発されているので、開発に必要な分だけ自分で導入することで個々人にマッチする開発環境を提供してくれます。また、他のエディタに比べて豊富な拡張機能とインストールの手軽さが魅力です。「こんな機能があったらいいな...」と思った時に、調べてみると大体あります。

以下のサイトよりダウンロードとインストールができます。

https://code.visualstudio.com/

## 主な機能

### 1. 拡張機能

導入方法は、左側のタブからExtensionsを選択すると検索スペースが出てくるので、検索してインストールボタンを押すだけです。
それぞれの言語に対応した拡張機能が存在し、環境構築やPath設定などを行うと、ワンボタンでファイルをVSCode上で実行することもできるようになります。


### 2. フォルダ管理
エクスプローラーを開くことで，フォルダツリーを確認することができます。また、選択したファイルを画面上でドラッグすることで、画面を分割して同時に複数ファイルを閲覧・編集することができます。

### 3. 入力補助
一度、入力した単語は基本的にすべてタイピングする必要がありません。予測変換が行われるので、選択することでスペルミスなどを防ぐことができます。ユーザーの入力傾向を学習しておススメしてくれます。

### 4. ハイライト
言語に応じた拡張機能をインストールすることで、構文に応じたハイライトを行ってくれます。使っていない関数の色が自動で薄くなったり、文章だけでなく空白や括弧を色付けしてくれる拡張機能があったりします。

### 5. キーボードショートカット
VSCodeには、様々なショートカットキーが存在します。例えば、単語を選択した状態でCtrl+Dを押すと、同じ単語を選択してくれるので、変数名の変更などに役立ちます。

Windowsで`Ctrl`+`Shift`+`P` (Mac版は`Command`+`Shift`+`P`) からコマンドパレットを開き、`Preferences: Open Keyboard Shortcuts`を入力・選択するとショートカットを変更することもできます。

### 6. 設定のカスタマイズ
こちらも同様に、Windowsで`Ctrl`+`Shift`+`P` (Mac版は`Command`+`Shift`+`P`) からコマンドパレットを開き、`Preferences: Open Settings (JSON)`を入力・選択すると設定を変更することができます。

### 7. ワークスペース
上側のタブで `File` > `Save Workspace As...`からワークスペースを保存できます。このファイルを Desktop などに専用フォルダを作って格納し、このファイルから VSCode を起動することで、複数のプロジェクトに対して作業を途中から再開することができることができるようになります。

## 終わりに
この記事では紹介しきれない程、VSCodeは多彩で様々な機能があります。使っているユーザーが多く、`VSCode + 検索ワード`で Google 検索すると大概の内容がまとめられているので、積極的に調べて活用してください。
HTMLの画面サイズの扱い

# これは何？
ツールなどをちゃちゃっと作って公開するときにモバイル対応してないとちょっと残念。その対策のメモです。
簡単に言うと、viewportをJavaScriptで制御する、またはCSSでなんとかする方法です。

# 実装
## CSSで何とかする
`div.content`をスクリーンのサイズで動的に変えるのがポイント。

```html
<!DOCTYPE html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" id="meta_viewport">
    <style>
     /* smaller than */
     @media only screen and (max-width: 400px) {
       body {
         margin: 0px;
       }
       div.content {
         width: 100%;
       }
     }
     /* larger than */
     @media only screen and (min-width: 400px) {
       div.content {
         width: 200px;
       }
     }
     body {
       background: #e2e1e0;
       text-align: center;
       font-family: arial;
       display: flex;
       flex-direction: column;
       align-items: center;
     }
     div.content {
       background: #fff;
       display: flex;
       flex-direction: column;
       justify-content: center;
       align-items: center;
       border: 1px solid #ddd;
       border-radius: 5px;
       height: 200px;
     }
    </style>
  </head>
  <body>
    <div class="content">
      Hello!
    </div>
  </body>
</html>
```

## viewportで何とかする
`window.onresize`のEventでviewportを動的に更新。JavaScript内の「content_width」に`div.content`の`width`に`margin`を考慮するのがポイント。

```html
<!DOCTYPE html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" id="meta_viewport">
    <style>
     body {
       background: #e2e1e0;
       text-align: center;
       font-family: arial;
       display: flex;
       flex-direction: column;
       align-items: center;
     }
     div.content {
       background: #fff;
       display: flex;
       flex-direction: column;
       justify-content: center;
       align-items: center;
       border: 1px solid #ddd;
       border-radius: 5px;
       height: 200px;
       width: 200px;
     }
    </style>
  </head>
  <body>
    <div class="content">
      Hello!
    </div>
    <script>
     const adjust_content_width = () => {
       const s_width = window.outerWidth
       const content_width = 220
       const meta_vp = document.querySelector('meta#meta_viewport')
       const content_scale = s_width/content_width < 1 ? Math.floor(100 * s_width/content_width)/100 : 1.0
       meta_vp.setAttribute('content',`width=${s_width}, initial-scale=${content_scale}, maximum-scale=${content_scale}`)
     }
     window.onload = adjust_content_width
     window.onresize = adjust_content_width
    </script>
  </body>
</html>
```


# Reference
- [もう逃げない。HTMLのviewportをちゃんと理解する - Qiita](https://qiita.com/ryounagaoka/items/045b2808a5ed43f96607)
C#を使用してPowerPointドキュメントに数式を追加する方法

#C#を使用してPowerPointドキュメントに数式を追加する方法

##背景

今回の記事でC#を通してPowerPointのスライドにLatex数式を追加しようと思います。追加する前に、先ずはスライドの中でshape形状を挿入しなければならないなければいけません、図形の段落で、***Paragraphs.AddParagraphFromLatexMathCode（stringlatexMathCode）***というメソッドを使用して数式を記述し、最後に保存します。

##Dll参照

今回は、PowerPointライブラリ***[Spire.Presentation for.NET](https://www.e-iceblue.com/Download/download-presentation-for-net-now.html)***バージョン6.9.2を使用し、VSプログラムにSpire.Presentation.dllへの参照を追加します。参照方法は二つがあります。
1　***[Spire.Presentation for.NET](https://www.e-iceblue.com/Download/download-presentation-for-net-now.html)***のパッケージをローカルにダウンロードして解凍し、Binフォルダー内のdllをVSに参照します
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3f3eb479-505a-05cf-cfb0-a9bb85886721.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/c8eb4452-740c-fed9-58f4-5e8b6fc7e923.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/45a12cbf-7a69-5e7d-3d60-62f00061ca6e.png)
2　***[NuGet](https://www.nuget.org/packages/Spire.Presentation/)***検索しダウンロードしてVSプログラムへのインストールします
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3d1db709-5ae0-10e3-041f-2cc96478bda0.png)

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/eba18a3c-b6ce-43dc-24f2-389e8f732e22.png)


##コード一覧
```
using Spire.Presentation;
using Spire.Presentation.Drawing;
using System.Drawing;

namespace AddFormula
{
    class Program
    {
        static void Main(string[] args)
        {
            //Presentation文書を作成し最初のスライドを取得する
            Presentation ppt = new Presentation();
            ISlide slide = ppt.Slides[0];

            //スライドに形状を追加する
            IAutoShape shape = slide.Shapes.AppendShape(ShapeType.Rectangle, new RectangleF(30, 100, 400, 30));
            shape.Fill.FillType = FillFormatType.None;
            shape.ShapeStyle.LineColor.Color = Color.White;
            shape.TextFrame.Paragraphs.Clear();

            //数式を追加する
            string latexMathCode = @"$ f(x,y)=\sqrt[n]{{x^2}{y^3}}$";
            shape.TextFrame.Paragraphs.AddParagraphFromLatexMathCode(latexMathCode);

            //文書を保存する
            ppt.SaveToFile("AddLatexMathCode.pptx", FileFormat.Pptx2013);
            System.Diagnostics.Process.Start("AddLatexMathCode.pptx");
        }
    }
}
```

数式を追加した結果は以下のとおりです：
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/695b57d8-2c07-698e-4b5f-20b51193e7cf.png)

##API
コードに含まれるクラス（Presentationなど）とインターフェイス（ISlide、IAutoShapeなど）の関連する説明と使用方法については、[Spire.Presentation Namespace](https://www.e-iceblue.com/apireference/net/Spire.Presentation/html/N_Spire_Presentation.htm)まで確認ことができます。
以上です、最後まで読んでいただきありがとうございます。
ふざけんなFireBase!!!


<h3>FireBaseすごすぎる</h3>
業務外で、アプリを開発したいフロントエンドエンジニアは、まずfirebaseを使うのが一番効率よく、アプリ開発ができるという情報を聞いて、実践してみることに。

確かに、バックエンドの知識がなくても、わかりやすい公式ドキュメントに従っていけば、バックエンドとのやり取りが容易にできる！！？

バックエンドエンジニア不要論まで謳われるようになったこの技術。すごすぎる。

ただ問題なのは、最近バージョンアップしたことである。書き方が、だいぶ変わり、qiita の記事をコピペしても、大体 ver8 の記事なので、動きません。公式ドキュメントを参考にしながら実装すれば問題はないのですが。

<h3>ふざけているポイント</h3>

問題は画像を扱うデータベースである storage。

数字や文字列を保存できる cloudfirebase には

![rapture_20211126120626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782673/3fc563d2-a8c7-dc7a-5416-7d10057f5018.png)

このように version ごとにサンプルが載っている。

<strong>しかし！！！</strong>

storage には

![rapture_20211126120900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782673/5698c186-a5d0-4bb3-efdd-0efcf946b83f.png)

書き方が一通りしか載っていない。この書き方が ver8 の書き方であり、普通に firebase をインストールした人は最新版がインストールされるため、当然動かない。

<strong>せめて、古いバージョンの書き方であることを記載しといてくれ！！！</strong>

では、新しいバージョンの書き方はどこに乗っているのかというと、言語を英語表記にすると出てくる。こちらには親切に ver8,ver9 の書き方が書いてある。

これくらい早く翻訳してくれよ。。
WebREPLをローカル環境に立てる方法

# はじめに
WebREPLはWiFi経由でブラウザから使用できるMicroPythonのREPL（Read-Eval-Print Loop）です．
便利なツールですが，検索エンジンで普通に調べてアクセスすると以下のページに飛びます．
![スクリーンショット 2021-11-26 112851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/5ddf4da1-ac61-7ea8-f1b3-1b428e745fba.png)
ピンク色のバナーに書いてある文を見てみると，httpsではアクセスできないからhttpのリンクを踏んでくれとのことです．しかしながら一度httpsで始まるリンクを踏むとhttpのリンクにアクセスしてもHSTSによってhttpsのリンクにリダイレクトされてしまいます．そこで，バナーにも書いてありますがGitHubからWebREPLをローカル環境にダウンロードすることで使用可能になります．

# WebREPL
> 便宜上、WebREPL クライアントは http://micropython.org/webrepl でホストされてい ます。また、GitHubリポジトリ https://github.com/micropython/webrepl からローカルにインストールすることもできます。

公式ドキュメントにも書かれているように，GitHubに公開されているのでローカル環境にインストールすることが可能になっています．

それでは早速実装してみましょう．

# 環境
ローカルといいながらVMにApache2を入れて公開ディレクトリに置いてみました．

VM : Ubuntu 18.04.6 LTS
Server : Apache 2.4.29 (Ubuntu)

# インストール
Apache2の場合，`/var/www/html/`の配下に適当にディレクトリを作って`git clone`コマンドでクローンすればインストールできます．

```
mkdir /var/www/html/esp32
```

WebREPLのリポジトリ（ https://github.com/micropython/webrepl ）を作ったディレクトリの配下に複製します．

```
git clone https://github.com/micropython/webrepl.git /var/www/html/esp32
```

無事`git clone`ができたらwebrepl.htmlとその他必要なファイルが`/var/www/html/esp32`の配下にあることを確認します．

```
hoge@huga:~$ ls /var/www/html/esp32/
FileSaver.js  LICENSE  README.md  term.js  webrepl_cli.py  webrepl.html  websocket_helper.py
```

Apache2が起動していれば，ブラウザから http://VMのIPアドレス/esp32/webrepl.html にアクセスできます．

![スクリーンショット 2021-11-23 105710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/dab9cc6d-aaee-cff7-a051-743125fa6b3e.png)
プロトタイプ変数

# PropTypes

varやletより厳密な変数宣言、プロトタイプ変数が存在します。
数値や文字列しか格納できなくすることで仕様理解や潜在的なエラー発見が可能になります。

|型          | 宣言方法    |
|:-----------|:----------------|
| 数値　　　　| PropTypes.number|
| 文字列　　　| PropTypes.string| 
| 論理値　　　| PropTypes.bool  |
| 配列　　　　| PropTypes.array |
| 関数　　　　| PropTypes.func  |
| オブジェクト| PropTypes.object|


###使用例

```React:PropTypes
import PropTypes from 'prop-types';

class MyComponent extends React.Component {
  render() {
    // This must be exactly one element or it will warn.
    const i = this.props.number;
    return (
      <div>{i}</div> //数値以外が格納されるとエラー
    );
  }
}

introduction.propTypes = {
  number: PropTypes.number
}
```
vue-fontawesomeのスタイルがcontent-security-policyにより適用されない問題

# 問題

とある PaaS で Vue.js のアプリを作っていたところ Font Awesome で描いたアイコン(SVG)だけ妙に巨大化する現象に遭遇しました。

調べてみたところ、index.html に自動的に content-security-policy header が付加されていました。
index.html にあらかじめ記述されている link 要素や style 要素には自動的に nonce 属性が付加されており読み込まれていたのですが、vue-fontawesome が動的に組み込む style 要素には nonce 属性が付かないため、読み込まれていないのが原因でした。

# 解決方法

vue-fontawesome には動的に CSS を適用するのをキャンセルするオプション `autoAddCss` がありました。

## 環境

+ vue 3.2.21
+ @fortawesome/vue-fontawesome 3.0.0-5

```typescript:main.ts
import { createApp } from 'vue'
import App from '@/App.vue'
import store from '@/store'
import router from '@/router'
import '@/font-awesome' // Font Awesome 関連は font-awesome.ts に移す
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

createApp(App)
  .use(store)
  .use(router)
  .component('font-awesome-icon', FontAwesomeIcon)
  .mount('#app')
```

```typescript:font-awesome.ts
import { config, library } from '@fortawesome/fontawesome-svg-core'
import { faCheck, faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons'

// 以下の2行がポイント
import '@fortawesome/fontawesome-svg-core/styles.css'
config.autoAddCss = false

library.add(faCheck, faChevronLeft, faChevronRight)

```

`config.autoAddCss = false` で CSS の自動挿入を無効化して、import で CSS を自力で読み込むことで、最初から index.html に style 属性として追加された状態になります。
neosでlogix その4

# 概要

niosでlogixやってみる。
hello worldやってみた。

# 写真

![hello.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/47ff2db0-28c1-25ba-8096-6f4f9f53b091.jpeg)


# 手順

- インベントリのEssential Tools->LogiXTipをダブルクリック
- escでインベントリを消す。
- LogiXTipをクリックして装着する
- tを押して、メニューから、LogiX Nodesを表示する
- inputをダブルクリック、stringをダブルクリック
- 何も無いところで、ダブルクリック、板がでる。
- クリックして、Hello worldをキーイン
- この板の右にある茶色からグラブすると、茶色の線が伸びます
- 伸ばした後、rを押すと板がでる。

以上。
Db2でJSONデータを扱う

# はじめに
Db2では、バージョン11.1.4.4からSQL による JSON データとの対話を向上させる新規の組み込みの JSON SQL 関数一式が提供されています。
それにより、SQL を使用して JSON データを直接保管および検索することができるようになりました。

使用方法を以下に記載します。

なお、環境としては、IBM Cloud上のマネージドのDB2サービスで確認しています。
IBM CloudではLite Planという、クレジットカードの登録なしで、無料で使用できる環境がありますので、お気軽にお試しください。

参考資料：IBM Db2 マニュアル
[JSON ドキュメントへの SQL アクセス](https://www.ibm.com/docs/ja/db2/11.5?topic=json-sql-access-documents)

## 1. テーブル定義
ここでは以下のような社員情報を格納することを想定します。
EMPOLYEEIDとNAMEは通常のデータで、PROFILE欄にJSONデータを格納します。

| EMPLOYEEID | NAME | PROFILE |
| :---: | :---: | :--- |
| 100 | Tom | {hobby: "baseball", license: "driver"} |
| 101 | Ken | {hobby: "football"} |
| 101 | Jhon | {license: "CPA"} |

JSONデータを格納する列PROFILEはBlob型で定義します。

```
CERATE TABLE EMPLOYEES (
	EMPLOYEEID integer primary key not null,
	NAME varchar(10) not null,
	PROFILE Blob(1000)
);
```

## 2. レコード登録
JSONデータを格納する際は、SYSTOOLSスキーマのJSON2BSON関数をつかって格納します。

```
INSERT INTO TESTJSON VALUES (100, "Tom", SYSTOOLS.JSON2BSON('{hobby: "baseball", license: "driver"}'));
```

## 3. レコード検索
取り出すときは、SYSTOOLSスキーマのBSON2JSON関数をつかって取り出します。

```
SELECT EMPLOYEEID, NAME, SYSTOOLS.BSON2JSON(PROFILE) as PROFILE FROM EMPLOYEES;
```

JSONの中身を条件に抽出したい場合は、JSON_VAL関数を使用します。

```
(例)JSONのhobbyキーにbaseballが入っている人を抽出
SELECT EMPLOYEEID, NAME, SYSTOOLS.BSON2JSON(PROFILE) as PROFILE FROM EMPLOYEES WHERE SYSTOOLS.JSON_VAL(PROFILE, 'hobby','s:20') = 'baseball';
```

※JSON_VALの引数には、JSONが入っている列名、検索するJSONのキー、戻り値の型（例の's:20'は最大20文字の文字列として返すという意味です。）を指定します。

## 4. レコード更新
JSONの中身を更新した場合はUPDATE分で、JSONの値を変更しないキーも含めて、すべての情報のJSONデータで上書きします。

```
(例) Tomのホビーを、tennisに書き換える
UPDATE EMPLOYEES SET PROFILE = SYSTOOLS.JSON2BSON('{hobby: "tennis", license: "driver"}') WHERE NAME = 'Tom';
```
Harmoware-VIS はじめに

# はじめに
Harmoware-VISについては別記事「[Harmoware-VISの紹介](https://qiita.com/ucl_Harmoware_VIS/items/e861e0f651ffde647b6a)」をご覧ください。

# インストール
### 準備
node.js v16 インストール
Mapboxのaccesstoken取得 ⇒ [Mapbox.com](https://docs.mapbox.com/help/getting-started/access-tokens/)

### npm install

```command.
npm install harmoware-vis
```

### Github install & Run the software

```command.
git clone https://github.com/Harmoware/Harmoware-VIS
cd Harmoware-VIS
npm install
# example visualize-sample
npm run visualize-sample
```

# Harmoware-VISの使用方法

基本的に以下のようなコードがベースになります。
rootコンテナは「harmoware-vis.Container」を継承します。
rootコンテナを「harmoware-vis.connectToHarmowareVis」でconnectしexport defaultします。
標示するレイヤーは「harmoware-vis.HarmoVisLayers」の「layers」で指定します。

```app.js
import React from 'react';
import { Container, connectToHarmowareVis, HarmoVisLayers, MovesLayer, MovesInput } from 'harmoware-vis';
const MAPBOX_TOKEN = 'XXXXXXXXXX'; //Mapboxのaccesstoken

class App extends Container {
  render() {
    const { actions, viewport, movedData } = this.props;
    const optionVisible = false;

    return (
      <div>
        <div className="harmovis_controller">
          <ul >
            <li><MovesInput actions={actions} /></li>
          </ul>
        </div>
        <div className="harmovis_area">
          <HarmoVisLayers
            viewport={viewport} actions={actions} mapboxApiAccessToken={MAPBOX_TOKEN}
            layers={[ new MovesLayer({ movedData, actions, optionVisible })]}
          />
        </div>
      </div>
    );
  }}
export default connectToHarmowareVis(App);
```

v1.8.14以降では以下のようなhooks記述も可能です。
```app.js
const App = (props)=>{
  const { actions, viewport, movedData } = props;
  const optionVisible = false;

  return (
    <Container {...props}>
      <div className="harmovis_controller">
        <ul >
          <li><MovesInput actions={actions} /></li>
        </ul>
      </div>
      <div className="harmovis_area">
        <HarmoVisLayers
          viewport={viewport} actions={actions} mapboxApiAccessToken={MAPBOX_TOKEN}
          layers={[ new MovesLayer({ movedData, actions, optionVisible })]}
        />
      </div>
    </Container>
  )
}
```

```index.js
import { render } from 'react-dom';
import { getConfigureStore } from 'harmoware-vis';
import { Provider } from 'react-redux';
import React from 'react';
import App from './app';
import 'harmoware-vis/scss/harmoware.scss';
const store = getConfigureStore();
render(
  <Provider store={store}><App /></Provider>,
  document.getElementById('app')
);
```

```index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <div id="app"></div>
  <script src="./bundle.js"></script>
</body>
</html>
```

上記サンプルと同等のデモアプリをgithubに上げてありますので参考にしてください。
https://github.com/Harmoware/Harmoware-VIS-Demo

# APIリファレンス
Harmoware-VISのAPIリファレンスについては別記事「[Harmoware-VIS APIリファレンス](https://qiita.com/ucl_Harmoware_VIS/items/ea97c5e0e112a3d0ecca)」をご覧ください。
Nodeのfsモジュールでjsonを条件分けして出力する

##やりたいこと
・jsonを条件別に分割して出力したい。

##やったこと
・node.jsのfsモジュールを使う。
・今回はJsonPlaceholderのuser情報を一部変更して使用する。

data/users.json

```json
[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "New York",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": {
        "lat": "-43.9509",
        "lng": "-34.4618"
      }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "email": "Nathan@yesenia.net",
    "address": {
      "street": "Douglas Extension",
      "suite": "Suite 847",
      "city": "New York",
      "zipcode": "59590-4157",
      "geo": {
        "lat": "-68.6102",
        "lng": "-47.0653"
      }
    },
    "phone": "1-463-123-4447",
    "website": "ramiro.info",
    "company": {
      "name": "Romaguera-Jacobson",
      "catchPhrase": "Face to face bifurcated interface",
      "bs": "e-enable strategic applications"
    }
  }
]
```


scripts/splitUsers.js

```js
const fs = require('fs');
const users = require('../data/users.json');

const fn = () => {
  const NewYorker = users.filter(user => {
    if (user.address.city === 'New York') {
      return true
    }
  })
  fs.writeFile('../public/json/NewYork.json', JSON.stringify(NewYorker), err => {
    if (err) console.log(err)
    else console.log('success')
  })
}
fn()
```

・fs.writeFileの第一引数で格納するデータの入った出力ファイルのパスを指定する。
・第二引数は、string | Buffer | TypeArray | DataView | Object のいずれかの型になる。
・jsonを指定したいときは、JSON.stringify()で文字列(string)型にする必要がある。

このようにすると、public/jsonの配下に条件別に分割されたjsonとして、NewYork.jsonを作成することができる。

実行の際は、実行ファイルのあるディレクトリに移動し、

```
node 実行ファイル名
```
で実行する。


##参考
・https://www.notion.so/Node-fs-3383f45c2cc34f26a04631254f7039cf#fdb261edcd934c95bdac72bd9e2ef70d
・https://www.notion.so/Node-fs-3383f45c2cc34f26a04631254f7039cf#1ad568abc03f49ef9260d2f31c28b2ca
・https://www.notion.so/Node-fs-3383f45c2cc34f26a04631254f7039cf#c8cd52db90464bf0b15d521e7aaf64c5
rails Googlemapエラー集

# はじめに
こんにちは。
とあるスクールで長めにメンターやってたもんです。
プログラミングってほんのちょっとの間違いでエラーになっちゃうから初心者の人は辛いですよね〜
今回は生徒さんのwebアプリ開発でようでる、Mapがでない・うまく表示されない問題がよくあるので、今後のメンターさんや生徒さんがちょっとでも楽になりますように。

※注意：エラーやうまいこといかんのを自分で解決する楽しさは奪いたくないのでほんまに無理な時に見てください。
# 開発環境でのエラー
### 1.そもそも地図が表示されるはず部分のスペースがない
これはhtml・cssでのミスがあると考えられます。
例えば、
2. cssの書き忘れ
3. id名あるいはclass名とセレクタ名が一致していない

これらが多いかと思います。

### 2.マップを表示するためのスペースはあるがマップは表示されず空白になっている。
こちらすごく多いです。なので原因もたくさんあります。
考えられる限りの原因を記していきますね。
1. id名とgetElemmentByIdの名前が一致していない。
2. .envファイルへの記述が間違っている。（そもそも.envファイルを使ってない人はデプロイする前に大事なものは.envファイルに転記しときましょう）
3. geocoder. rbの記述が間違っている。とくにAPIを書く部分。
4. scriptタグ内の記述ミス（ここはJSを書いたことのない人にはむずかしいかも）。
とくによく見るのは、カッコの閉じ忘れやmarkerやinfowindowの部分。
5. データの受け渡しミス。（緯度、経度から住所を出す場合など）

### 3.マップはでているが、「このページではGoogleマップが正しく読み込まれませんでした。」というメッセージがでていてマップが正しく表示できない。
この場合の原因は基本的に一つです。
GCPでクレジットカードの登録ができていないことが原因のほとんどです。
なのでGCPにクレジットカードの登録をしましょう！
その際、APIの割り当てをお金がかからないところに設定しときましょう！そうすればお金をとられることはありません。
# herokuデプロイ中・後のエラー
VarnishでのHTTP→HTTPSへの固定(HTTPS Only）

###本項はLumen Edge Application DeliveryでのVarnishについての記述です
https://lumen-28.hubspotpagebuilder.com/lumen-technologies-japan/lumen-edge-cloud-app-delivery


#HTTP→HTTPSへの固定(HTTPS Only）

この場合は以下のリライトを設定します

```ruby:VCLv4
sub vcl_recv {
  if (req.http.X-Forwarded-Proto !~ "https") {
    return (synth(850, "Moved Permanently"));
  }
}

sub vcl_synth {
  if(resp.status == 850) {
    set resp.http.Location = "https://" + req.http.host + req.url;
    set resp.status = 301;
    return(deliver);
  }
}

sub vcl_hash {
  hash_data(req.http.X-Forwarded-Proto);
}
```
【備忘録】既存のプログラム(プロジェクト)をGitHubにプッシュする方法

# はじめに
ローカルで作成していたプログラムをGitHubにプッシュする機会が多かったため個人的備忘録として手順を書いていきます．

# 環境
OS \: Windows 10
git \: Git for Windows 2.29.1
ターミナル \: windowsターミナル
コードエディタ \: VSCode

# 手順
## .gitignoreの作成
GitHubにプッシュしたくないファイルやフォルダを.gitignoreファイルに記述します．

VSCode上で.gitignoreファイルを作成して記述します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/ceb4c52e-ea8b-3087-8a2d-11228fec59c7.png)
プロジェクトに合わせた.gitignoreテンプレートを作成してくれるものもあるみたいですね．

## ローカルリポジトリの作成
プッシュしたいプロジェクトのフォルダで右クリック→windowsターミナルで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/3de20a4a-3204-c6de-7db0-f68f19af2d81.png)

以下のコマンドを実行してローカルリポジトリを作成

```:コマンド
git init
```

```:実行結果
Initialized empty Git repository in プロジェクトのディレクトリ/.git/
```

状態を確認する．
フォルダ内の.gitignoreで指定したファイル以外が表示されていればOK

```:コマンド
git status
```

```:実行結果
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        Procfile
        README.md
        babel.config.js
        package-lock.json
        package.json
        public/
        server.js
        src/
        vue.config.js
```

addする

```:コマンド
git add .
```

commitする

```:コマンド
git commit -m "first commit"
```

```:実行結果
[main (root-commit) b9bb5fa] first commit
 14 files changed, 27644 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Procfile
 create mode 100644 README.md
 create mode 100644 babel.config.js
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 public/favicon.ico
 create mode 100644 public/index.html
 create mode 100644 server.js
 create mode 100644 src/App.vue
 create mode 100644 src/assets/logo.png
 create mode 100644 src/components/HelloWorld.vue
 create mode 100644 src/main.js
 create mode 100644 vue.config.js
```

これでローカル側の準備はいったん終わりです．

## GitHubにレポジトリを作成し，プッシュする
GitHubのページの右上の＋ボタンをクリックしてNew repositoryをクリックする．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/6551617b-2197-b442-c24d-a705482341b4.png)
レポジトリ名，ライセンス等を決めてCreate repositoryをクリックしてレポジトリを作成する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/1de98584-ceac-248f-4640-11f870335afc.png)
or push an existing repository from the command lineと書かれた部分のコマンドを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/cf416a4b-8c99-96e5-bfc7-a942563df6e8.png)

```:コマンド
git remote add origin git@github.com:アカウント名/レポジトリ名.git
```
```:コマンド
git branch -M main
```
```:コマンド
git push -u origin main
```
```:実行結果
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 8 threads
Compressing objects: 100% (17/17), done.
Writing objects: 100% (20/20), 257.40 KiB | 3.63 MiB/s, done.
Total 20 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:Suguru677/test.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
```

レポジトリのページを更新してプッシュされていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249868/a04a87d5-4eec-c611-3c0a-47bf8b5dc3e5.png)
Varnish複数オリジン利用時のヘルスチェック

###本項はLumen Edge Application DeliveryでのVarnishについての記述です
https://lumen-28.hubspotpagebuilder.com/lumen-technologies-japan/lumen-edge-cloud-app-delivery

#ヘルスチェック(Health checks)
複数のオリジンサーバを用いて冗長化構成を取る際、CloudfrontなどではOrigin Connection Attemptsというリトライ回数指定条件がありますが、Varnishではヘルくチェックを用いて判断を行います：


```ruby:VCL
backend server1 {
    .host = "server1.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

backend server2 {
    .host = "server2.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}
```

上記の場合
.url = "/";　TOPディレクトリに対してポーリング(GET)を行う
.timeout = 1s;　タイムアウトは1秒
.interval = 5s;　5秒おきにオリジン側にヘルスチェック

そして下記が発動条件となります

.window = 5;　5回のポーリングGETのうち
.threshold = 3;　3回OKであればサーバは活動中とする、それ以下であればNG

という事になります。


次に‘director’設定を行い死活監視NGとなった場合にはトラフィックを送らないという設定を行います:

```ruby:VCL
sub vcl_init {
    new vdir = directors.round_robin();
    vdir.add_backend(server1);
    vdir.add_backend(server2);
}
```

Varnishでは上記すべてのサーバがDOWNしている場合はGrace modeやKeepと合わせて、現在持ち合わせているキャッシュコンテンツでレスポンスを続けることが可能です。
DjangoのJSONfieldのエラー：(fields.E180) SQLite does not support JSONFields.

環境
OS: Windows10
Python: 3.9.5
Django: 3.2.8

## エラーが起きた状況
Djangoのmodels.pyにて、JSONを扱いたかったので、

```python:models.py
class Hoge(models.Model):
    hogefield = models.JSONField()
```

として、
ファイルの変更後、例によって、

```
python manage.py makemigrations
python manage.py migrate
```

としたら、

```
hogeapp.Hoge: (fields.E180) SQLite does not support JSONFields
```

と表示された。

## 原因
「JSON1 extension」が有効でないことが原因。

(公式にも書いてあるけど)「JSON1 extension」が有効になっているかどうかは

```
プロジェクトディレクトリ>python manage.py shell
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> cursor = conn.cursor()
>>> cursor.execute('SELECT JSON(\'{"a": "b"}\')')
```
を実行してみればわかる。
→何もエラーが出なければ有効
→エラーが出たら有効になっていない。


## 解決策

「原因」セクションでの確認用コードでエラーが起きるか確認してみて、エラーの場合は[公式](https://code.djangoproject.com/wiki/JSON1Extension)通りに解決する。

当たり前のことだが、Linux, macOS, Windowsで対処法が違うので注意。
ちなみに、pythonのバージョンが3.9以降ならエラーは起きないとのこと。


## 参考
https://code.djangoproject.com/wiki/JSON1Extension
https://stackoverflow.com/questions/62637458/django-3-1-fields-e180-sqlite-does-not-support-jsonfields
TeXのlistingsでVSCode風にソースコードを出力してみた

# 環境

### PC，OS
次にPCとOS環境を示す．

- PC
    - M1 MacBook Air
- OS
    - Big Sur

### TeXのバージョン

[Paperist/texlive-ja](https://github.com/Paperist/texlive-ja):latestをDockerでインストール.

### TeX実行環境について

後日，別途記事で投稿予定．

# VSCode風に表示

次にVSCode風に表示した一例を示す．
オプションの設定については，コメントに示す．
色はVSCodeからカラーコードを読み取り，0~1に変換した．

```Latex:main.tex
\documentclass[a4j,uplatex,dvipdfmx]{jsarticle}
...
...(省略)
...
% ソースコード
\usepackage{listings,plistings}
\usepackage{color}  % 色
\newcommand{\lstlistingnameref}[1]{\textbf{Source Code.\ref{#1}}}   % ソースコード参照
\renewcommand{\lstlistingname}{\textbf{Source Code.}}    % ソースコードキャプション
\lstset{
    language=Scilab,    % 言語設定
    frame=single,       % 枠設定
    breaklines=true,    % 行が長くなった場合自動改行
    breakindent=10pt,   % 自動改行時のインデント
    columns=fixed,      % 文字の間隔を統一
    basewidth=0.5em,    % 文字の横のサイズを小さく
    numbers=left,       % 行数の位置
    numberstyle={\scriptsize \color{black}},  % 行数のフォント
    stepnumber=1,       % 行数の増間
    numbersep=1zw,      % 行数の余白
    xrightmargin=0zw,   % 左の余白
    xleftmargin=2zw,    % 右の余白
    keepspaces=true,    % スペースを省略せず保持
    lineskip=-0.2ex,    % 枠線の途切れ防止
    tabsize = 4,        % タブ数
    showstringspaces=false,  %文字列中の半角スペースを表示させない
    %%%%% style & color %%%%%
    backgroundcolor={\color[gray]{0.1}},   %背景色
    basicstyle={\small\ttfamily \color{white}}, % 基礎の文字のフォントを設定
    identifierstyle={\small\ttfamily \color[rgb]{0.611, 0.862, 0.996}},% 変数名のフォントを設定
    commentstyle={\small \color[rgb]{0.415, 0.600, 0.333}},        % コメントのフォントを設定
    morekeywords=[1]{  % 予約語の追加
        read_csv,
        strtod,
        \%inf,
        \%pi,
        cov,
        cell,
        cat,
    },
    morekeywords=[2]{  % 関数名の登録
        bayes_train,
        bayes_valid,
        get_class_range,
        init_data,
    }, 
    keywordstyle=[1]{\small\bfseries \color[rgb]{0.768, 0.521, 0.749}}, % 予約語のフォントを設定
    keywordstyle=[2]{\small\bfseries \color[rgb]{0.862, 0.862, 0.666}}, % 関数名のフォントを設定
    stringstyle={\small\ttfamily \color[rgb]{0.8, 0.5, 0.3}},   % 文字列
    %%%%% style %%%%%
}
```

あとは，次のようにプログラムファイルを読み込むことで色付けされる．

```latex:sample.tex
\lstinputlisting[caption=2次元正規分布に基づいたベイズ識別器, label=code_bayes_func]{code/bayes_func.sce}
```

# 出力結果

![スクリーンショット 2021-11-26 11.17.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472474/8b84ab19-f126-dd31-2a06-837361cc1fec.png)

![スクリーンショット 2021-11-26 11.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472474/81db227f-fd82-3cab-c314-22523184369c.png)

# 参考にした記事

## plistings

日本語対応にするために，[plistings](https://github.com/h-kitagawa/plistings/blob/master/LICENSE)をmain.texと同じディレクトリに移動させる．

## 文字を等間隔に

次の記事を参考にした．
↓
[TeXにソースコードを等幅フォントで"ちゃんと"載せる](https://qiita.com/s417-lama/items/565167b40c28099abb04).

## 枠線の途切れ

次の記事を参考にした．

[listingsで枠線が途切れる問題](https://pnf.hatenablog.com/entry/2015/07/20/200615)
neosでlogix その3

# 概要

neosでlogixやってみる。
スクリーンショット、撮ってみた。

# スクリーンショット
![neos0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6830a2fa-4edc-2415-565d-46b38f9c0aa5.jpeg)


# 手順

shift + prt sc
ペイントを開いて、貼り付け、保存。

以上。
UbuntuとsambaでLogtechMusicServer

SqueezeBox Radioが新しいバージョンのLMSでうまく動かなかったので旧版をUbuntuに入れる備忘録です。

#####インストールの流れ
１．Ubuntu20.04LTS
２．[LogitechMediaServer_v7.9.2](https://downloads.slimdevices.com/LogitechMediaServer_v7.9.2/
)
３．共有フォルダの作成
４．samba
５．設定 -> /etc/samba/smb.conf

#####１．Ubuntu20.04LTSをインストールします。
インストールの段階でSSHを通しておく。


```shell
$ sudo apt update
$ sudo apt upgrade
```

####２．LogitechMediaServer_v7.9.2のインストール
```shell
$ mkdir ~/download
$ cd ~/download
$ wget https://downloads.slimdevices.com/LogitechMediaServer_v7.9.2/logitechmediaserver_7.9.2_all.deb
#インストール -> 依存関係エラーがでます
$ sudo dpkg -i logitechmediaserver_7.9.2_all.deb
#依存関係エラーの解決
$ sudo apt --fix-broken install
#再度インストールコマンド
$ sudo dpkg -i logitechmediaserver_7.9.2_all.deb
```

####３．共有フォルダの作成
```shell
$ sudo mkdir /home/Public
$ sudo mkdir /home/Public/Music
$ sudo mkdir /home/Public/Playlist
$ sudo chmod 777 -R /home/Public
```

####４．sambaのインストール
`参考`
[Ubuntu 20.04 でファイルサーバー（NAS）を作ろう！](https://beightlyouch.com/blog/programming/ubuntu-fileserver-nas/#toc1)

```shell
$ sudo apt -y install samba
$ sudo vi /etc/samba/smb.conf
```

####５．smb.confの設定

```shell:/etc/samba/smb.conf
#[global]に追記
[global]
   dos charset = CP932
   unix charset = UTF-8
#必要なら変更
   workgroup = WORKGROUP
#変更
   interfaces = 192.168.0.0/24 eth0 #LANの設定に合わせる -> ここでハマった
#コメントアウト解除
   bind interfaces only = yes
   map to guest = Bad User
#末尾に追記
[Public]
   create mask = 0777
   directory mask = 0777
   guest ok = Yes
   guest only = Yes
   path = /home/Public
   read only = No
```

```shell:smb.confの構文チェック
$ testparm
```

####６．sambaの実行
```shell
$ sudo systemctl restart smbd nmbd
#起動時に自動実行
$ sudo systemctl enable smbd nmbd
```

####７．Windowsからsambaにアクセス
\\ホスト名\Publicにエクスプローラーからアクセス

####８．ブラウザからLMSにアクセス
ホスト名:9000

####９．sambaへの接続状況の確認
```shell
$ smbstatus -b
```

####１０．Windows10でsambaに接続できない時
`１．SMB1.0を有効にする`
    -> スタート右クリック -> アプリと機能 -> プログラムと機能 -> smb1.0有効
`２．レジストリの確認と変更` -> 認証なしの接続を無効にするアップデートがあった
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
名前：AllowInsecureGuestAuth -> `0`になっている場合、`1`に変更

####１１．LMSおまけ
[らじこらじるこプラグイン](https://github.com/t-yoshi/RadiRuKo-Plugin)


お疲れさまでした
Power QueryでExcelファイルを読み込む（その１）

Power QueryはExcel 2016から標準搭載されている「データの取得と変換」機能のことです。数式や関数を使わず、メニューから機能を選んでいくだけでデータの取得と変換を自動化することができます。

今回は、Power QueryでExcelファイルを読み込む方法を紹介していきます。

# 環境

- Microsoft® Excel® for Microsoft 365 MSO(バージョン 2110 ビルド 16.0.14527.20270) 64 ビット 
- Windows 10 pro

バージョンが違う場合、メニューや操作が異なる場合があります。

## Excelファイルを読み込む
まずは、基本の読み込み方です。

Excelの上部メニューバーの「データ」から
データの取得　→　ファイルから　→　ブックから　と選択
ファイル選択画面が表示されるので、読み込みたいExcelファイルを選択

![Screenshot 2021-11-26 10.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/a595c754-3957-c23b-c21e-f906343d965b.png)

ナビゲーター画面の左側の一覧から読み込みたいシートを選択します。右側にプレビューで内容を確認し、下部の「データの変換ボタン」を押します。「読み込み」ボタンの方を押すと、Excelシートにすぐ読み込まれますが、「データの変換」の方を押して、内容を確認してから読み込むようにしましょう。

![Screenshot 2021-11-26 10.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/2cdcb1d4-8b73-62a2-0e3e-cad4039a0be8.png)

## PowerQueryエディタの構成
Power Queryエディタが開きます。データが読み込まれ、一行目が項目名として認識されていることがわかります。
- 画面上：データ整形・変換のためのメニューが並んでいます。
- 画面左：読み込んだデータ（クエリ）の一覧です。「クエリ」は「照会」「質問」といった意味です。データベースへの処理要求の意味で使われます。
- 画面中：読み込まれたデータのプレビューが表示されます。
- 画面右：クエリの名前と、データ整形・変換のステップが表示されています。ステップを選択することで、そのステップでのデータが、画面中央にプレビューされます。クエリの名前は、分かりやすいものに変更して置きましょう。

![Screenshot 2021-11-26 10.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/a2cfc020-4bbc-9591-ca9e-b6123b13a384.png)


## 型の変更
PowerQueryエディタのプレビューの項目名の左に表示されているアイコン（ABCやカレンダーマークなど）は、その項目が数値なのか、文字なのかといった「型」が表示されます。自動的に判定されることが多いのですが、判定に誤りがあると変換がうまくできないことがあるので、よく確認しましょう。

型のアイコンをクリックすると、型を変更することができます。よく使うのは、以下のとおりです。
「１０進数」は小数を含む数値に使います。
「テキスト」は文字列の場合に使います。数値や日付も扱えますが、文字として扱うので、数値計算に使用できません。
- １０進数
- 整数
- 日付/時刻（日付、時刻も）
- テキスト


![Screenshot 2021-11-26 11.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/6bdba05b-39ce-8726-b155-983484bf3a0f.png)


## シートへの読み込み
型が正しく設定できていることを確認したら、PowerQueryエディタの左上の「閉じて読み込む」を押し、以下の画像のように読み込まれれば成功です。

![Screenshot 2021-11-26 11.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/11a3a01d-2822-1c54-d3be-569da99a239f.png)

基本の読み込み方は以上です。次回は、複数のファイルを一度に読み込む方法を紹介します。
gitのpullでデプロイをする開発環境でhookを作ると便利だった

特に開発環境だが、pullだけでデプロイが事足りるSTG環境とかで
「いつ最終更新をしたか知りたい」と言われて、pullするたびにバージョン情報を書いていくの面倒だなーと思ったら
hook作ったら楽だったのでメモ。

# git hooksとは
gitコマンドを実行時に特定のスクリプトを実行する仕組み。
クローンしたそれぞれの環境で設定できます。

例えば、pushしたとき、mergeしたとき、commitする直前とかいろいろなタイミングで実行できます。

# 今回はpull時
pullした時に、pullした時間をメモしたかったので以下のようなファイルを作って運用しました。

## 作ったファイル
```
~/src/XXX/.git/hooks/post-merge
```
このpost-mergeというファイルを作ると中のスクリプトをmergeした直後に実行してくれる。
pullはfetchとmergeなのでこれが実行されます。
実行権限がないと実行されないので注意。

```
chmod 755 ~/src/XXX/.git/hooks/post-merge
```

## 中身
こんなスクリプトです。

```
echo `date +"%Y-%m-%d %H:%M:%S"` >> ~/dokoka/document_root/version.html
echo "<br>" >> ~/dokoka/document_root/version.html
```

するとpullするたびにversion.htmlが更新されるのでURLからアクセス出来て便利ですね。
google colab をセクシーにする方法

#1.はじめに
　最近見た [google colab](https://colab.research.google.com/drive/10z-pNKRnVNsp0Lq9tH1J_XPZ7CBC_uHm?usp=sharing) にこんなGIFが入っていて、とても**セクシー**だった（個人的な見解です🤣）ので、やり方を調べてみました。

![Teaser](https://raw.githubusercontent.com/PeterL1n/RobustVideoMatting/master/documentation/image/teaser.gif)

#2.やり方
　　google colab の**テキスト**に、**github 上にあるGIFのパス**を下記のように指定します。名前は何でもOKです。

![スクリーンショット 2021-11-26 9.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/ae467e75-79b1-fc54-78ef-c16dddd1681b.png)


具体例で言うと、**github 上にあるGIFのパス**が下記のようであれば

```
https://github.com/PeterL1n/RobustVideoMatting/blob/master/documentation/image/teaser.gif
```

リンクの指定をして、github.com を **raw.githubusercontent.com** に置き換え、**blob** を削除すれば良いです

```
![Teaser](https://raw.githubusercontent.com/PeterL1n/RobustVideoMatting/master/documentation/image/teaser.gif)

```
とても簡単！