OmniAICreator/Qiita-1.07M huggingface dataset:
VBScriptとMS Office(Word)でPDFをdocx形式に変換する

Microsoft WordでPDFを読み込むと、編集可能な形式に変換することが可能です。また、変換結果も再現性が高く比較的優秀ですので、コンバーターとしての利用にも有効です。

しかし、Wordにはバッチ処理に対応した変換機能はありませんので、１つ１つファイルを読み込んで変換していくことになりますが、非常に面倒ですのでVBScriptによる自動化で対応することにします。

以下のコードでは、指定されたパス（フォルダ）上に存在するPDFファイルをdocx形式に一括で変換を行います。


```
Option Explicit
 
 
' -----------------------------------------------------------------
' 変数定義
' -----------------------------------------------------------------
Dim oWordApp
Dim oWordDoc
Dim oFso
Dim oFolder
Dim oShell
Dim arrPath
Dim file
Dim strFile
Dim strFileBaseName
 
' -----------------------------------------------------------------
' 初期設定
' -----------------------------------------------------------------
Set oFso = WScript.CreateObject("Scripting.FileSystemObject")
Set oShell = WScript.CreateObject("WScript.Shell")
 
redim arrPath(2)
 
' PDFファイルの保存先フォルダパス
arrPath(0) = "PDFファイルがあるフォルダのパス"
arrPath(1) = "docxの出力先とするフォルダのパス"
 
' -----------------------------------------------------------------
' 処理 pdf -> docx
' -----------------------------------------------------------------
Set oWordApp = WScript.CreateObject("Word.Application")
oWordApp.Visible = true
oWordApp.DisplayAlerts = false
 
Set oFolder = oFso.getFolder(arrPath(i, 0))
for each file in oFolder.files
    ' ファイル名のセット
    strFile = cStr(file)
    strFileBaseName = oFso.getBaseName(strFile)
 
 
    ' Wordを開く
    Set oWordDoc = oWordApp.Documents.Open(strFile)
 
    ' docxで保存
    oWordDoc.SaveAs2 arrPath(i, 1) & "/" & strFileBaseName & ".docx"
 
    ' Wordを閉じる
    oWordDoc.Close
    Set oWordDoc = Nothing
next
 
oWordApp.DisplayAlerts = true
oWordApp.Quit
set oWordApp = Nothing
```
Libre Office の日本語化の方法

Libre Officeの日本語化の手順を書き残します．
今回使用するのはLibre Office calc．
私は主にcalcで旅行の予定などを組みます．
まぁ，便利なので使っているだけですね．

バージョンは以下の写真を参照して下さい．
![Screenshot at 2021-09-07 14-23-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872362/09a3154b-f7f9-29f6-7bf9-5ef55b88582e.png)

##じゃあやっていくよ(その1)

最初に以下の記事を参考に行いました．
[LibreOfficeの日本語化について](https://office-hack.com/office/libreoffice-japanese/)

画面上部の[tool]→[option]→[language]→[user interfaces]
の順番下がっていき，設定していきます．
ここで問題が発生．
[user interface]のプルダウンに日本語Japaneseが現れ無いのです．
localeはjapaneseになっているのに，UIは英語ってそんなアホな...

文字だけだと淡白な説明になってしまいますが，詳しくは上のリンク先を見て下さい．
あぁ，なるほどね！ってなると思うので．

##なぜプルダウンに出てこない？
大体こーゆーときは日本語の拡張パックみたいなものが無いのが大半．
それかインスコしたが内部で認識できていない．
その2択なので，まずはaptitudeコマンドで探してみる．

```
$aptitude search libreoffice-l10n-ja
p   libreoffice-l10n-ja  - オフィス作業環境スイート -- 日本語パッケージ 

$aptitude search libreoffice-help-ja
p   libreoffice-help-ja  - オフィス作業環境スイート -- 日本語ヘルプ 


```
aptitudeでsearchした際に，先頭が"i"だとインストールされています．
今回は"p"なのでインストールされてませんね．
はい，じゃあインストールしましょうね．
念の為，apt-get updateしときましょう．

```
$ sudo apt-get update
$ sudo apt-get install libreoffice-l10n-ja libreoffice-help-ja -y
```

インストール終わりましたか？
インストール終わったら，まずはofficeを開いている場合は全て閉じます．
そしてofficeを開き直して下さい．

※本体の再起動は必要ないと思います．
※再起動したほうがベストかと思います．
Vue3でprovide/injectを使用しているときのVue Test Utilsでのテストの書き方

# 結論

* Vue Test Utils 2 では`global`オプションを使ってprovideするよ

# v2 の provide/inject に関する変更

## 変更点

* `provide`オプション → 廃止
* `global`オプション → 追加

v1ではマウンティングオプションの`provide`を使用していた。
しかし、v2では`provide`オプションがなくなり、代わりに`global`オプションが用意された。

## 新しいprovide方法

Before

```js
const wrapper = mount(Component, {
  provide: {
    Theme: 'dark'
  }
})
```

After

```js
const wrapper = mount(Component, {
  global: {
    provide: {
      Theme: 'dark'
    }
  }
})
```

詳しいことは ↓ を参照

https://next.vue-test-utils.vuejs.org/api/#global-provide

https://next.vue-test-utils.vuejs.org/migration/#no-more-createlocalvue
UniRxの使い方を間違い、フリーズを発生させてしまった

# はじめに
初歩的なミスをしてしまったので、再び発生させないようにするためにも備忘録を残します。

制作しているアプリで一定時間メインスレッドが止まり表示が更新されないフリーズが特定条件で発生していました。

原因を調査するためにプロファイラーを見ていたところ、GarbageCollectionで大きな山が😱
![Screen Shot 2021-09-07 at 15.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/ef294335-52d7-43aa-d8e8-7c13a7a118cb.png)


# GCが発生した箇所
プロファイラーの詳細を見ると、ObservableDestroyTrigger.OnDestroyで発生していました。

コードを調べてみると、IObservableのSubscribe時に呼び出すAddTo()が原因でした。

# 問題となったコード
実際のコードは載せられないので、近い挙動をするコードになります。

```csharp
using System;
using UniRx;
using UnityEngine;

public class Sample : MonoBehaviour {
    private Subject<Unit> _apiSubject = new Subject<Unit>();
    private Subject<Unit> _subject = new Subject<Unit>();
    
    void Start() {
        // ApiReceive時の想定
        _apiSubject.StartWith(Unit.Default).Subscribe(_ => {
            UpdateSubject();
        }).AddTo(this);

        // Apiの複数回投げたときの想定
        for (int i = 0; i < 26000; i++) {
            _apiSubject.OnNext(Unit.Default);
        }
    }

    void UpdateSubject() {
        _subject.Subscribe(_ => {
            Debug.Log("DoSomething");
        }).AddTo(this);
    }

    void Update() {
        if (Input.GetKeyDown(KeyCode.D)) {
            Destroy(gameObject);
        }
    }
}

```

実際のコードが、Apiであるデータのレスポンスが返ってきたときに対象の処理を再購読するというものでしたので、上記のようなコードになっています。

(実際のコードではこれほど大量にNextを発行していませんが、実際起った挙動を再現するためにこのようにしています)

ちなみにこちらのコードでGameObjectがDestroyされたときに、2.52GBのGC Allocが働いています。

## なぜAddToが必要か
購読とオブジェクトを紐付けないと、オブジェクトが破棄されても購読が残り処理が走ってしまいます。

今回のコードは同じクラス内で生成したSubjectに対して購読しているので、AddTo()がなくても問題ありませんが、
クラスを跨いだときに問題が出るのでAddToを呼び出す癖をつけておいた方が良いです。

# 実際の挙動
フリーズが分かり易いように、アニメーションしているキューブを表示しています。

![GCOccur.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/7777eb34-cdef-3a22-3695-33147626e99c.gif)

Dキーを押した時に、GameObjectがDestroyされるときにフリーズが発生しています。

# 何が問題だったか
こちらの処理に問題があります。

```csharp
    void UpdateSubject() {
        _subject.Subscribe(_ => {
            Debug.Log("DoSomething");
        }).AddTo(this);
    }
```

再び購読する際に、前回購読していたものを破棄していないのでどんどん購読が積まれて行ってしまいます。

# 正しいコード
```csharp
    private IDisposable _disposable = null;
    void UpdateSubject() {
        _disposable?.Dispose();
        _disposable = _subject.Subscribe(_ => {
            Debug.Log("DoSomething");
        }).AddTo(this);
    }
```

再購読時、上記のように前回のものを破棄してから購読させます。

?はnull条件演算子で、オブジェクトがnullの場合は関数が呼ばれません。
以下と同じ処理になります。

```csharp
        if (_disposable != null) {
            _disposable.Dispose();
        }
```

# 最後に
普段、再購読するときは前回購読したものを破棄すると気をつけてはいましたが、今回はミスで正しくないコードになっていました。

ちょっとしたミスが分かりづらい不具合を生んでしまいます。

今回のミスのおかげで、GCが大量に走ってしまうパターンを発見することができました。

今回紹介した内容は初歩的なミスですが、これからはAddToに同じオブジェクトを大量に指定しないように気をつけなければいけませんね。
vistaでquartus その56

#概要

vistaでquartusやってみた。
ws2812を光らせてみる。

#写真

![DSCN0541.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6c136079-e53d-74cc-f49b-4e3d65d78792.jpeg)


#サンプルコード

```

module neo(input clk, rst, output reg tx);
	reg [2:0] state = 0;
	reg [7:0] bits = 0;
	reg [23:0] test_color = 24'h555554;
	reg [7:0] cnt = 0;
	reg up;
	wire clk2;
	assign clk2 = up;
	always @(posedge clk)
	begin
		if (cnt == 16)
		begin
			cnt <= 0;
			up <= 1;
		end
		else
		begin
			cnt <= cnt + 1;
			up <= 0;
		end
	end
	always @(posedge clk2)
	begin
		if (state == 5)
		begin
			state <= 0;
		end
		else
		begin
			state <= state + 1;
			if (bits == 24)
			begin
				bits <= 0;
			end
			else
			begin
				bits <= bits + 1;
			end
		end
		if (test_color & (1 << bits))
		begin
			if (state == 0 || state == 1 || state == 2)
			begin
				tx <= 1;
			end
			else 
			begin
				tx <= 0;
			end
		end
		else
		begin
			if (state == 0 || state == 1)
			begin
				tx <= 1;
			end
			else
			begin
				tx <= 0;
			end
		end
	end
endmodule


```


以上。
自社サイトのアクセス状況をネットワーク上に可視化するとかっこよかった話

# 背景

　日頃アクセス解析系のデータ分析をお手伝いさせていただく中で、サイトのざっくりの特徴を一目で分かるビジュアライズが欲しいと考えておりました。
ふと「ネットワーク化したら全体がイメージで掴めて良いのではないか？」という考えが舞い降り、一旦自社データで試してみることにしました。
明確な目的や設計があったわけではないので軽いお遊びの感覚で見ていただけると幸いです。

# 実現方法

## システム構成

一旦最小限の開発で実現するために以下構成で可視化を行いました。
シンプルですが接続先さえ変えれば移植できるので割と実用性もある気がしています。

- 元データ　：　GoogleAnalytics4 (Bigquery連携済)
- 実行環境　：　Google Colaboratory
- 言語　：　python
- ライブラリ　：　NetworkX

## 可視化の設計

どのように可視化するかについては個人的に気になる「流入・回遊」がみられるように設計しました。

- 円の大きさ ： 流入の大きさ
- 線の向き ： 回遊の繋がり
- 線の大きさ ： 回遊の大きさ

# 結果

## グラフ

![network.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/1d8d1324-09d9-b00a-199e-c154cd633fa7.jpeg)

## 示唆

- 円が大きいのに回遊されてない箇所がある
    - 記事としては良いがサイト誘導ができていないため、誘導文言等の修正などを検討すべき
- 回遊しているサイトからユーザー像が浮かび上がってくる
    - 「firebaseやNuxt周りの技術興味ありor相談したい」と「経営者個人を知りたい層」の２つがありそう
- どこを次に掘ってみたいかがわかりそう

## 注意点

示唆が「得られそう」とあえてふわっと書いたのですが、
まだまだ以下のようなツッコミポイントは多いので、
安直に信じて良い状態になっているとは言い切れないところです

- 入口の可視化はできてる？離脱は？
- 回遊の向きが重要じゃない？
- pvあってもUUが重要じゃない？

# 感想

かっこよさを求めて始めた試みですが想像よりも使えそうなものができて驚きました。
今までの案件でも似た提案をしたことはあったので、
もう少し詳細を詰めれば使えるものになっていくのではないかと思われます。
グラフの直感的わかりやすさに可能性がありそうです。

詳細については以下社内ブログに記載したので気になる方は是非！
https://www.sink-capital.com/blogs/access_network/
（数ヶ月後にはブログから自社サイトに向けて太い線が繋がっていることを願ってます...笑）
[Rails]render(部分テンプレート)について

##初めに
####記事の対象
・フロントサイドで同じプログラムを何度も書きたくないヒト用

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
１）renderってなんだ？
２）部分テンプレートの使い方
３）部分テンプレートの場所によってrenderの仕方が違う

##renderってなんだ？
####イメージは、別の場所にプログラムを配置して、使いたい場所に移す。
####フロントサイドでどのページへ遷移しても同じ見た目があるようなところに使います。（例えばqittaの上の部分と下の部分）

![rendersample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/61bce9f8-8e7f-42b4-b0f4-bc0a52b48880.png)

##部分テンプレートの使い方
####１）_oooo.html.erbというファイルを作り、配置したいファイルと同じ階層に作成したファイルが入っているファイルを置く。(今回は部分テンプレートが入っているファイル名をshared、配置したいファイルをindex.html.erbとする)

![renderfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/27ec3536-85d9-1028-6f1c-87f5ec005330.png)

####2)作成したファイル内に同じ見た目のプログラムをcopy&pasteをする。

![renderfiles.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/fdaf9f8b-3200-5a38-b758-dfd2ddb6d922.png)

####3)同じ見た目である場所のファイルにコピー＆ペーストして部分を削除してrenderメソッドを書く。

```
<%= render "ファイルの場所" %>

今回使いたい部分テンプレートのファイルの場所は<
views/products/shared/_header.html.erb>なので

<%= render "shared/header" %>
```

![“ここに好きな文言を設定” 2021-09-07 15.59.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/15421286-39d5-a9ec-3bb2-537c8a4de944.png)

##※部分テンプレートの場所によってrenderの仕方が違う
####同じファイル内に部分テンプレートがある場合

**配置場所**（views/products/index.html.erb）
**部分テンプレート**(views/product/_header.html.erb)

```
<%= render "header">
```
####別のアプリの部分テンプレートを使いたい場合

**配置場所**（project/**chat-app**/app/views/products/index.html.erb）
**部分テンプレート**(project/**program_sample**/app/views/product/index)


配置したい場所のコントローラに(今回はindexを配置させたいのでindexアクションに置く)

```rb
def index
  render file: "project/program_sample/app/views/product/index"
end
```
##最後に
・今回の記事を書いて、テキストばかりではなくてexcelとか使ってイメージしやすいように画像を入れてみようと思った！
・最後まで読んでくださいましてありがとうございますb
google-java-formatのjava16対応

# はじめに
javaのバージョンアップに伴い、[google-java-format](https://github.com/google/google-java-format)のバージョンを`1.7`から`1.11.0`にあげてspotlessを実行したら以下のようなエラーが出た。
これはJava16の[JEP 396](https://openjdk.java.net/jeps/396)の影響とのこと。 

```
Caused by: java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput (in unnamed module @0x615edab4) cannot access class com.sun.tools.javac.parser.Tokens$TokenKind (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.parser to unnamed module @0x615edab4
        at com.google.googlejavaformat.java.JavaInput.buildToks(JavaInput.java:349)
        at com.google.googlejavaformat.java.JavaInput.buildToks(JavaInput.java:334)
        at com.google.googlejavaformat.java.JavaInput.<init>(JavaInput.java:276)
        at com.google.googlejavaformat.java.Formatter.getFormatReplacements(Formatter.java:280)
        at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:267)
        at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:233)
```

# 解決方法
以下の設定を`gradle.properties`に記載し、プロジェクトのホーム直下においてあげれば良い。

```
org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
  --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
  --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \
  --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
  --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
```
テキストファイルを出力する方法

```js
function downLoadTXT(text, filename) {
    // TXTをダウンロードする
    let blob = new Blob([text], {type: "text/plain"});
    let link = document.createElement("a"); // aタグのエレメントを作成
    link.href = window.URL.createObjectURL(blob);
    link.download = filename;
    link.click();
}
```
【Python】CSVの最終行が指定データと一致するかどうか判断する関数

車輪の再発明している感じ、ありますね。


```Python
def is_same_as_last_line(data, csv_file) -> bool:
    with open(csv_file, 'r', encoding='utf8') as f:
        rows = [row for row in csv.reader(f)]
    try:
        last_line = rows[-1]
        # 空白行が最後にある可能性があるので、その対策
        if last_line == []:
            last_line = rows[-2]
        if(last_line == data):
            return True
        return False
    # 行が少なすぎたりするとエラーを返す
    except IndexError:
        return False
```
python お一人様一点限り機能

##お一人様一点限りを判定する
重複があるか無いかで判断する。

```
n = int(input())

person_list = []
for i in range(n):
    person_list.append(input())
    
    if(person_list.count(person_list[i]) == 1):
        print("YES")
    else:
        print("NO")
```
入力例2
4
Jimmy
Bob
James
Jimmy

出力例2
YES
YES
YES
NO
MATLABでDJIのtelloを動かそう。２

#基本の設定やコマンドは１を参照
[MATLABでDJIのtelloを動かそう。1](https://qiita.com/RyeWiskey/items/99ce3c79c0d3d8cb384b)
***
#ちょっと高度な飛行コマンド(rはオブジェクト）
**回転**
telloを空中で回転させるコマンドです。
```flip(r,'回転させたい方向')```



|''に入るコマンド|forward|back|right|left|
|:--|:--|:--|:--|:--|
|回転方向|前|後ろ|右|左|


**前後左右への移動**

telloをカメラの方向とは逆向きに移動させるコマンドです。
```moveback(r)```
telloをカメラの方向と同じ向きに移動させるコマンドです。
```moveforward(r)```
telloを右に移動させるコマンドです。
```moveright(r)```
telloを左に移動させるコマンドです。
```moveleft(r)```


rの次に,を入れ数字を打ち込むとその秒数、指定した方向に移動します。

例(５秒間後方に移動）
```moveback(r,5)```

例（５秒間1.5m/秒で移動）
```moveback(r,5,'speed',1.5)```


**上下移動**
telloを上方向に移動させます。
```moveup(r)```
telloを下方向に移動させます。
```moveup(r)```

例（５秒間1.5m/秒で上方向に移動）
```moveup(r,5,'speed',1.5)```

**方向転換**
右回りでtelloが方向転換をします。
```turn(r,deg2rad(45))```
ここでのdeg2radとは（）に入れた数字を角度の度で読み取りラジアンで返す構文です。

例
４５度ー＞deg2rad(45)ー＞0.7854 radians

#これで一通りの飛行コマンドを書いたのでみんなも飛ばしてみよう。
***


#引用
>https://jp.mathworks.com/help/supportpkg/ryzeio/drone-navigation.html?s_tid=CRUX_lftnav

#次はカメラやフライトデータの使い方
bearとcompdbでC/C++のヘッダファイル込みのcompile_commands.jsonを吐く

# Bearについて

cmakeとか使ってないC/C++のプロジェクトでもclangdとかのlanguage serverのために`compile_commands.json`がほしいとき

```sh
$ bear -- make
```
みたいにすることで`compile_commands.json`を勝手に吐いてくれるすごいやつがbear。

（`--`は比較的新しいバージョンで必要になった気がする）

GitHub: [rizsotto/Bear](https://github.com/rizsotto/Bear)

しかしヘッダファイルまで含めてくれないので、ヘッダーを編集してる時にlspの補完とかエラーチェックが効かなくて困ることがしばしば。

- Issue: https://github.com/rizsotto/Bear/issues/204

上のIssueによれば`compdb`なるものを併用すれば良いとのこと。

# compdbのインストール

GitHub: [Sarcasm/compdb](https://github.com/Sarcasm/compdb)

インストール:

```sh
$ pip install compdb
```

バージョンの表示:

```sh
$ compdb version
compdb version 0.2.0
```

# 使い方

Makefileが置いてあるディレクトリにて

```sh
$ bear -- make
$ compdb list | sponge compile_commands.json
```

`compdb`は`compile_commands.json`を読み込んで新しい`compile_commands.json`を吐く。

以下のようにやると`compile_commands.json`が読み込まれている間にリダイレクトで書き込まれて壊れてしまうので`moreutils`の`sponge`コマンドを使っている。この辺は適当に。

```sh
$ compdb list > compile_commands.json
```

（`-p BUILD_DIR`でbuildディレクトリを指定することも可能）
composerプライベート自作ライブラリをgitlabに作成する

# 概要
自作ライブラリをcomposer/gitlabを介して使う

# 手順
## トークンの作成
アクセス用トークンを作成する。

https://${gitlab_url}/profile/personal_access_tokens

にアクセスし、Scopeをapiで作成。
値をメモしておく。

## ライブラリ用プロジェクト
### projectの設定
gitlabプロジェクトのページで、Setting>General>Visibility, project features, permissionsにアクセス。
パッケージとして使うことを許可する。

### composer.json

以下の記載を入れる

```json
{
  "name": "${namespace}/${library-name}",
  "type": "library",
  "version": "${version}"
}
```

この状態で、タグをつけてプッシュしてする。

### ライブラリの発行
以下のコマンドをたたきライブラリとして登録する。

```bash
curl --data tag=${tag_name} 'https://__token__:${token}@${gitlab_url}/api/v4/projects/${project_id}/packages/composer'
```

## 利用側プロジェクト
### composer.json
以下を追記する。

```json
require: {
  "${namespace}/${library_name}": "${version}"
  },
  "repositories":[
{"type":"composer","url":"https://__token__:${token}@${gitlab_url}/api/v4/group/${group_id}/-/packages/composer/packages.json"}
  ],
```

auth.jsonを使って認証をする方法もあるがうまくいかなかった。
globalに設定すればできるかもしれないがあまりやりたくないのでこちらを利用。

### install

```bash
composer install
```

これで利用可能です。情報が散らばっていましたが、やってみると意外と簡単。
python3 配列に任意の数入れる（簡易版）

###配列に指定する数字文だけ入力を行い配列に入れる。

```
n = int(input())

b = [int(input())for i in range(n)]
b.sort()

for j in range(n):
    if b[j] % 2 != 0:
        print(b[j])
```

```
b = [int(input())for i in range(n)]
```
この箇所が重要。
[Java基礎⑤]配列　拡張for文　ArrayListクラス

<h2>初めに</h2>
今回は配列について学習しました。

<h1>配列の基本の形</h1>

```java:
public class Main {
    public static void main(String[] args) {
        String[] array = {"りんご","メロン","おにぎり","卵"};
        // この下で、arrayを出力してみよう
        System.out.println(array[0]);
    }
}
```

String型の配列なので、ここに数値を入れてしまうとエラーになります。

ちなみに以下のように一つずつ配列に格納することもできます。

```java:
#配列名を宣言
String[] array;
#配列の長さを決める
array = new String[2]
#配列に格納
array[0] = "戦士"
```

配列の長さを求めるには```System.out.println(team.length);```です。
これを使えば前回学習したfor文で配列の中身を取り出せます。


<h2>配列×for文</h2>

```java:
public class Main {
    public static void main(String[] args) {
        String[] fruit = {"りんご", "メロン", "みかん"};
        for (int i = 0; i < fruit.length; i++) {
            System.out.println(fruit[i] + "を拾った");
        }
    }
}
```

<h1>Javaの拡張for文</h1>

Javaでは配列の中身を処理する際に、拡張for文をよく使用するそうです。
↑の文を、拡張for文に修正します。

```java:
public class Main {
    public static void main(String[] args) {
        String[] fruit = {"りんご", "メロン", "みかん"};
        for (String i : fruit) {
            System.out.println(i + "を拾った");
        }
    }
}
```

<h1>ArrayListクラスについて</h1>
配列の要素数を後から変更することができるなど便利な機能を持っているようです。


```java:
// ArrayListに要素を追加する
import java.util.*;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> fruit = new ArrayList<String>();
        // ここに、要素を追加するコードを記述する
        fruit.add("りんご");
        fruit.add("メロン");
        fruit.add("みかん");
        for (String i : fruit) {
            System.out.println(fruit);
        }
    }
}


// ArrayListの要素を上書きするには？

        fruit.set(2,"夏みかん");

// ArrayListの要素を削除するには？
        fruit.remove(2);

// ArrayListの要素の個数を出力するには？
        System.out.println(fruit.size());
   
```

<h2>終わり</h2>
今回は配列について学習しました。
LaravelのAuthでユーザー登録時に、画像を登録したい。

# Model

###やること###
$fillableを記述する。

```User.php
    protected $fillable = [
        'name',
        'email',
        'password',
        'avatar_file_name',// ⬅追加(画像のパス名カラム)
    ];
```


###　前知識として

__Eloquentモデルにおけるfillable属性__
ホワイトリストのこと。
指定したカラムのみが、Modelに持たせることができる。

__見れば分かる$fillableの機能⬇__

```.php

protected $fillable = ['title', 'body'];

$book = new Book([
    'name' => 'Soseki Natsume',
    'title' => '猫',
    'body' => '吾輩は猫である',
    'published' => '1990'
]);

$book->getAttributes(); 
 ['name' => 'Soseki Natsume', 'title' => '猫',]

$bookには$fillableで指定したカラム以外は入っていないことが分かる。
```

__使い所__

```.php
//この一文でfillabeに指定しているカラムは全て格納される。
//idなどは、書かなくてよいはず
Book::create($request->all());

```

__参考__

| 属性 |機能 |説明　|
|:-:|:-:|:-:|
|$guard|ブラックリスト|禁止したもの以外は入れる。|
|$fillable|ホワイトリスト|許可したもの以外は入れない。|






#View

###やること###

formタグに、enctype="multipart/form-data"を追加する。
（form要素で　enctype属性の値を"multipart/form-data"にする。）
ただのURLエンコード➡マルチパート（メディア送信に対応）

```register_blade.php

<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data">
      @csrf

```

###前知識として

form要素は、enctype属性を指定できる。
enctype属性で、送信時のMIMEタイプを指定できる。

**MIMEタイプ=メディアタイプ**
_Multipurpose Internet Mail Extensions_
文書、ファイル、またはバイト列の性質や形式を示す標準

| 値 | 概要 |
|:-:|:-:|
| application/x-www-form-urlencoded  | URLエンコード （デフォルト）  |
| multipart/form-data  | マルチパート  |

URLエンコード：（あ → %E3%81%82）


#Controller

###やること###

使用するクラスを増やす。


```RegisterController.php
:
:
use Illuminate\Http\File;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
:
:
```

画像保存用のメソッドを追加する。

```RegisterController.php
    private function saveAvatar(UploadedFile $file): string
    {
        $tempPath = $this->makeTempPath();
        Image::make($file)->fit(200, 200)->save($tempPath);
        $filePath = Storage::disk('public')
            ->putFile('avatars', new File($tempPath));
        return basename($filePath);
    }

   private function makeTempPath(): string
   {
       $tmp_fp = tmpfile();
       $meta   = stream_get_meta_data($tmp_fp);
       return $meta["uri"];
   }
```

バリデーターを追記する。

```RegisterController.php
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'introduction' =>['required', 'string', 'max:255'],
            'avatar' => ['required', 'image'],
        ]);
```

createアクション内に画像保存の処理を追加する。

```RegisterController.php
    protected function create(array $data)
    {

            $fileName = $this->saveAvatar($data['avatar']); //⬅privateで定義したメソッド呼び出し

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'avatar_file_name' => $fileName,　//⬅カラムに画像名追加
        ]);
    }

```
apachのRewriteRuleについてのめも

# 使い方

```
LoadModule rewrite_module modules/mod_rewrite.so
RewriteRule / http://www.apache.org [R=301,L]
```

リバースプロキシを使うときもRewriteRuleが使える
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html
```
より柔軟なリバースプロキシの設定が必要な場合は、[P] フラグ付きの RewriteRule ディレクティブを参照してください。
```
でもセキュリティ的には良くないのでProxyPassを使うべき
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l

```
Security Warning
Take care when constructing the target URL of the rule, considering the security impact from allowing the client influence over the set of URLs to which your server will act as a proxy. Ensure that the scheme and hostname part of the URL is either fixed, or does not allow the client undue influence.
```

https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l
NextflowでfromSRAが Server returned HTTP response code: 500 になるときの対処

2021年9月7日現在、NextflowのChannelでfromSRAを使おうとすると次のようなエラーメッセージが出る。

```
Server returned HTTP response code: 500 for URL: https://www.ebi.ac.uk/ena/portal/api/filereport
```

これは下記のissueを見ると、既知の問題とのこと。

https://github.com/nextflow-io/nextflow/issues/2292

すでにエッジリリース(21.08-edge)では修正されているらしい。
エッジリリースにアップデートするためには、環境変数 `NXF_EDGE=1` を設定すればよい。

```sh
sudo NXF_EDGE=1 nextflow self-update
```

これでちゃんと動く。動作確認は `nextflow console` を利用すると簡単である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/13aebf8a-1c66-fc76-1a5a-99fef72e7bd2.png)

ちなみに、動かすだけならば、NCBI API keyは不要である。しかし、NCBI API keyを指定すると、1秒間に3クエリーから1秒間に10クエリーさばいてくれるようになり、大幅に速度が上昇する。NCBI API keyは、GoogleアカウントでNCBIにログインしても簡単に取得できるので、使えるなら使った方がよいと思われる。


```groovy
Channel
    .fromSRA('SRP043510', apiKey: "0123456789abcdef")
    .view()
```

のようにapiKeyオプションを利用するか、環境変数で `NCBI_API_KEY=0123456789abcdef` のように指定する。

この記事は以上です。
ruby on rails6のdeviceで登録ページに名前を追加する方法

gem "devise"
bundle install

deviceをインストール後


```
rails g devise:views
```
で`app/views/devise`に生成されます



```erb
<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>
```

あとは下記のコードを上記へ貼り付ければOK

```erb
<div class="field">
    <%= f.label :name %> <br />
    <%= f.text_field :name %>
  </div>
```
※データベース設定マイグレーション作業などもする必要があります。
Java Word文書をTIFF形式に変換

<p><strong>TIFFは、ビットマップ画像の符号化形式の一種です。タグと呼ばれる識別子を使うことによって、様々な形式のビットマップ画像を柔軟に表現できると思われています。今日は、Free Spire.doc for Javaという無料のライブラリを利用して、Word文書をTIFF形式に変換する方法を紹介したいと思います。さあ、参りましょう～</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/doc-for-java-free.html">Free Spire.doc for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210907/20210907152120.png" alt="f:id:lendoris:20210907152120p:plain" width="437" height="221" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.doc.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210907/20210907152125.png" alt="f:id:lendoris:20210907152125p:plain" width="239" height="101" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.doc.*;

public class WordToTiff {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("inputfile.docx");
        doc.saveToTiff("ToTiff.tiff");
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210907/20210907152201.png" alt="f:id:lendoris:20210907152201p:plain" width="432" height="487" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
【QGIS】CSVテキストデータを文字列（abc）ではなく数値（123）で読み込む

#はじめに
今回は、CSVテキストデータを文字列ではなく数値として読み込む方法を書いていきたいと思います。

#1. CSVをドラッグ＆ドロップで読み込む
まずは、CSVを普通にドラッグ&ドロップで読み込んでみました。

すると、このようにして文字列として読み込まれてしまいます。
これでは、数値による分析をすることができません。
![スクリーンショット 2021-09-07 143552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1988321/3133b50c-2716-d507-2e03-2f6473127cf7.png)

#2. CSVT作るの辛いっす😭
どうやら、CSVTテキストという別のファイルを作ってドラッグ＆ドロップで読み込むと、数値として読み込むことができるそうです。

「よし、CSVTテキストファイルを作ってみよう！！」
ということで、格闘すること数十分。
　　　　　⏳⏳⏳
あかん、これ、めっちゃつらたん。。。

#3. いい方法がありました
とっても簡単な方法がありました。
データソースマネージャからCSVテキストを読み込んでみてください。
![スクリーンショット 2021-09-07 135908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1988321/a93a3082-b33f-b8d9-a2d4-d5b79b16b71a.png)


#4. あらまぁ、不思議。
すると、、あらまぁ不思議。
![スクリーンショット 2021-09-07 140521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1988321/0c041751-8915-c51a-ea7b-9aaafcd33ab7.png)

文字列(abc)ではなく、数値(123)として読み込んでくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1988321/4f4e7abd-a0fe-e187-5b47-e548a067790a.png)


というわけで、晴れてCSVテキスト内の数値データの分析が可能になりました☺️🎉
めでたしめでたし。
#6. 出典

http://open-data.pref.hyogo.lg.jp/index.php?action=pages_view_main&active_action=multidatabase_view_main_detail&content_id=12522&multidatabase_id=209&block_id=85

https://gis.stackexchange.com/questions/29606/changing-csv-layer-attribute-value-from-text-to-number-in-qgis
任意のRoleを使ってAWS CLIの実行

AWS SDKでプログラム組んでいて不具合の原因を、ロジックか認証か、と探るために調べました。

## 参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html

## 作業
使いたいRoleの信頼関係に普段使っているIAMユーザーを追加。
※下記はlambda用のRoleにIAMユーザーを追加

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com",
        "AWS": "arn:aws:iam::123456789012:user/user"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

信頼ポリシーを設定したユーザーと、RoleのArnを使って、profileの設定

```
vi ~/.aws/config

[profile test-role]
role_arn = arn:aws:iam::123456789012:role/test-role
source_profile = user
```

aws cli確認

```
aws s3 ls --profile user
aws s3 ls --profile test-role
```

## まとめ
実行確認として許可バケットだけ見れて、他は見れないってなったので、実現できているはずです。(確認が終わったら、信頼関係は削除しておきましょう。)

他の方法としては、sts使って一時クレデンシャル発行で確認でも良さそうでしたが、発行したのコピペして利用とかが面倒だったので、今回の方法を探った次第でした。

参考までに。
【Swift】isEmptyの挙動メモ

isEmptyを文字列や配列に使うことがあると思いますが、たまにごちゃっとなるのでメモします。
同じように「どうだったけ？」という方の参考になれば幸いです！

## 実行環境
Swift 5.4.2

## nilがない場合


```swift
let case1 = ""
print(case1.isEmpty)
// true

let case2 = " "
print(case2.isEmpty)
// false

let case3 = [""]
print(case3.isEmpty)
// false

let case4 = [" "]
print(case4.isEmpty)
// false

let case5:[String] = []
print(case5.isEmpty)
// true
```


## nilがある場合

```swift
let case1: String? = nil
print(case1?.isEmpty)  //warningが出ます
// nil

let case2: String? = nil
print(case2!.isEmpty)
// nilを強制アンラップするためクラッシュします

let temp: String? = nil
let case3 = [temp]
print(case3.isEmpty)
// false

let temp: String? = nil
let case4 = [temp, ""]
print(case4.isEmpty)
// false

let temp1: String? = nil
let temp2: String? = nil
let case5 = [temp1, temp2]
print(case5.isEmpty)
// false

```
コンポーネントとprops

# React入門
最近学習を始めたのですが、propsとコンポーネントという概念がReactを触るという点において重要だと感じたのでメモ代わりにまとめました。

## コンポーネントとは
・見た目と機能を持つUI
・コンポーネントを組み合わせてページを作る
・大きく2種類のコンポーネントに分かれる
　Class Component　(クラスコンポーネント)
　Functional Component　(関数コンポーネント) //今はこっちで書くことが主流


## なぜコンポーネントを使うのか

・再利用するため
　✔同じ記述を何度もする必要がない
・コードの見通しをよくするため
　✔1コンポーネント=1ファイル
　✔べつファイルに分けることでコードが読みやすくなる
・変更に強くするため
　✔修正は1箇所だけでOK

## コンポーネントの基本的な使い方
・ファイルは大文字
・子コンポーネントでexport
・親コンポーネントでimport

## コンポーネントの再利用
・配列をmap()メソッドで処理することが一般的
・同じコンポーネントをいくつも呼び出すことができる

## propsでデータを受け渡す（★）

### propsとは（★）
親から子にデータを受け渡す際の橋渡し役
Reactでよく使用する


App.jsx(親)

```
import Article from "./components/Article";

  function App() {
    return(
      <div>
        <Article
          title={'これはタイトルです'}　←呼び出し側で値を指定する
          content={'これはコンテンツです'}
      </div>
    );
  }

export default App;

```


components/Article.jsx(子)

```
const Article = (props) => {
   return(
     <div>
       <h2>{props.title}
       <p>{props.content}</p>
     </div>
   )
}
export default Article;
```

### propsで渡せるデータ
・文字列、数値、真偽値、配列、オブジェクト、日付などなんでもOK
・変数も可能
・文字列は{}なしでもOK
・propsのデータは{}に記述
tmuxで左右のペインも入れかえたい


#TL;DR
・swap-paneは-Uと-Dがあるが左右の入れかえはできない
・彼ら厳密には上下入れ替えでもないのでちょっと使いにくい
・select-paneを組み合わせるか、-s scr-paneを使おう

#はじめに
select-paneと同じようにしてペインをいれかえたい
man pageによるとswap-paneを使えば良いらしいが

https://man7.org/linux/man-pages/man1/tmux.1.html
>swap-pane [-dDUZ] [-s src-pane] [-t dst-pane]
Swap two panes.  If -U is used and no source pane is specified with -s, dst-pane is swapped with the previous pane (before it numerically); -D swaps with the next pane (after it numerically).

-U, -Dはペインの並びではなく"数値上の"上下を交換する
つまり左右に分割している時は左右交換になるわけです
これはいただけない
方法は二通り

#ペイン移動
単にアクティブペインを切り変えるだけならこう

``` .tmux.conf
bind h selectp -L
bind j selectp -D
bind k selectp -U
bind l selectp -R
```
>selectpはselect-paneのエイリアス

|コマンド|挙動|
|-|-|
|prefix + h|左のペインへ移動|
|prefix + j|下のペインへ移動|
|prefix + k|上のペインへ移動|
|prefix + l|右のペインへ移動|


#方法1. select-paneと組み合わせる
`select-pane`で移動してから`swap-pane -s '!'`でいれかえればよい

```
bind H selectp -L \; swapp -s '!'
bind J selectp -L \; swapp -s '!'
bind K selectp -L \; swapp -s '!'
bind L selectp -L \; swapp -s '!'
```
>swappはswap-paneのエイリアス

|コマンド|挙動|
|-|-|
|prefix + H|左のペインと入れかえ|
|prefix + J|下のペインと入れかえ|
|prefix + K|上のペインと入れかえ|
|prefix + L|右のペインと入れかえ|
一応機能するが上下分割のみ、左右分割のみの時にちょっと変

#方法2. -s scr-paneを使う
個人的にはこちらがおすすめ

```
bind H swapp -s '{right-of}'
bind J swapp -s '{down-of}'
bind K swapp -s '{up-of}'
bind L swapp -s '{right-of}'
```

#参考
https://man7.org/linux/man-pages/man1/tmux.1.html
asset化しない生のファイル読み込み


```C#
var a = await Re.Get<T>(name);//T: Texture2D or string
```

```C#
        using UnityUtil;
//...

    async void Start()
    {
        Re.basepath=Application.streamingAssetsPath;
//.../Assets/StreamingAssets
        //quad 
        var tex =await Re.Get<Texture2D>("stand.png");
        gameObject.GetComponent<Renderer>().material = tex.ToMat();

        //rawimage
        var tex = await Re.Get<Texture2D>("stand.png");
        gameObject.GetComponent<RawImage>().texture = tex;// as Texture;
        gameObject.GetComponent<RectTransform>().sizeDelta=new Vector2(tex.width,tex.height);

        //image
        var tex = await Re.Get<Texture2D>("stand.png");
        gameObject.GetComponent<Image>().sprite = tex.ToSprite();

        //text
        var str= await Re.Get<string>("test.txt");               
        Debug.Log(str);

        Debug.Log("end");        
    }
            
```


```C#

namespace UnityUtil
{
    using System.Collections.Generic;
    using UnityEngine;
    using System.IO;
    using System.Threading.Tasks;

    public static class Re
    {
        /*usage
        using UnityUtil;
            Re.basepath=Application.streamingAssetsPath;
            var a =await Re.Get<string>("license.txt");
            var b= await Re.Get<Texture2D>("zed1.jpg");

        */
        public static Dictionary<string, object> cash = new Dictionary<string, object>();

        public static string basepath = ".\\";

        public static async Task<T> Get<T>(string name)
        {
            name = name.Trim();
            if (!cash.ContainsKey(name))
            {
                var o = await Load(name);
                cash.Add(name, o);
            }
            //
            return (T)cash[name];
        }
        static async Task<object> Load(string name)
        {
            var ret = new System.Object();
            var path = Path.Combine(basepath, name);

            if (isText(name))
            {
                var str = File.ReadAllText(path);
                ret = str;
            }
            else
            {
                var tex = new Texture2D(1, 1);
                var bytes = File.ReadAllBytes(path);
                tex.LoadImage(bytes);
                ret = tex;
            }
            return ret;
            //
            bool isText(string name) => name.IndexOf(".txt") != -1;
        }

        public static Material ToMat(this Texture2D tex,string shadername="Transparent/Diffuse"){
            Material mat = new Material(Shader.Find(shadername));
            mat.SetTexture("_MainTex", tex);
            return mat;
        }
        public static Sprite ToSprite(this Texture2D tex)
        {
            return Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), Vector2.zero);
        }
    }

}//namespace

```
【JavaScript】JavaScript入門一覧

# 概要
JavaScriptを学習、理解を深めるため「[JavaScript Primer 迷わないための入門書](https://jsprimer.net/)」を読み、
理解した内容等を記載した記事一覧となる。

# 記事一覧
* [【JavaScript】JavaScriptとは](https://qiita.com/andota05/items/98ae3b0c739f3520dbab)
* [【JavaScript】コメント](https://qiita.com/andota05/items/4616224b316149015c96)
* [【JavaScript】変数と宣言](https://qiita.com/andota05/items/238ff472a0e711b65275)
* [【JavaScript】値の評価と表示](https://qiita.com/andota05/items/aafdee659972fc726725)
* [【JavaScript】データ型とリテラル](https://qiita.com/andota05/items/57563724656e4ada14dd)
* [【JavaScript】演算子](https://qiita.com/andota05/items/756d6af03b5e8841dd6e) 
* [【JavaScript】関数と宣言① 〜関数の宣言・呼び出し・引数〜](https://qiita.com/andota05/items/a32d5fee352f17ea1361)
* [【JavaScript】関数と宣言② 〜関数式・アロー関数・コールバック関数〜](https://qiita.com/andota05/items/0f6ed255d1c84de82c4d)
* [【JavaScript】文と式](https://qiita.com/andota05/items/1299fe8c965a2ecb8f09)
* [【JavaScript】条件分岐](https://qiita.com/andota05/items/fb052962ab150bbbc929)
* [【JavaScript】ループと反復処理](https://qiita.com/andota05/items/91528b6627fa88d2d28e)
* [【JavaScript】オブジェクト①](https://qiita.com/andota05/items/86f359455eb4a233031a)
* [【JavaScript】オブジェクト②](https://qiita.com/andota05/items/e915126dfce7573e4330)
* [【JavaScript】ラッパーオブジェクト](https://qiita.com/andota05/items/61e49960c398521cff25)
* [【JavaScript】例外処理](https://qiita.com/andota05/items/fc1e340642be42ca47c0)
* [【JavaScript】JSON](https://qiita.com/andota05/items/2147e81bb6cfb2473b34)
* [【JavaScript】Date](https://qiita.com/andota05/items/df46e2b7f560a2455189)
* [【JavaScript】Math](https://qiita.com/andota05/items/e8281c2c59214809fa3c)
* [【JavaScript】ECMAScriptモジュール①](https://qiita.com/andota05/items/d91086102326b2bd3dbb)
* [【JavaScript】ECMAScriptモジュール②](https://qiita.com/andota05/items/22676d733bf1b4db9809)
* [【JavaScript】ECMAScriptモジュール③](https://qiita.com/andota05/items/3226966ab77877450853)
【UE4】UE4エディタを起動した際に前回開いたレベルを自動で開く方法

UE4のデフォルト設定では、エディタを開くたびにデフォルトに設定されたレベルを開くようになっています。
ただ、編集する目的のレベルがデフォルトと違う場合には、毎回目的のレベル探して手動で開く事になりめんどくさいですよね。

設定を変更することで、デフォルトで開くレベルを、前回開いたレベルを開くように変更することができます。


#設定方法#


①UE4のツールメニューから、<b>編集</b> → <b>エディタの環境設定</b> を開きます。
![デフォルトレベルの設定変更１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1886417/b5fd1b65-3cd7-74e8-04ae-4e5f651bba29.png)
② <b>ロード＆保存中</b> を選択します。

③ <b>Startup</b> 項目の <b>起動時にレベルをロード</b> のところを、<b>Project Default</b> から <b>Last Opened</b> に変更します。
![デフォルトレベルの設定変更２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1886417/23ca640a-89c3-ccdb-8a95-732e3270383f.png)

これだけで、エディタを起動すると自動で前回のレベルを開いてくれるようになります。
python3 文字列の重複を調べる方法

#①countを使用する場合

```
print("Good School".count("oo"))
>> 2
```
####注意
countは数えた文字は再度数えない

```
print("Goooood".count("oo"))
>> 2
```


#②全重複を考える場合
上記の内容を結果３としたいのような場合

```
pattern = input()
string = input()
result = 0

for i in range(len(string) - len(pattern) + 1):
    portion = string[i : i + len(pattern)]

    if portion == pattern:
        result += 1

print(result)
```

入力例1
AA
abdeeAAbAAAbfde

出力例1
3


###まとめ
上記のように重なるものをどのように扱うかで異なる結果になる。注意して導入しよう。
【androidアプリ】リリース直前に気を付けるべきだった４つのポイント

##概要
Androidアプリ　[ツケ台帳](https://play.google.com/store/apps/details?id=com.chelak.tsuke_daicho)　のプログラミングが完了した後、リリースする直前にいくつか調整したので備忘録的にメモしてみます。 アプリの解説→[こちら](https://qiita.com/n_ku/items/de1675af32ca53acc562)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344513/c7034df4-e967-3c04-382b-1948335233bf.png" width="160" height="326" class="jop-noMdConv"><ahref='https://play.google.com/store/apps/details?id=com.chelak.tsuke_daicho&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Google Play で手に入れよう' src='https://play.google.com/intl/en_us/badges/static/images/badges/ja_badge_web_generic.png'/ width="300"></a>

##確認事項
**起動速度が遅い**
プログラミング完了直後は起動時間がエミュレータで７秒近くありました。  
さすがにこれは長いと思いいろいろな方法を試したのですが、一番効果があったのは  
・`gradle(app)`内で余計なものを`implement`していないかを確認し、削除する  
でした。  
初のアプリ開発でいろいろ試しながらやっていたというのもありますが、これで５秒以下まで起動時間が短縮できました。
また、最後にこういう見直しができるようにしっかりコメントを書いておくことも重要かと思います。
  
**テーマの変更**
個別で変更するのは効率が悪いので、`themes.xml`でまとめて最後に変えます。

```kotlin:themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="Theme.Hoge" parent="Theme.MaterialComponents.DayNight">
        // ここを変更
    </style>
</resources>
```

**アイコンの下に表示されるアプリ名**
ホーム画面のアイコンの下に表示されるアプリ名は`AndroidManifest.xml`のMainActivity内`android:label`を参照しているっぽいです。

```kotlin:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.hoge">

    <application
        android:label="@string/app_name" //ここがアイコン下の表示名
    </application>

</manifest>
```
  

**難読化　Firebaseを使う場合の注意点**
アプリのサイズが大きい場合、「難読化」という方法でサイズを小さくすることができます。
[ツケ台帳](https://play.google.com/store/apps/details?id=com.chelak.tsuke_daicho)　ではFirebase Realtime Databaseを使用していますが、その場合そのまま難読化することはできずエラーとなるようです。  
今回はサイズがもともと小さい（数Mb）ので難読化せずに妥協しました。が、工夫すればRealtimeDatabaseも難読化できるようです。もっと大きなアプリ作成したら試してみようかと思います。
  
*難読化とは：複数回登場するスクリプトを別の文字列に置き換えることで軽量化している、と理解してます。置き換えた文字列同士の対応は`mapping.txt`として出力されるため、これも一緒にストアにアップロードする必要があります。
Pentaho Data Integration のインストール (Version 9.2)

# 目的
Pentaho Data Integration (PDI) の最新版であるバージョン9.2が2021年6月にリリースされていたことに気がついたので、改めてインストール方法を整理しました。
最近データ活用の前段としてデータ集約化をPDIでやるという仕事が多くなってきたので、使用するための情報を共有しておくことで、とりあえず何かのETLツールを試してみようかと思っている人のお役に立てばと思っております。

# 今回の環境
PDI 9.2
AdoptOpenJDK 8
※サポートしているOSやJavaのバージョンは以下を参照
https://help.hitachivantara.com/Documentation/Pentaho/9.2/Setup/Components_Reference

# Javaのダウンロードとインストール
AdoptOpenJDKは以下からダウンロードしてインストールしておきます。
JAVAHOMEなどの基本的なPathの設定も行っておきます。
https://adoptopenjdk.net/

# PDIのダウンロードとインストール
以下からダウンロードします。
https://sourceforge.net/projects/pentaho/files/Pentaho-9.2/client-tools/
![pdidownload_92_a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/c727e7ef-7234-3c75-4607-83139c2a737a.png)

ダウンロードしたZIPファイルを解凍してできる"data-integration"フォルダを適当な場所に配置してインストールは完了です。

# 起動方法
Windowsの場合のPDIの起動は以下のように行います。
![pdirun_92_a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/1d9600e0-3d6e-536f-6bda-19a6221a34ab.png)

Macなどの場合は以下のように行います。

```
$ cd data-integration
$ ./spoon.sh
```

以下の様に起動すればOKです。
![pdispoon_92_a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/04325644-49e0-ad34-24ac-dd67f9b41958.png)

# 設定
設定については特に変わってないので、以下を参照。
[Pentaho Data Integrationのインストールと基本設定] (https://qiita.com/mik/items/8a36e8efb06367c82b41)

# 使用方法
インストール後は、以下もご参照ください。
[Pentaho Data Integration 入門編(1) - 機能概要と用語整理] (https://qiita.com/mik/items/99ba6fefebc3e06e5d4d)
M5Stack Core2: stack overflow エラーの対策

次の記事を参考にしました。
[ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ](https://www.mgo-tec.com/blog-entry-trouble-shooting-esp32-wroom.html/7)

>Arduino core for the ESP32のsetup関数やloop関数内のスタックサイズは8192byteと定義されていて、
>それを超えて巨大な配列を定義してしまうことが原因です。

stack overflow を起こすプログラム

```text:test_stack_ng/test_stack_ng.ino
// ---------------------------------------------------------------
/*
	test_stack_ng.ino

					Sep/07/2021
*/
// ---------------------------------------------------------------
#include <M5Core2.h>

// ---------------------------------------------------------------
void setup() {
	M5.begin();
	M5.Lcd.setBrightness(32);
	delay(500);
	Serial.println("*** setup *** aaa ***");
	delay(500);
	Serial.println("*** setup *** bbb ***");
	delay(500);
}						 

// ---------------------------------------------------------------
void loop()
{
	const int max_ary = 8192;

	Serial.println("*** loop ***");
	delay(1000);
    
	uint8_t arry[max_ary];

	for(int it = 0; it < max_ary; it++)
		{
		arry[it] = 123;
		}
  
	Serial.println(arry[max_ary - 1]);

	delay(2000);
}

// ---------------------------------------------------------------
```

実行結果

```text
$ cu -s 115200 -l /dev/ttyACM0
Connected.
*** loop ***
***ERROR*** A stack overflow in task loopTask has been detected.
abort() was called at PC 0x4008a540 on core 1

ELF file SHA256: 0000000000000000

Backtrace: 0x4008a2b0:0x3ffafde0 0x4008a529:0x3ffafe00 0x4008a540:0x3ffafe20 0x4008c126:0x3ffafe40 0x4008dd14:0x3ffafe60 0x4008dcca:0xad91e006

Rebooting...
```

対策したプログラム
>malloc free を使って領域を確保します。

```text/test_stack/test_stack.ino
// ---------------------------------------------------------------
/*
	test_stack.ino

					Sep/07/2021
*/
// ---------------------------------------------------------------
#include <M5Core2.h>

// ---------------------------------------------------------------
void setup() {
	M5.begin();
	M5.Lcd.setBrightness(32);
	delay(500);
	Serial.println("*** setup *** aaa ***");
	delay(500);
	Serial.println("*** setup *** bbb ***");
	delay(500);
}						 

// ---------------------------------------------------------------
void loop()
{
	const int max_ary = 8192;

	Serial.println("*** loop ***");
	delay(1000);
    
//  uint8_t arry[max_ary];
	uint8_t *arry = (uint8_t *)malloc(max_ary);

	for(int it = 0; it < max_ary; it++)
		{
		arry[it] = 123;
		}
  
	Serial.println(arry[max_ary - 1]);

	free(arry);

	delay(2000);
}

// ---------------------------------------------------------------
```

実行結果

```text
$ cu -s 115200 -l /dev/ttyACM0
Connected.
*** loop ***
123
*** loop ***
123
*** loop ***
123
*** loop ***
123
*** loop ***
123
```
python3でコーディングテストに受かるための自分メモ[9/7] (二重ループ、内包表記)

今回paizaでまたrun time errorで怒られた。
しかし、今回はうまく解決できた

###二重ループ
今回私が書いたプログラムは二重ループであった。
それで処理時間が長いと怒られたのだが、
二重ループ以外でこの問題を解決する方法がわからなかったので、
愚行かと思ったができるだけ書き方のみでプログラムの実行時間を短くできないか取り組んだ。

###ループで回す対象をrange(int)からlst
最初はrangeで数字を回し、
二次元配列にindexでアクセスしていた。
これをlistでループを回しアクセスするときは一次元配列にした。
これでだいぶ実行時間が早くなり、エラーが解消された。
ちなみに、listをループを回したのは外側だけであり、
内側はindexのままである。

###結論
paizaにrun time errorで怒られた原因は
二重ループが原因だったというより、多次元配列に二重ループでアクセスしたことにより、実行時間が膨らんだことが原因だった模様。

### 調べてわかった新たな知見
ループでindexを回すのであればできるだけ、配列を回した方が実行時間が早くなる
listの初期化では内包表記を使った方が少し早くなる。
Snipping Toolでドロップダウンメニューをキャプチャーする方法

## 0.0 はじめに
画面キャプチャーによく使用するSnipping Tool（Windows標準アプリ）でドロップダウンメニューをキャプチャーする方法の備忘録。

## 1.0　方法

###### 1.1　Snipping Toolを起動
###### 1.2　新規作成で切り取りモードを起動
###### 1.3　Esc キーを押して切り取りモードから離脱
###### 1.4　表示したいドロップダウンメニューを表示
###### 1.5　Ctrl キー ＋ Print Screen キーを同時に押して切り取りモードを起動
###### 1.6　キャップチャーしたい箇所をドラッグして選択する

## 2.0　ショートカットキー
Snipping Toolを起動せずに行えるので便利

###### 2.1　ドロップダウンメニューを表示
###### 2.2　Windowsロゴキー + Shiftキー + Sキーを同時に押す
###### 2.3　キャップチャーしたい箇所をドラッグして選択する
###### 2.4　クリップボードにコピーされます。
###### 2.5　使用したい場所でペースト（Ctrlキー ＋ Vキー）して使用する
Windows10 で Unity Android buildに失敗したこと。（Gradle failed、原因 license agreement 不足をsdkmanagerで解決（Windows）

**発生した問題**

UnityHub より AndroidSDK のインストールも行った。
次に、実際にAndroidビルド実行時にGradlebuild失敗となった。

エラーログ等をキャプチャしてなかったがとりあえず、以下のような雰囲気のエラーが出た。
Android SDKをインストールしてパスが通ってる状態です。

>build-tools;29.0.2
>license agreement

**解決**
license同意を行えば良いという情報を得て実行したところ解決した。
cmd から行いました。（PowerShell等もお使いください。この場合.bat拡張子まで書く必要があるらしい。）

注意点：　cmdは管理者権限で実行する必要がある。
（コマンドを実行すると最初に進捗5%まで進んだりするし、エラーログ呼んでも権限の問題だと認識できなかった。）

1. `<AndroidSDK>\tools\bin\sdkmanager.bat` が存在するフォルダ（bin\）へ移動します。
1. `sdkmanager "build-tools;29.0.2"` を実行します。
1. `sdkmanager --licenses` を実行して全て yes にします。


Macに慣れた後、windows開発を始めて慣れておらず罠に陥った感ある。
実際はログを読んでググるを繰り返せば大抵は何とかなる。（頭は良くならないが）
Unity 2018 3D表示を2D表示にする方法

##0.0 はじめに
Unityにて2Dゲーム設定だけどなぜかSceneビューが3D風になった時の対処方法です。結構悩んだので備忘録です。

##1.0 変更方法
Windowメニュー → Rendering  → Lighting Settingsを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/2d6c539f-2e94-f192-5da2-71890623d3d9.png)

Skybox MaterialをNoneに変える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/6ffeb401-6f9d-d27d-7ff9-24ae32656558.png)






##2.0 変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/e8cfbdbd-6ce4-1cee-1868-dc1304a85762.png)


##3.0 変更後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/7eea8b5f-1d90-96b8-3f29-bf8cb5d9b706.png)
python3  指定範囲だけ大文字にする （＋改行なしの出力）

####スペース区切りの2つの整数と、文字列が入力されます。2つの整数の範囲の部分文字列を、大文字にして出力してください。

```
a,b = input().split()

a = int(a)-1
b = int(b)

st = input()


print(st[0:a], end="")
print(st[a:b].upper(),end ="")
print(st[b:])
```

入力例
2 6
Welcome to the paiza! I`m studying ruby!

出力例
WELCOMe to the paiza! I`m studying ruby!

##ポイント　end="" 改行無しの出力
print毎に出力される文字列が改行される事は問題ないのですが、もし改行を入れたくない場合は、print関数にオプションの　end = “” 　を設定します。　

先程と同じ文字列をprintに指定し、1行目のprintにオプション　end = “” 　を設定しました。

```
print("1 2 3 4 5 ",end = "") 
print("A B C D E")
```

実行：

1つ目のprintで出力される文字列に改行が無い為、1行目と2行目が横並びで出力されました。

```
1 2 3 4 5 A B C D E
```
Google Cloud Functions(Python) でIP制限を行う

# 背景
Google Cloud FunctionsでIP制限を行いたい。
VPCSCやCloud Load Balancer経由のアクセスにすることによってIP制限を行う方法があるが、少し面倒。
今回はシンプルにpythonコードでIP制御をすることにした。

# 実装
Google Cloud FuntionsのPythonはFlaskで実装されている。
Flaskのリクエスト元アドレスは `request.remote_addr` で取得できる。

```py
import ipaddress

def ip_allowed(ip):
    ip = ipaddress.ip_address(ip)
    nw = ipaddress.ip_network(ip_range)
    return (ip in nw)


def main(request):
    if not ip_allowed(request.remote_addr):
        raise Exception(f"IP not allowed: {request.remote_addr}")
    return 'IP allowed.'
```

# 参考
- [Get IP address of visitors using Flask for Python](https://stackoverflow.com/questions/3759981/get-ip-address-of-visitors-using-flask-for-python)
- [python ipaddressモジュールを使ってみたら便利だった話](https://qiita.com/Mabuchin/items/161d33f845ec0aeeb777)
python3 任意の文字を抽出する（記録）

###スペース区切りの2つの整数と、文字列が入力されるので、2つの整数の範囲の部分文字列を出力してください。

```
a,b = input().split()

a = int(a)-1
b = int(b)

st = input()

print(st[a:b])
```

入力例2
2 6
Welcome to the paiza! I`m studying ruby!

出力例2
elcom