OmniAICreator/Qiita-1.07M huggingface dataset:
Android studioをアップデートしたらactivity_main.xmlのコンポーネントを使用できなくなった

##何もしてないのにactivity_main.xmlが壊れた！！
本に従ってAndroidアプリを作成していたところ，なんでもないところでエラーが発生するようになった．
例えばこういうところ．


![スクリーンショット 2021-05-29 20.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391711/948bec27-5c60-5980-4bd0-fc9cc3af4926.png)


このbtStartが赤文字になり，Unresolved referenceだという．
上のbtStartはButtonの処理についてだが，Buttonに限らず同じ現象になる．

真っ先にタイポの可能性を考えたが，activity_main.xmlを確認すると間違っていないようだった．

ここの記載は教本通りだし，これまでにも何度も書いている．

考えられることとして，直前にAndroid studioをアップデートしていた．

##そもそもactivity_main.xmlのオブジェクトをどうやって取得しているのか

基本的にはfindViewByIdを使ってボタンオブジェクトを取得する．

```
val btStart = findViewById<Button>(R.id.btStart)
```
(実際，別の教本ではfindViewByIdを使った方法を使用している．)
これを毎回実行するのが面倒なのでkotlin-android-extensionsというpluginを使用することで冒頭のような書き方ができる．

##kotlin-android-extensionsを追加する
pluginをどこで読み込んでいるのか確認する．
app/build.gradle(:app)を覗いていみた．
アップデート前から使用している他のファイルはこんな感じ：

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

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

（以下省略）
```
今回新規に作成したプロジェクトのファイルは次のような内容になっていた：

```
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

（以下省略）
```
どうやらkotlin-android-extensions　のプラグインが入っていないらしい．
これを入れてみる．

```
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}
```
あとはMainActivity.ktでimportする．
```import kotlinx.android.synthetic.main.activity_main.*```
を追加すると無事エラーが消えた．

##pluginの書き方が変わっている点
上の比較を見ると同じpluginが使われていることがわかるが，書き方が若干変わっている．
．．．なぜなのか．

調べてみるとそれらしき記載が見つかった．
[Gradle](https://kotlinlang.org/docs/gradle.html)
>The version should be literal in this block, and it cannot be applied from another build script.
>Alternatively, you can use the older apply plugin approach:
>```apply plugin: 'kotlin'```
>It's not recommended that you apply Kotlin plugins with apply in Gradle Kotlin DSL – see why.

どうやら```apply plugin: 'kotlin'```は推奨されていないらしい．
これからは```plugins {id 'com.android.application}```を使った方が良さそう．
（というか最初からそうなっているのだろうが．）


##めでたし，めでたし．　というわけでもない
この件について調べているとこんな記事が見つかった．
[Kotlin Android Extensions の未来](https://developers-jp.googleblog.com/2020/11/the-future-of-kotlin-android-extensions.html)
これを読む限り，kotlin-android-extensionsは推奨されておらず，近々削除されkotlin-parcelizeというのに変わるとのこと．
ここらへんは追々修正していかなければいけないようだ．
FragmentのComposeエラー：ViewTreeLifecycleOwner not found from androidx.constraintlayout.widget.ConstraintLayout

# 背景
FragmentでJetpack Composeを使う時の書き方を以前書きましたが、Fragmentに対してComposeやろうとしたらエラーになったので、その備忘録

https://qiita.com/kazu_developer/items/975c8595c318b0a1c68b

# エラー時のgradle
``` gradle
implementation 'androidx.appcompat:appcompat:1.2.0'
```

# エラー内容
``` bash
Process: com.example.mapping_sample, PID: 15392
java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from androidx.constraintlayout.widget.ConstraintLayout{81a9941 V.E...... ......I. 0,0-0,0 #7f080076 app:id/container}
    at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:242)
```

# 解決したgradle
``` gradle
implementation 'androidx.appcompat:appcompat:1.3.0'
```

ここにはハマった・・・汗
php-webdriverでエラーが発生し、要素の取得ができない

##現象
```php
echo $driver->findElements(WebDriverBy::tagName("a"))[1]->getText();
```
など、要素を取得しようとすると、

```php
Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: GET /session/d6ad6784c4b4c042ffaefe2def5a305f/element//text
```

を表示。（sessionの後の値は都度変わる）

```php
//Googleのホームページに移動
$url = 'https://www.google.com/';
$driver->get($url);

//終了
$driver->quit();
```

など、起動や終了は問題なくできます。


##原因
php-webdriverのバージョンが古いことが問題でした。

バージョンを指定せずにインストールしていたので、最新版が入っているとばかり思っていましたが、バージョンを確認すると、1.3.0でした。（1.3.0は2017年リリース。2021年6月9日現在の最新版は1.11.1）

https://packagist.org/packages/php-webdriver/webdriver

↑ ここから確認すると、1.4.0からはext-zipが必要になっており、使用しているmacのPHPのバージョンではext-zipが使用できなかったため、1.3.0になってしまったようです。

##対応

PHPのバージョンを上げて、php-webdriverの最新版をインストールしたら、無事動作するようになりました！
date-fns の differenceInDays を気軽に使うとハマる件

気をつけましょう…

## ハマり点その1

```js
console.log( differenceInDays(new Date(1951, 4, 7), new Date(1951, 4, 8)) );
console.log( differenceInDays(new Date(1951, 4, 6), new Date(1951, 4, 7)) );
console.log( differenceInDays(new Date(1951, 4, 5), new Date(1951, 4, 6)) );
```
↓

```terminal
-1
0   👈
-1
```

これは1951年5月6日が夏時間開始日で23時間しかなかったから、
というわけでUTCで計算すれば

```js
console.log( differenceInDays(Date.UTC(1951, 4, 7), Date.UTC(1951, 4, 8)) );
console.log( differenceInDays(Date.UTC(1951, 4, 6), Date.UTC(1951, 4, 7)) );
console.log( differenceInDays(Date.UTC(1951, 4, 5), Date.UTC(1951, 4, 6)) );
```
↓

```terminal
-1
-1
-1
```
OK。

## ハマり点その2

```js
console.log( differenceInDays(Date.UTC(1951, 8, 10), Date.UTC(1958, 6, 1)), (Date.UTC(1951, 8, 10) - Date.UTC(1958 ,6, 1)) / 86400000 );
console.log( differenceInDays(Date.UTC(1951, 8,  9), Date.UTC(1958, 6, 1)), (Date.UTC(1951, 8,  9) - Date.UTC(1975, 6,1 )) / 86400000 );
console.log( differenceInDays(Date.UTC(1951, 8,  8), Date.UTC(1958, 6, 1)), (Date.UTC(1951, 8,  8) - Date.UTC(1975, 6,1 )) / 86400000 );
console.log( differenceInDays(Date.UTC(1951, 8,  7), Date.UTC(1958, 6, 1)), (Date.UTC(1951, 8,  7) - Date.UTC(1975, 6,1 )) / 86400000 );
console.log( differenceInDays(Date.UTC(1951, 8,  6), Date.UTC(1958, 6, 1)), (Date.UTC(1951, 8,  6) - Date.UTC(1975, 6,1 )) / 86400000 );
```
↓

```terminal
-2486 -2486
-2487 -2487
-2487 -2488  👈
-2488 -2489  👈
-2489 -2490  👈
```

！？ 
（ちなみにこの1951年9月8日は平和条約が締結された日ですが、関係あるのだろうか？）
WinBox.js に感動した

## 公式

https://nextapps-de.github.io/winbox/

### 使い方

```html:index.html
<script src="https://rawcdn.githack.com/nextapps-de/winbox/0.2.0/dist/winbox.bundle.js"></script>
<link rel="stylesheet" href="https://nextapps-de.github.io/winbox/demo/style.css">

<button onClick="new WinBox('Custom Root');">button1</button>
```

![123.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/b23afbd9-3e40-f672-3c87-c406bbcb3ead.png)


## メモ: 後で見る

https://www.moongift.jp/2021/06/element-github%e8%a3%bd%e3%81%aeweb%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88/
インタープリタを作る その18

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
avr studio4で、動作を確認した。

#投入したソース

```
	ldi	r16, 0x00
	ldi	r31, 0x30
	inc	r16
	inc	r31
	cpi	r16, 0x09
	brne	PC - 3


```

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/edbd345a-858f-a96c-9a68-7052f62be188.jpeg)


以上。
MySQL データの値のレンジで出力内容を指定する

# 目的

- MySQLのselect句などの出力するレコードの指定で、指定カラムの値をレンジで指定する方法をメモ的にまとめる

# 方法

- 下記の様に記載する。

    ```sql
    select *
    from テーブル名
    where カラム名
    between レンジの最上値（もしくは最下値） and レンジの最下値（もしくは最上値）
    ```

- 例えばusersテーブルのidが4から19のユーザー情報をselectで出力したいなら下記を実行する。

    ```sql
    select *
    from users
    where id
    between 4 and レンジの19
    ```
【初歩】JavaScriptの読み込み console出力 HelloWorld!


##①html内でjavascriptを読み込む

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- htmlの中にjavascriptを読み込む場合 -->
  <script>
    console.log('Hello World!');
  </script>
  <!-- htmlの中にjavascriptを読み込む場合 -->
</body>
</html>
```


##②別のフォルダでscript.jsを読み込む場合


・jsフォルダの中に**script.js**を作ります。
![スクリーンショット 2021-06-09 18.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678283/63524966-760a-2358-e7d1-7928a34f0434.png)

・script.jsに記述
![クリーンショット 2021-06-09 19.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678283/bdff5d1f-2902-33cf-52fd-ee29118bd509.png)
**src属性でscript.js**のフォルダを読み込みます。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- jsフォルダでjavascriptを読み込む場合 -->
  <script src="js/script"></script>
  <!-- jsフォルダでjavascriptを読み込む場合 -->
</body>
</html>
```

・index.htmlを読み込んで、検証（option + command + I）
consoleを選択してHelloWorld!と出てればOKです。
![スクリーンショット 2021-06-09 19.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678283/4e4ae315-097e-807c-1c4f-150b4658ece6.png)
結合テスト　select

テキストボックスまたはテキストエリアに文字を入力する

```rb
<label for="blog_title">タイトル</label>
<input type="text" value="" name="blog[title]" id="blog_title">
```

```rb
fill_in 'タイトル', with: 'あけましておめでとうございます。'
```

セレクトボックスを選択する

```rb
<label for="japanese_calendar">和暦</label>
<select name="japanese_calendar" id="japanese_calendar">
  <option value="0">明治</option>
  <option value="1">大正</option>
  <option value="2">昭和</option>
  <option value="3">平成</option>
</select>
```

```rb
select '平成', from: '和暦'
```

>https://qiita.com/jnchito/items/607f956263c38a5fec24
>https://qiita.com/Hiroaki_Sameshima/items/f1f568fd65d80fe9d433
Sql Server varbinaryをvarcharに変換して表示

## 参考サイト
* [varbinaryを文字列に変換する](https://www.it-swarm-ja.com/ja/sql/varbinary%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8Bsql-server/1067837549/)

## クエリ

```
SELECT CAST(myBinaryCol AS VARCHAR(MAX))
FROM myTable
```
制御構文 while [Ruby]

###  while

いつもwhile文の利用の仕方を忘れるので、ここに記しておく。

```ruby
while 条件式 do
  実行する処理1
  実行する処理2
	:
end
```

なぜ忘れるのかというと、whileの条件式がtrueの場合ループするのか、falseの場合ループするのか忘れてしまうからである。

そこで、英語の意味を思い出してみた。
（接）while SV：~~の限り、SVする。

これに準じて覚えると、**条件式がtrueの限り**、ブロック内の処理を繰り返す。
ということになる。Ruby便利〜
[Lambda] [Node.js] ZIPによるコードのアップロード時にハマったこと

## はじめに
Lambdaのチュートリアルで作成するHello,world!を表示させる関数は、実装からデプロイをAWSコンソール上で完結します。

しかし、ビルド時に必要なモジュールがある場合は、ファイルサイズが大きくなってしまうため、ZIPによるコードのアップロードが必要になります。

そのときに少しハマってしまったので、この記事で解説したいと思います。
（AWSコンソールのUIはかなりの頻度で変更されて、戸惑うことがあるかもしれないので、画像を使用せずに解説します。）

## アップロードまでの手順

1. 新規フォルダを作成、デプロイしたいindex.jsとpackage.jsonを格納
2. `node -v`でnodeのバージョンを確認
3. `$npm install`でビルド
4. `$zip -r project.zip *`でzipを作成
5. project.zipをAWSコンソール上でアップロード
6. 手順2で確認したnodeのバージョンにランタイムのバージョンを合わせる。
  

**注意事項**

- package.jsonには、[aws-sdkモジュール](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-deployment-package-nodejs/ )が必須
- [zipコマンド](https://zenn.dev/ifuriito/scraps/68710fb8ca24d0)は、index.jsがある階層で実行（**Runtime.HandlerNotFound**というエラーが出ます。原因はパスが通っていなくて、ハンドラが見つからないこと）


## さいごに

今回は、ZIPによるコードのアップロード手順を解説しました。

この解説により、たくさんあるNode.jsのモジュールを使って、実装できます。（パッケージサイズは、250MBまで）

ぜひ活用してみてください！！！
状態遷移図ランキング

状態遷移図について調べたときに参考になった記事

*第1位

https://qiita.com/stozaki/items/5b2da63054ff1b25db51

*第2位

https://qiita.com/kaizen_nagoya/items/7fddfa5d8bfb5a947db8

*第3位

https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48

*その他
https://qiita.com/daikan_murata/items/a0cd82c36d17508d02a2

いつもわかりやすい記事ありがとうございます
【At Corder】【初心者】ABC049C - 白昼夢 をRuby で解いてみた




#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:


https://atcoder.jp/home
# 問題文

文字列$S$は空文字列$T$の末尾に dream dreamer erase eraser のいずれかを追加して、$S = T$が成立するか判定せよ。

## 制約

- $1≤|S|≤10^5$
- $S$は英小文字からなる。

## 入力

```ruby
S
```

## 出力

$S=T$とすることができる場合は `YES` をそうでない場合は `NO` を出力

## 入力例

```ruby
erasedream
```

## 出力例

```ruby
YES
```

erase dream の順で$T$の末尾に追加することで$S=T$とすることができる。

# 回答

```ruby
s = gets.chomp
s = s.gsub(/eraser/,"").gsub(/erase/,"").gsub(/dreamer/,"").gsub(/dream/,"")
puts s.length == 0 ? "YES" : 'NO'
```

gsubを使う場合、()の中は正規表現じゃないとだめみたいなので注意。(最初配列を使ってeachで文字を順繰り消去しようとしたが、うまくいかなかった)

他の方の回答では、each、chom!メソッドを使って、末尾から消去していく方法もありました。

また、正規表現を使うと

```ruby
puts gets.match(/^(dream|dreamer|erase|eraser)+$/)? "YES" : "NO" 
```

と１行で表せてしまいます。

# 感想

今回は難しかったです。自力で解くことはできませんでした・・！

いろんな方の回答例を参照させていただいて形にしました。かなり勉強になりました🤔

初めて正規表現を使ってみました！使えるようになるまで結構時間がかかりましたが、これを格好良く使いこなせる様になりたいですね。

# 参考文献

[](http://doc.code161.com/ruby/string-delete-method/)

[Rubyで指定した文字列が含まれるか確かめる方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/21363)

[【Rubyの正規表現！】基礎の基礎から応用まで徹底解説！ | 侍エンジニアブログ](https://www.sejuku.net/blog/11692)

[はじめてのRuby！matchメソッドで正規表現によるマッチング | 侍エンジニアブログ](https://www.sejuku.net/blog/57417)

[AtCoder に登録したら解くべき精選過去問 10 問を Ruby のメソッドチェーンで解いてみた - Qiita](https://qiita.com/phocom/items/c94a0fba2c04f9e7a8f8)

[[Atcoder]ABC049C - 白昼夢 / Daydream[Ruby]](https://cloraordinary.com/atcoderabc049c-%E7%99%BD%E6%98%BC%E5%A4%A2-daydreamruby)
React Native iOSシュミレータのデバッグメニューを表示する


Android　エミュレータの command + M　に該当するショートカット
数ヶ月毎にWebとMobileいったりきたりして、いつも忘れてしまう
ググってもすぐでてこず、時間浪費・・・　　検索能力が低いだけか？

デバッグメニュー表示のショートカット
command + control + Z

Toggle Inspectorだけならコレ
cmd＋ i
Selenium Basic VBA で、ログイン状態を保ったままChromeを起動する

Seleniumでスクレイピングするとき、
スクレイピング用のChromeが立ち上がるとログイン状態が消えてしまう。
で、面倒なタイプのログインを要求するサイト（人間ですか？とか、メール送れとか）
だと、スクレイピングできない。

そこで、一度手動でログインしていれば
スクレイピング用のChromeもそのログイン状態を保ったまま起動できるという方法がある。
で、それのVBA版のいいやつがなかったので書いた。
参照設定はなんか必要な気がする。
ChromeDriverの取得などは別途やってください。

```vb
    Set Driver = New ChromeDriver '出力用のChromeDriver
    'ユーザーデータ用フォルダを作る
    Set wsh = CreateObject("WScript.Shell")
    path = wsh.SpecialFolders("MyDocuments") & "\chrome_logined"
    If Dir(path, vbDirectory) = "" Then MkDir (path)

    'ユーザーディレクトリを指定しつつChrome起動
    Driver.AddArgument ("user-data-dir=" & path)
    Driver.Start "chrome"
    
    '目的のサイトにアクセス
    Driver.Get "https://**********************"
    '※ここに、サイトのロードを待機するコードを書く

    '次に、ログインできていない時の判定文を書く。「Pleas login」と書かれたエレメントがあったらログインしてないとか。
    If ログイン失敗
        SetForegroundWindow Application.hwnd
        MsgBox "ログイン履歴を作るため、このツールで開いたブラウザで、一回ログインしてください。" & _
                vbCr & vbCr & "ログインできたら、このツールを再度実行してください", vbInformation
    Else
       'ログインしたあとの処理
    end if
```
Vue.jsのサイトをAWS S3にCodePiplineで自動デプロイ構築

今回は最近Vue.jsを始めたのでサイト公開にかかる固定費を安く抑えようとAWS S3のWebサイトホスティング機能を使います。あと自動デプロイもしたかったのでAWSのCodePiplineを使います。構成は下図の通りです。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/cc64f812-7873-233f-7ddc-6e10bdc34118.png" width="60%">


## Vue.jsのプロジェクトの配下にbuildspec.ymlを配置します。

このファイルでCodeBuildがファイルに基づきビルドを実行してくれます。<strong>インデントをきちんとしていないとビルドの時にエラーが出ます。</strong>

```buildspec.yml
version: 0.2
 
phases:
  pre_build:
    commands:
      - if [ -e /tmp/node_modules.tar ]; then tar xf /tmp/node_modules.tar; fi
      - npm install
  build:
    commands:
      - npm run build
  post_build:
    commands:
      - tar cf /tmp/node_modules.tar node_modules
artifacts:
  files:
    - '**/*'
  base-directory: dist
cache:
  paths:
    - /tmp/node_modules.tar

```


## S3の設定

まず、バケットを任意の名前で作成します。そしてプロパティ欄に静的ウェブサイトホスティングを<strong>有効化</strong>しましょう。

次にアクセス許可の欄でブロックパブリックアクセスを<strong>オフ</strong>にしましょう。

あと、バケットポリシーを編集しましょう。<strong>バケット名は自分のバケット名に直しましょう。</strong>



```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::バケット名/*"
        }
    ]
}

```

## CodePipelineの作成

任意の名前でパイプライン名を作成してください。

![スクリーンショット 2021-06-09 17.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/395f82ba-2aaf-ab2e-f89d-859efbd12667.png)

ソースプロバイダーにGithubを選択して、「Githubに接続する」をクリックしての自分のリポジトリと連携します。

![スクリーンショット 2021-06-09 17.43.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/f080ef39-83a2-2506-e5ab-144c147632c9.png)

プロバイダービルドを AWS CodeBuildを選択して、任意の名前でプロジェクト名を作成してください。

![スクリーンショット 2021-06-09 17.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/fed31195-f09e-11cb-a4aa-99fca206496e.png)

デプロイプロバイダーにAmazon S3を選択して、保存したいバケット名を選択し、<strong>バケットは空欄にしておいて、デプロイする前にファイルを抽出するにチェックを入れます。</strong>

![スクリーンショット 2021-06-09 17.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/62056cba-9c42-b832-b120-0972a9058101.png)

そして実際にGithubにpushすると自動でデプロイされているのがわかります。デプロイが成功したらS3の静的ウェブサイトホスティングに書かれているURLを開くと自分のサイトが公開されます！
OracleSQL備忘録

#OracleSQL 困ったときに

##カラム名が間違ってた！

```sql:TEST.sql
ALTER TABLE テーブル名 RENAME COLUMN 元のカラム名 TO 変更後のカラム名
例
ALTER TABLE TEST RENAME COLUMN NAME TO VALUE
```


##文字型が間違ってた！

```sql:TEST.sql
ALTER TABLE テーブル名 MODIFY (カラム名 変更後の文字型)
例
ALTER TABLE TEST MODIFY (NAME VARCHAR2(20))
```

##シーケンスの中身を確認したい

```sql
SELECT * from USER_SEQUENCES WHERE SEQUENCE_NAME = 'シーケンス名'
```

##シーケンスを特定の数字分加算したい

```sql
ALTER SEQUENCE シーケンス名 INCREMENT BY 数字 nocache
例
ALTER SEQUENCE TEST INCREMENT BY 1000 nocache
```
新卒の人と向き合う

社会にでて、何名か新卒の人と仕事をする機会に恵まれたのでそれを通して思った事と学んだこと。

新卒の人あるある
-
出会った新卒の人の傾向

+ **バットを振らない**
こちらから質問した場合、間違った回答をすると怒られると思っているのか判りませんが
とにかく答えない。
黙ってる人　や　即答でわかりませんの人がほとんどでした。

+ **根拠不明の確信**
指示していないのに、データのアップロードを行ったり
指示していないのに、○○を行います　と突然宣言して実行しようとしたり
え？なぜそれをやって良いと思った？というケースが度々。

+ **指示が伝わらない**
A,B,C,D　と作業を指示した後に結果を見てみると、E,B,C  という結果に。
Aの内容を理解できていなかったので全く違う作業を行ってしまったので　Eが出現。
Dはそもそも忘れてた。

結構ストレスになるので、なんとかしないとこちらが参ってしまうなーと思い始めた。
２～３人同時にも対応しなきゃならんし。

---

以下　これらを改善すべく実践してみた事

バットを振ってもらう
-
バットを振ってもらうために、質問を行うときにはいくつかのルールを設定する。

+ **質問に対しては絶対に回答をさせる**。
とにかく回答してもらう。時間の許す限り待つ。（最長記録2時間くらい

+ **わかりませんは回答としては認めない**。
何となく想像はついているけども自信が無いから答えないというケースがある。
その場合、本人は回答を聞けば自分の中で理解度が更新されるが、質問者は判らない。
その為こちらからの評価をいつまでたっても更新できない。

+ **どんな回答であれ否定しない**。
基本的には否定しない。
間違っても問題ないという意識を持ってもらう。

+ **質問の角度を変える**。
質問の内容が理解できずに回答できないという場合には、
文言を変えたり、質問の難易度を変えることで対応する。

+ **難しい文言を使わせない**
**難しい漢語・横文字**を使いつつ**敬語**まで気にして回答しようとすると、
言葉選びに意識が持っていかれてしまい、考えがまとまらない。
完全に意味を理解できていない単語を使うこと本人も何を言ってるのか理解できてないことが多い。
敬語は丁寧語くらいで十分。
とにかく**回答の内容**に集中してもらう。

これらは高校の漢文の教師が行っていた事を参考にさせてもらった。

実は裏技が存在しており、
その場で調べる　と　質問者の意見を聞いてみる　は禁止してない。


説明したことを説明してもらう
-
一通り説明が終わり、理解できたという場合には内容を説明してもらう。
自分の言葉で説明してもらうことで、

+ あやふやになっている部分を明確にする

+ こちらの意図と異なる理解をしている部分を明確にする

これらはバイトでお世話になったベンチャーの社長が行っていた事を参考にさせてもらった。

メモを取らせない
-
メモを取ることに必死になって話に追いつけなくなる人が多かったので、
なるべく事前にこちらで要点をまとめておいて、それを共有する前提で話を進める。
(画面みせながら説明してるのに、下向いてずっとメモとられるのもあまり良い気はしない）

もちろん、話に追いつけるのであればメモを取ってもらってかまわない。

事前に指示内容をまとめておくことで
備忘録になりつつ、説明する順番・内容を整理できるのでこちらにもメリットがあった。


意図の確認
-
こちらの指示からずれた結果を上げてきたときに、まずなぜそうしたのかを確認する。
確認すると何パターンか存在する

+ **指示通りに行おうとしたが、問題があり変更した**
問題の内容を正しく報告してもらい、次から同一の状況での対応を決める。
個人の判断で進めて良いが、事後報告をしてもらう。
または、問題にあたった時点で報告してもらう。

+ **指示を誤解していた**
まずはこちらの説明不足を謝罪する。
その上で再度説明する。

ここまでは確認と対応で比較的簡単に解決できる。

+ **指示は理解したが、なんとなくこっちの方が良いと思った**
+ **指示されていないけど、なんとなくやって良いと思った**

この**なんとなくシリーズ**が厄介。
まずは**なんとなく**を明確にして説明してもらう。（後付けでも構わない）
掘り下げていくと、本来**仮定**であるはずが想像力によって**確信**になってしまってる部分がある。
その**想像上の確信**を細々と説明してなぜそれが**仮定**であるべきなのかを理解してもらわねばならない。

例えば、
チェックに提出 -> OKが出る -> アップロード指示が出る　-> アップロードを行う　という工程があって、
**「もしかして　OKがでる = アップロードをしていい　という事？」**　という**仮定**が頭に浮かんだあと、
特に誰に確認するでもなく**「OKがでる = アップロードをする」**と勝手に**確信**してしまったケースがあった。
（この場合は事前の説明不足もあったので、以後説明に　明確な指示がない場合は勝手にアップロードをしないこと　と追記）

**なんとなくシリーズ**は、**仮定**を本人の思い込みによって無意識に**確信**に変えていってしまうことが多いので、
とても面倒だけれども逐一指摘して直していってもらうしかない。

そもそもの前提として
-
新卒の人には特になにも**期待をしない**ことにした。
こちらの都合で勝手に期待して、**それに応えられなかったら期待外れ**というのはあまりにも酷い。
まずは期待を一切捨て、日々の対応で理解度と出来ることを把握し、
絶対的な評価をするようにした方がお互いに気が楽だよなーと思ってる。
なるべく　期待しない旨　は理由込みで本人に伝えるようにしている。


('A)徹底し過ぎたせいか、あそこは軍隊と他部署から言われるようになった
[Ruby]select,select!で配列やハッシュを抽出する

## はじめに
Ruby学習者です。
本記事は`select`を使って配列を抽出したものです。
破壊的メソッドの`select!`についても記述します。
以下公式ドキュメントです

https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html

https://docs.ruby-lang.org/ja/latest/method/Hash/i/filter.html

## selectの使用例

###1.配列の場合
※ `even?`はレーシバーが偶数の場合に`true`を返すメソッドです

```
list = [1,2,3,4,5]
list = list.select { |num| num.even? }

p list => [2, 4]
```

###2.ハッシュの場合

```
hash = { "a" => 1, "b" => 2, "c" => 3 }
hash = hash.select {|k,v| v.even? }  

p hash {"b"=>2}
```

## select!の使用例
`select`には破壊的メソッド`select!`も用意されています。
破壊的メソッドはオブジェクトそのものを変更するものなので`list=`で代入する必要がなくなります。

###1.配列の場合

```
list = [1,2,3,4,5]
list.select! { |num| num.even? }

p list => [2, 4]
```

###2.ハッシュの場合

```
hash = { "a" => 1, "b" => 2, "c" => 3 }
hash.select! {|k,v| v.even? }  

p hash {"b"=>2}
```

##応用
`select`を応用した、例を記述していきます。

```
list =  ["tokorozawa", "yamada", "oyama", "yazawa"]
 
list.select! { |x|
  x.include?("zawa")
}
p list
=> ["tokorozawa", "yazawa"]
```

```
list = [1,2,3,4,5]
list.select! { |num| num > 3 }

p list => [4, 5]
```

## まとめ
* `select`を使うと配列やハッシュを抽出できる
* 他のメソッドと組み合わせるとさまざまなデータ処理ができる
【メモ】DQ10 バザー

■バザーの自動取得について
20分で作成したドラクエ10バザー相場取得プログラム
https://qiita.com/sfj1wara/items/9c607b29d52623cbfd8a


■モーモンバザー番地
ガタラ,採掘, 3788-3,こめこ
グレン,雪原,11919-4,シックスの
グレン,草原, 9527-5,ゼロ
オルフ,トゥ,12793-5,サクラ
ジュレ,臨海,16691-7,ひい　
ジュレ,浜辺,11997-1,ダルケル
アズラ,農村,13143-2,エイル
【GAS】複数の.gsファイルがあるときにスコープが自動で追加されず「xxxを呼び出す権限がありません」とエラーを吐かれる

##エラーが発生する条件

下記のように2つの.gsファイルに分けてコードを書き、test()を実行しようとすると例外が出て実行できない

```JavaScript:フォルダ読み込み.gs
const ID_DIR_SUB = "hogehogehogehogehogehogehogehoge";

const Dir_sub = DriveApp.getFolderById(ID_DIR_SUB);
```

```JavaScript:子フォルダ作成.gs
function test() {
  let Dir_new = Dir_sub.createFolder("testFolder");
}
```

##該当エラー文
エラー内容は下記のような感じ。普通だったら初回実行時に自動で必要なスコープを追加してくれるはずだが、複数ファイルにすると漏れるっぽい

>Exception: You do not have permission to call DriveApp.Folder.createFolder. Required permissions: https://www.googleapis.com/auth/drive
test	@ 子フォルダ作成.gs:2

##やったこと

1. 旧エディタに戻って
1. マニフェストファイルを開いて
1. スコープを明示的に記載する

##参考
[Qiita:GASのエラー”呼び出す権限がありません”はマニフェストファイルに問題あり](https://qiita.com/h-sto/items/fdde0905d0a4070d18fc) 
解決方法自体はこっちのほうが詳しいのでこちらを見ていただければ。今回の記事は「複数の.gsファイルを作った場合に発生する上記エラーが出る可能性が高いよ」っていう備忘として載せておく

##解決方法

マニフェストファイルを明示的に作成して、そっちでスコープを強制的に書き換える。

+ 旧エディタに切り替える  
※プロパディやマニフェストファイルをいじるメニューが新エディタにはないため  

+ 「ファイル>プロジェクトのプロパティ>スコープ」から、既存の(自動設定された)スコープをコピーしておく  
今回の場合はdrive.readonlyのみ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139599/bfffc5c4-e8c9-db8c-b3c0-277023df7b70.png)

+ 「表示>マニフェストファイルを表示」でマニフェストファイル(appsscript.json)を開く

```JSON:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

+ スコープに関する記述を追加して、既存スコープと強制的に追加したいスコープを記載する  
※今回は元々設定されてたスコープがdrive.readonlyだったので、driveを追加するだけでよし

```JSON:appsscript.json(変更後)
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes":["https://www.googleapis.com/auth/drive"
  ]
}
```
+ 保存して実行するとエラーが解消されているはず

##あとがき
普通に書く分にはスコープを自動で認識してくれるみたいだが、できない場合はちょっとめんどくさい。
新エディタになってからプロジェクトのプロパティとかスコープとか色々見れなくなってるのはやくどうにかしてくれないかな。
Selenium Basic VBA　で Inputの valueを取得できなくなったっぽい対策。2021/6/9

VBAマンの強い味方SeleniumBasicですが、
２０２１年６月はじめのChromeのアップデートにより、
どうやら element.value で　Inputの中のvalue値を取得することができなくなったぽいです。

今までは
`Chromedriver.findelementbyid("hoge").value
`
みたいにすればvalue値をとれていたのですが、無反応（というかデフォルト設定のまま）になります。
たとえば、sendkeyでInput要素に入力しても、それを.valueで取得することができません。
（だからsendkeyでちゃんと値が入ったかどうか確認できない）

しょうがないので、Input要素の中を全選択してコピーして、VBAでクリップボードから値を得る
という無茶苦茶な方法で対処することにしました。
（ChromeやChromeDriverの更新で不要になる可能性も高いです）

コード内の「Element」は他でChromedriver.findelementbyidでもしてください。
あと参照設定でMSFormsを使えるようにしておく必要があります。

```vb
Function getValuefromInput(Element)
    
    'クリップボードを空に
    Application.CutCopyMode = False
    
    With New MSForms.DataObject
        '一旦ダミー値をクリップボードに入れる
        With CreateObject("Forms.TextBox.1")
          .MultiLine = True
          .text = "|||||hogehoge|||||"
          .SelStart = 0
          .SelLength = .TextLength
          .Copy
        End With
        
        'キーボードを用意（Ctrlキーのため）
        Set Keyboards = New Keys
        
        '該当エレメントをクリックしてコピー
        Element.Click
        Element.SendKeys Keyboards.Control & "A" & "C"
        
        Driver.Wait 100
        'クリップボードの中身を取得
        .getfromClipboard
        mytext = .GetText
        
        'ダミー値のままだったら、空っぽってことで””を返す
        If mytext = "|||||hogehoge|||||" Then
            getValuefromInput = ""
        Else
            getValuefromInput = mytext
        End If
    End With
End Function
```
ransackで外部キーをつけているテーブルをソートする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/4ba5fcf8-c916-6b35-6eb3-f59173dbf94f.png)

## はじめに
Ransackを使ってソート機能を実装する際にうまく行かず、検索してもあまり出てこなかったのでまとめておきます。

## Ransackとは
RansackはRuby on Railsの検索機能を実装する際のGem（ライブラリ）です。
Railsで検索機能をつけるとしたらまず候補に上がるGemの**Ransack**。
検索機能を簡単に実装できますが、テーブルのソート機能も簡単に実装できます。

  
```console:ransackのインストール
gem 'ransack'
# Gemfileに追加して

$ bundle install
# bundle installしたら使えます。
```
Ransackの検索機能についてはこちらをみるとわかりやすいです。
> [Pikawaka【Rails】 ransackを使って検索機能がついたアプリを作ろう！](https://pikawaka.com/rails/ransack)

# Ransackでソート機能を実装する。
Ransackでソート機能を実装するには**`sort_link`**を使うと簡単に実装できます。
基本的なソート機能の実装はこう記述します。

```erb:ソートの構文
<th><%= sort_link(@q, :ソートしたいカラム名, "表示させたい名前" )%></th>
```
<br>
今回はこんなテーブル（表のこと）を例にしてみます。

```erb:index.html.erb
<table>
      <thead>
        <tr>
          <th>ID</th>
          <th>名前</th>
          <th>本の名前</th>
      </tr>
      </thead>

      <tbody>
        <% @results.each do |user|%>
          <tr>
          <td><%= user.id %>
          <td><%= user.name %>
          <td><%= user.book.book_name%></td>
        </tr> 
        <% end %>
      </tbody>
</table>
```

##### Usersテーブル
|カラム名|
|------|
|id    |
|name  |
|book_id|

##### Booksテーブル
|カラム名|
|-------|
|id     |
|book_name|



## 単純なソート機能


```erb:ソート機能実装①
<thead>
   <tr>
          <th><%= sort_link(@q, :id, "ID" )%></th>
          <th><%= sort_link(@q, :name, "名前")%></th>
   </tr>
</thead>
```

これだけで**id**と**name**でソート機能が実装できます。

それでは**Usersテーブルとアソシエーションを組んでいるbooksテーブルがあるとして、booksテーブルのbook_nameカラムをテーブル（表のこと）に表示させていた場合**に、ソートするにはどうしたらいいでしょうか？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/6de741df-4ddf-524e-4b14-fe56e297ee4e.png)

## アソシエーションを組んでいる別テーブルのカラムのソート
最初に単純にbook_nameと入れてみます。

```erb:ソート機能実装②
<thead>
   <tr>
          <th><%= sort_link(@q, :id, "ID" )%></th>
          <th><%= sort_link(@q, :name, "名前")%></th>
　　　　　　<th><%= sort_link(@q, :book_name, "本の名前")%></th>
   </tr>
</thead>
```

しかし、これではソートの矢印は表示されますがソートされません。

アソシエーションを組んでいるテーブルでソートするにはこうします。

```erb:アソシエーション組んだカラムのソート構文
<th><%= sort_link(@q, :子テーブル名_カラム名, "表示させたい名前")%></th>
```

アソシエーションを組んでいるテーブルの名前（単数）に`"_"`アンダーバーを入れて記述します。
この場合**テーブル名にアンダーバーが入ったり、カラム名にアンダーバーが入ったりすることもあると思いますが大丈夫**です。
先程のコードを修正してみます。

```erb:ソート機能実装②
<thead>
   <tr>
          <th><%= sort_link(@q, :id, "ID" )%></th>
          <th><%= sort_link(@q, :name, "名前")%></th>
　　　　　　<th><%= sort_link(@q, :book_book_name, "本の名前")%></th>
   </tr>
</thead>
```

これでbook_nameもソートできるようになりました。


## 中間テーブルを挟んだ際のソート
中間テーブルを挟んだ孫テーブルのカラムをテーブル（表のこと）に表示させていて、それをソートしたいということがあると思います。
その際はこのように記述すればソートすることができます。

```erb:中間テーブルを使った時のソート構文
<th><%= sort_link(@q, :子テーブル名_孫テーブル名_カラム名, "表示させたい名前")%></th>
```
<br>
## 終わりに
管理画面などで一覧表示させてソートさせて、検索したいということは多々あると思います。
その際に参考になれれば嬉しいです。
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/56075da3-e784-889e-9538-f09f2b2c3bdd.png)


> 参考サイト

-[Qiita Ransackのsort_linkで孫テーブルの値でソートする](https://qiita.com/san_you/items/06cb8301726c6b0861c9)
iOS アプリ　Reject されまくった件

iOS アプリの申請を行ったら以前にもまして厳しかった
１．位置情報取得許可とメディアへのアクセス許可の文言が気に入らないと言われた
　・ちゃんと理由を述べよと
　　　なんでこの機能を使用しないといけないのか　っていわれてもね
　　　　「XXXで音楽を演奏する楽曲を選択する為、むにゃむにゃ」
　　　でOKになった
　　　しかし。。。。。言語を英語も使用できる事にしたため切り替えにゃあかんといわれた
　　　ので、[InfoPlist.strings]の日本語、英語を作成しOKとなった

2.プロモビデオが小さい
　・実機でのレコード及び撮影を求められる為、画面レコーダで録画し⇒Mac取り込み iMove
　　縦長を横長のアスペクト比で編集した為、画面の両端に黒が、、、、、
　　結果解像度を変更しアップしたら小さいと。。
　　そもそもいiMoveで縦長扱えるのか⇒無理であることが判明

　　★ところが90°回転すれば良いことがわかり90°回転
　　　あれ、字幕が回転してないそれはそうか
　　　なので、テロップ画像をブルースクリーンで作りオーバーレイさせて対応（もちろんこちらも90°回転）

3.ここにきてICONにAppleのMaoの画像が使用されている？
　　・この画像前のアプリでも使用していたのに、しかもだいぶ前のMapアプリ画像
　　　（しょうがないので、しょぼい自作画像を作成）

4.ようやく、通過
　レスポンスは早い、以前に比べると雲泥の差⇒ここは評価したい

ってなわけで
　アプリ [LocationMusic2](LocationMusicは以前objective-Cでリリースしたが更新がなく削除されてしまった　⇒のあとだれか使用している？らしいので[2]をつけてしまいました）

随時アップデート予定
EC2って何?から始めるAWS

こんにちわ！Qiita初投稿です。
現在、「AWS上にDjangoで開発したwebアプリをgunicornとNginxを使ってデプロイした」という地点にいます。
まだまだエンジニア初学者ですので、Qiitaの記事にはいつもめちゃめちゃ助けて頂いています。
げ、MarkDown記法とわ？というレベルのブログ素人でもありますので、しばらくは僕と同じ目線くらいの初学者向けに「賢く、超簡単に」とモットーに投稿していきたいと思います。

まずはAWSのお話にて。

4月に社内の検討会で「作ったwebアプリをAWS上で立ち上げます」と言い放った後から始めましたが、「ぜ、全然わからん…」という不毛なスタートからようやく軌道に乗りました（泣）Djangoも本読んで覚えたままにスタートしたので幾度となく壁に突き当たりましたが「やいやいAWSさん、あなたもまた色々壁を用意しましたね」と泣きたくなるも大人なので泣かない日々です。

最初はとにかく名前です。VPCやAMIといった3文字の用語が多いこと。。論理演算子やK-分割交差検証やら日本語も大概でしたが、英語も割と大概じゃないか。。私は「演算子」の時点で「ん？」と序盤からつまづいたタイプです（汗）

そこで、まずはAWSでwebアプリをインターネットに公開する上で、大切なAWS用語をこれ以上ないほど簡単に説明します。

#初めに、AWSとは

AWS（Amazon Web Service）

AWSを端的に言うと「クラウドサーバーをサブスクで使えるサービス」です。
Elastic（伸縮自在）という言葉をあちこちに見かけますが、自前でサーバーを購入して運用するオンプレミスとは違い、まさにマシンパワーやストレージ容量などが使い方に応じて伸縮してくれるイメージで、いざ使うとオンプレミスとは比較にならないほど優秀だということがよーくわかります。
大量のアクセスがある時はその分だけパワーを用意し、使わない時は最小限に、という感じで、使った分だけの従量課金になります。その上、やろうと思えばコマンドライン操作無しでも大抵の事ができます。

オンプレミスが食材や調理場の手配から値段交渉までイチからやるのに対し、クラウドサーバーはまさに最新の調理器具がすべて揃った調理場が今すぐ使えて、コストも最適化されているので納得！という感じです。

そして更に！「1年間の無料枠」というハンパではない大盤振る舞いがあります。私もドメインの取得以外は現状0円です。
もちろん使い放題ではありません。ここまでは1年無料ですよ、という利用枠がありますが、対象の仮想サーバーを1年起動してても無料です。

#VPC

AWSのアカウント登録をした後、最初に「VPC」を設定すると思います。
VPCとは、virtual private cloud（仮想プライベートクラウド）の略です。

これは、AWSという広大な仮想空間のなかで、「ここはうちのエリアです」と仮想的な領域を決定するような感じです。

#リージョン

AWSは世界中の色んな場所にデータセンターがあります。
日本は東京と大阪にあります。このデータセンターがある物理的なエリアをリージョンと呼びます。
「東京リージョン」「大阪リージョン」といった感じです。

#アベイラビリティゾーン（AZ）

リージョンの中では、リスク分散などの為にデータセンターを3箇所や4箇所に分けて設置しています。東京は4箇所です。
「東京リージョンには4つのアベイラビリティゾーンがある」といった感じです。
クリック1つで、どのゾーンに仮想サーバーを構築するかを選択できます。

#サブネット

サブネットはあのサブネットです。AWS上ではCIDR表記（/24など）で設定します。
ちなみにサブネットは、現実世界で言えば「この部分のエリアにはこれを建てる」という枠を決める感じです。

AWSにはパブリックサブネットとプライベートサブネットの2つがあり、パブリックはインターネットと接続するエリア、プライベートはそうでないエリアです。

#EC2

Elastic Compute Cloud(Cが2つでEC2)

これがAWSにおける仮想サーバーです。
出ましたねElastic！

EC2の設定画面で、OS何にする？ストレージ容量は？など決めていきます。
すごい柔軟で、汎用用途向けや、データベース向け、GPU使用タイプなど様々な種類から仮想サーバーを構築できます。HDDにするかSSDにするかなどもクリック操作で構築できちゃうんです。スマート！

ちなみに、EC2を設定した後はAWSのコンソール画面からSSH接続できます。もちろんご自身のPCからTeratermなどのツールを使っても可能です。

#インターネットゲートウェイ

これが、EC2のパブリックサブネットとインターネットを接続してくれるゲートウェイです。
簡単な設定をした後、パブリックサブネットにアタッチするだけです。

#RDS

これは普通にリレーショナルデータベースサービスです。
アプリはパブリックサブネット、DBはプライベートサブネットに構築します。

#ElasticIPアドレス

また来ましたねElastic！
これが固定IPアドレスです。EC2は、再起動などするとパブリックIPアドレスが変わってしまいます。
そのため、インターネットに公開する場合はElasticIPアドレスを割り当ててあげます。

#Route53

あとはEC2でwebサーバーなどを設定すればインターネットに公開可能ですが、ドメイン名をつける場合はRoute53を使います。

Route53とは、AWSにおけるDNS（ドメインネームシステム）です。設定めちゃ簡単。。
空いてるドメイン名の検索や購入もすぐできますし、ElasticIPアドレスにドメイン名を割り当てるのもすぐに終わります。
初学者向けに、DNSとは要はグローバルIPアドレスに「〇〇．com」といったURLを割り当ててくれるシステムです。もちろんそれ以外の機能も担っています。


初めてなので、今回は以上でござる。
MarkDown記法もわからんかった奴ですが、これからも勉強継続します。
ネットは広大だわ。。

※この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
【React】Enterを押された時にコールバック関数を実行するを実装する

divなどの親要素などがクリック、又はエンターキーを押された時に関数を実行する書き方をまとめました。

### どう書くか

```ts:lib/pressEnter.ts
const PressEnter = (pressKey: string, callback: () => void) => {
  if (pressKey === "Enter") callback();
};

export default PressEnter;
```

```tsx:App.tsx
import { useState } from "react";
import PressEnter from "./lib/pressEnter";

export const App = () => {
  const [countNum, setCountNum] = useState(0);
  return (
    <div>
      <span
        tabIndex={1}
        onClick={() => setCountNum(countNum + 1)}
        onKeyDown={(event) =>
          PressEnter(event.code, () => setCountNum(countNum + 1))
        }
      >
        押すと値が増えるよ
      </span>
      <p>{countNum}</p>
    </div>
  );
};
```

ちょっと例が分かりづらいですが、こんな感じで書くことができます。
`event.code` を引数として渡し、どのキーが押されたかを判定して、関数を実行するかどうかを見ています。

`event.keyCode` は非推奨のため、こちらを利用しています。

### 利点

このように記載する理由として、テストを書きやすくするメリットがあるかなと考えてます。以下を分けてテストできるようになるためです。

- エンターキーを押して、関数が実行されるか(PressEnterでテストができる)
- 実行される関数は意図した挙動か

下記は Jest によるテストの例になります。

```ts:lib/pressEnter.test.ts
import PressEnter from "./pressEnter";

describe("#PressEnter", () => {
  const mockCallback = jest.fn();
  describe("when key pressed other than Enter", () => {
    PressEnter("KeyA", mockCallback);
    expect(mockCallback.mock.calls.length).toBe(0);
  });

  describe("when Enter key pressed ", () => {
    PressEnter("Enter", mockCallback);
    expect(mockCallback.mock.calls.length).toBe(1);
  });
});
```

また、複数のcomponent上でエンターキーが押されたら、、、という関数を書く必要がなくなり、DRYに書くことができますね。

今回のコードは codesandbox にまとめてあります。

https://codesandbox.io/s/elegant-grass-8z3tg

div 要素などにキーイベントを当てたい、などの場合の参考になればと思います。
Rails　Basic認証の導入

Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組み。
ブラウザ開いたらidとパスワードが求められるやつですね。

これはもう単純なんでコードをバシバシ記述していきます。
基本コピペで大丈夫

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth


  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == '自分の好きな名前' && password == '自分の好きなpass'
    end
  end
end
```

これで導入自体は出来てますが、しかしながらこれではあまりBasic認証を導入するメリットがありませんね？
何故ならコードを見れば、丸わかりだから。
Basic認証なんてセキュリティ上の問題で設定するのであって、これではまるで意味ないですね。
ということで、環境変数を使用しましょう。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth


  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end
```

これで、環境変数を読み込む記述になりました。

では環境変数を設定しましょう。

```ruby
vim ~/.zshrc
```
ターミナルで上記キーを実行して、「iキー」を押して、インサートモードに移行

```ruby
export BASIC_AUTH_USER='ユーザー名'
export BASIC_AUTH_PASSWORD='パスワード'
```
記述を追加したら「escキー」を押して、 「:wq」と入力
エンターを押す

```ruby
source ~/.zshrc
```

Herokuにデプロイしている場合は

```
heroku config:set BASIC_AUTH_USER="ユーザー名"
heroku config:set BASIC_AUTH_PASSWORD="パスワード"
git add .
git commit -m "自分で決めてください。"
git push heroku master
```

これで完了です。
Linux基礎学習まとめ④ シェルスクリプトの基礎知識

##概要
”ファイルを圧縮して、名前を変更して、不要ファイルを削除して、そのコピーを作成する"
みたいな繰り返し行われる処理の一連のコマンドを自動化するためのものを、シェルスクリプトという。
ここでやっとプログラミング要素が出てくる。
条件分岐や繰り返しなどを用いて処理を実行する。


##実行環境
- macOS BigSur 11.4
- CentOS7 (macOS上でLinux環境を構築する方法は[こちら](https://qiita.com/tamago3keran/items/781728815e359243ff33)を参考にしました)

##1. プログラムを構成する要素
1. 順次実行
2. 条件分岐(if, else)
3. 繰り返し(while, for)
4. サブルーチン(関数)

##2. シェルスクリプトの基本
例として、”カレントディレクトリに`test`というファイルを作成し、その詳細情報を表示させる”`test_script.sh`という名前のシェルスクリプトを作成する。

```Bash:test_script.sh
#!/bin/bash (利用するシェルの種類とそのコマンド位置を記述、シェルスクリプトのお約束みたいなもの？（C言語のint main(void){}みたいな）)
# '#'以降にコメントを書くことができる。コメントは処理に作用しない。

touch test #(ファイルの作成)
ls -l test #(ファイルの詳細情報表示)
```

作成したシェルスクリプトを実行する。

```
chmodコマンドで実行権限を与える。
$ chmod u+x test.sh

そして、以下のように実行する。(./はパス指定)
$ ./test.sh
-rw-r--r-- ... test
```

##3. 変数
####基本的な変数の宣言方法
```
変数への代入は'='を用いる
$ index=1

配列は[]を使って表現する
$ nbr[0]=123 
$ nbr[1]=456

変数の参照は`$`を用い、配列変数の場合は`${}`とする
$ echo ${nbr[$index]} 
456
```

####シェル変数と環境変数
- シェル変数 : 実行しているシェル内のみ有効な変数
- 環境変数 : そこ以降に実行されたコマンド内でも有効な変数

例） 二つの変数の違いを標準出力で確認する。

```Bash:test1.sh
#!/bin/bash
export x=123
y=456
echo x=$x in test1.sh
echo y=$y in test1.sh
./test2.sh
```

```Bash:test2.sh
#!/bin/bash
echo x=$x in test2.sh
echo y=$y in test2.sh
```
実行結果

```
$ ./test1.sh
x=123 in test1.sh
y=456 in test1.sh
x=123 in test2.sh (環境変数:x は引き継がれている)
y= in test2.sh (シェル変数:y は引き継がれない)
```

####変数を扱うコマンド集
定義した変数を一覧表示したり、標準入力から読み取ったデータを書き込んだりできる便利なコマンドをいくつかメモしておく。

```
$ read [variable_name]
変数に標準入力から読み取ったデータを書き込む。既にある場合は上書きされる。

$ set, unset [variable_name]
シェル変数の一覧表示と、削除を行うコマンド

$ env, unset [variable_name]
環境変数の一覧表示と、削除を行うコマンド
```

####引用符
文字列を引用符と呼ばれる記号で囲むと特殊な振る舞いをする。
その種類をメモしておく。

- ' '(シングルクォーテーション) : 文字列として認識される、変数参照の$も文字列となる。
- " "(ダブルクォーテーション) : 変数参照$も認識する文字列
- \` \`(バッククォーテーション) : 文字列をコマンドとして認識する


##4. 引数
####引数の扱いの基本
シェルスクリプトを実行する際に、実行コマンド名に続いて指定される値を引数という。
`$`の後に続く文字で引数を指定する。

- `$1, $2, ..., $n` : n番目の引数の値
- `$0` : 実行コマンド名
- `$#` : 引数の数

例）

```
$ ./args.sh aaa bbb ccc
$1: aaa
$0: ./args.sh
$#: 3
```

####shift文
引数の順序をずらすコマンド。
shiftを実行すると、`$2->$1, $3->$2, ... `となる。
これは、どこで使うんだろうシリーズ。

##5. エスケープシーケンス
`\`を用いるとその直後1文字の扱いを変更できる。
`””`や`''`などの引用符を表示したい時や、改行を入れたい時などに使用すると良い。

例）

```
$ echo "I am a cat. \
> As yet I have no name." (コマンドの途中で改行を入れても大丈夫になる)
I am a cat. As yet I have no name.

```
`\n`(改行)、`\t`(タブ)など特別な意味を持つ組み合わせもある。

##6. sourceコマンド
指定されたファイルを読みこんで、シェル環境を設定するコマンド。
`.zshrc` `.bash_profile`などシェル環境設定ファイルの設定を変更後、シェルにログインし直さずに設定を現在のシェル上に反映する際によく使われる。
aliasの設定とかした時にめっちゃ便利。

例）

```Zsh
$ vi ~/.zshrc
alias ..="cd .." (.zshrcを編集して、aliasを設定する)

$ source ~/.zshrc (変更した設定を反映)
$ .. (一つ上の階層に移動するaliasが設定できた)
```


##終わりに
今回は、シェルスクリプトについて簡単にまとめました。
エスケープシーケンスや引用符は、今回メモした以外にも様々な使い方があるため、調べておきます。
また、条件分岐や繰り返し、サブルーチンといった部分は次回書きたいと思います。

##参考文献
この記事は以下の情報を参考にして執筆しました。
- [Linux標準教科書(ver.3.0.2)](https://linuc.org/textbooks/linux/)
天文データ解析入門 その3 (astropyでのfitsの開き方, plot方法)

[以下追記] matplotlib のバージョンが3.7.0等だと、aplpy でエラーが起きるようです。
```python
TypeError: WCSAxes.__init__() got multiple values for argument 'wcs'
```

```
pip install matplotlib==3.5.2
```
などとしてダウングレードしてください。
[以上追記]
この記事からは python を使った fits 画像の取り扱いについて書いていきます。今回は、astropy.io.fits, numpy, matplotlib.pyplot, aplpy を用います。例として _Spitzer_ の 8.0 µm データを使用します。
https://irsa.ipac.caltech.edu/data/SPITZER/GLIMPSE/images/I/1.2_mosaics_v3.5/GLON_30-53/
から GLM_03000+0000_mosaic_I4.fits をダウンロードしました。

# fits の開き方

まず必要な module を import します。

```python
from astropy.io import fits
import numpy as np
from matplotlib import pyplot as plt
import aplpy
```
もし

```python
ModuleNotFoundError: No module named 'aplpy'
```
などと言われてしまった場合は、pip でインストールしましょう。

```
pip install aplpy
```

astropy.io.fits を使って fits を開きます。path は 絶対path でも 相対path でもどちらでも大丈夫です。

```python
hdu = fits.open("~/your/fits/dir/GLM_03000+0000_mosaic_I4.fits")[0]
```
後ろの [0] は普通は気にしなくて大丈夫です。hdu には header と data が格納されており、hdu.header や hdu.data と打つとそれぞれ返ってきます。header は辞書、data は numpy array です。

# fits の plot
まずは最も一般的な matplotlib.pyplot を使って data を plot してみます。

```python
plt.imshow(hdu.data)
plt.show()
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117814/c782a206-3cba-8a20-289f-9ff2c23310e8.png)
カラーレンジが悪くてほとんど何も見えません。log にしてみましょう。

```python
plt.imshow(np.log10(hdu.data))
plt.show()
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117814/fa919f8a-d391-11da-b5f9-e7643a9d4701.png)
ちょっと見えました。今は軸が pixel になっているので、これを座標にします。matplotlib でも可能ですが、aplpy という module を使えば簡単にできます。

```python
fig = plt.figure(figsize=(8, 8))
f = aplpy.FITSFigure(hdu, slices=[0], convention='wells', figure=fig)
f.show_colorscale(vmin=10, vmax=1000, stretch='log', cmap="Greens", aspect="equal")
plt.show()
```
![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117814/70643918-9a1b-69f0-57e7-1b146bdb9ab8.png)
ticks が外向きなのが気になる人は以下を実行しましょう。

```python
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
```
拡大図は recenter を使います。横軸の中心 (degree), 縦軸の中心 (degree), width (degree), height (degree) の順番で渡します。

```python
fig = plt.figure(figsize=(8, 8))
f = aplpy.FITSFigure(hdu, slices=[0], convention='wells', figure=fig)
f.show_colorscale(vmin=10, vmax=1000, stretch='log', cmap="Greens", aspect="equal")
f.recenter(30.5, 0.0, width=1.0, height=1.0)
plt.show()
```
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117814/4de103b1-019c-9a23-7a4a-91b2d1b661e0.png)
その他 カラーバー, スケールバー, マーカーなど一通りの機能ももちろん備わっています。ドキュメントを参照して描きたい図を作りましょう。
https://aplpy.github.io/

3D fits (cube) の場合も基本的には同様で、slices=[0] の 0 部分を plot したいチャンネルに変更します。

# よくあるエラー
### ALMA の cube データがうまく開けない！
ALMA データはデフォルトでは 4軸目に Stokes parameter が入っています。しかも3軸目がfrequencyです。
casaで一回読み込んで出力すると大抵うまくいきます。[casa](https://casa.nrao.edu/) のターミナルを起動して、

```python
importfits(fitsimage="yourfits.fits", imagename="yourfits.im")
exportfits(imagename="yourfits.im/", fitsimage="yourfits_new.fits", velocity=True, dropstokes=True, overwrite=True) 
```
で出てきた fits を使いましょう。

リンク
[目次](https://qiita.com/Shinji_Fujita/items/ecb869e5b6a9fa468483)
jQueryでXML操作するとき、findばっかりな件について

qiitaで「jquery　xml」で検索すると、findを使ってデータを探すのが主流らしい。


https://qiita.com/7note/items/3f69c5ad833b999e424a
※すみません、勝手に例として使わせていただいてます。

```sample.html
 $(result).find("item").each(function() {
  $(".XMLRequest").append('<h3>' + $(this).find('title').text() + '</h3>' + '<p>' + $(this).find('link').text() + '</p>');
  });
```

どこで見かけたのか忘れたけど、find使わなくても書ける。

```sample.html
 $(result).find("item").each(function() {
  $(".XMLRequest").append('<h3>' + $('title', this).text() + '</h3>' + '<p>' + $('link', this).text() + '</p>');
  });
```

こんな感じで一般的ではないけど使えるテクニックって他にもありそう。マイナーな技術っぽいので、知っていたらおしえてください。
unityで自動でiosのローカライズ対応をする


##やりたいこと
アプリ名とかのローカライズの設定を毎回xcodeで設定が面倒なのでunity内で完結したい
アプリ名や、ios固有のATT表示の赤枠のメッセージなどが対象

|ATTの中のテキスト|アプリ名|
|---|---|
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64558/727bf420-678d-1ae7-ab35-a8eddd607fa8.png)|![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64558/8c7ea523-28ac-7cb1-cf23-fb29c41758ce.png)



##検証環境
unity 2019.3.0f6 / Xcode 12.4

#手順

###1,プロジェクトにローカライズのデータを設置

何処に設置してもよいが下記2点は守ること
　・ファイル名は`InfoList.strings` 　（末尾のsを忘れないこと）
　・格納するフォルダは対応言語に合わせること　日本語なら`ja` (jpと間違えないこと) 
　　　言語コードはコチラ参照https://qiita.com/hirobe/items/cb906cca486675d02a87

![001a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64558/a18d2971-ff1d-587c-f016-32bf363f15d4.png)
~~Base.lproj は用意されてない言語が端末で選択されているときに参照されるデフォルト用~~
(デフォルト用のつもりでしたが参照されて無い感じがしたのでbaseは見なかったことにしてください)

###2, `InfoList.strings`の編集
例としてfr.lproj/InfoList.stringsの中を記載

``` 
CFBundleDisplayName = "フランス";　 // アプリ名
```

ATTのメッセージを変えるなら `NSUserTrackingUsageDescription`を指定
このあたりの設定のkey 的なものの一覧がどこかにあるのだろうけどパッと見つからなかったので割愛

###3、PostProcessBuildで1で作成したデータを紐づける

PostProcessBuildとは、という説明は割愛

```C#
public class PostProcessBuild : IPostprocessBuildWithReport
{
	const string IOSPbxProjectPath = "/Unity-iPhone.xcodeproj/project.pbxproj";
	int IOrderedCallback.callbackOrder => default;

	void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport report)
	{
		var summary = report.summary;
		if (summary.platformGroup != BuildTargetGroup.iOS) {
			return;
		}

		string pbxPath = summary.outputPath + IOSPbxProjectPath;
		var project = new PBXProject();
		project.ReadFromFile(pbxPath);
		string targetGuid = project.GetUnityMainTargetGuid();
		// 指定パス以下にあるローカライズデータを紐づける
		string[] languageArray = new string[] { "Base", "ja", "fr" }; // 紐づけたい言語を記載
		foreach (string lang in languageArray) { 
			string dirPath = Application.dataPath + $"/Editor/Localisations/{lang}.lproj"; // project内に設置したパスを指定
			var lGuid = project.AddFolderReference(dirPath, $"{lang}.lproj");
			project.AddFileToBuild(targetGuid, lGuid);
		}
		project.WriteToFile(pbxPath);
	}
}

```
###間違えやすいこと（やってて間違えてたこと)

```C#
// 似たような関数があるので注意　project.GetUnityFrameworkTargetGuidではない
string targetGuid = project.GetUnityMainTargetGuid(); 
```


##ビルドして完了
いつものようにビルドをして書き出されたxcodeプロジェクトを開くと
指定したフォルダを見つけることができるはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64558/792809a3-fe10-1bda-0be6-ed7bb01c79db.png)

あとは端末の言語を切り替えながら動作チェックしてみてください
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64558/08646d3f-3049-1573-e70b-9f9bf5fb0f0c.png)


まとめ
---
androidはコチラでできるみたい
https://qiita.com/ptkyoku/items/3f25872ae0f356966c88

デフォルトの設定は後ほど探しておきます

その他まちがってたらおしえてください
railsにbootstrap導入


**1.gemに記入**
gem 'bootstrap', '~> 4.1.1'
gem 'jquery-rails','~>4.3.1'
↓
**2.ターミナルでコマンド入力**
bundle install
↓
**3.ターミナルでコマンド入力（cssをscssに変更）**
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
↓
**4.application.scssの中に下記を記入**
@import "bootstrap";
↓
**5.assets/javascripts/application.jsの中の**
//= require_treeの前に下記記入

//= require jquery3
//= require popper
//= require bootstrap-sprockets
【Rails】特定のメッセージlogのログレベルを変更する


config/environment.rb にて以下を記述する。

```
require_relative 'application'
Rails.application.initialize!

class Logger
  class Formatter
    def call(severity, time, progname, msg)
      if msg.include?("No route matches")
        severity = "ERROR"
      end
      msg = msg.gsub(/^\n/, "")
    end
  end
end
```

# 解説
ここで出てきた引数の
`msg`は **logメッセージ**
`serverity` は**ログレベル**

したがって上記の場合、「"No route matches" がメッセージに含まれるlogはERROR」
に変更される。
Java Excelで配列を作成

<p><strong>配列（array）とは、複数の要素（値）の集合を格納・管理するのに用いられるデータ構造です。今回もSpire.XLS for Javaという無料のライブラリを活用して、Excelで配列の作成法を紹介します。</strong></p>
<p><strong>下準備</strong></p>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160017.png" alt="f:id:lendoris:20210609160017p:plain" width="545" height="198" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><br /><br /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160021.png" alt="f:id:lendoris:20210609160021p:plain" width="268" height="93" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class InsertArray {

    public static void main(String[] args) {

        //Workbook objectを作成します。
        Workbook wb = new Workbook();

        //初めのシートを取得します。
        Worksheet sheet = wb.getWorksheets().get(0);

        //一列のデータを定義します。
        String[] oneDimensionalArray = new String[]{"リンゴ", "バナナ", "スイカ", "カキ"};

        // 指定するセルに配列を書き込み、trueは縦書きに、falseは横書きにします。
        sheet.insertArray(oneDimensionalArray, 1, 1, true);

        //二次元配列を定義します。
        String[][] twoDimensionalArray = new String[][]{
                {"名前", "年龄", "性别", "国籍"},
                {"王洋", "25", "男", "中国"},
                {"田中真理子", "24", "女", "日本"},
                {"ニック", "26", "男", "アメリカ"}
        };

        //指定するセルから、二次元配列をシートに書き込みます。
        sheet.insertArray(twoDimensionalArray, 1, 3);

        //保存します。
        wb.saveToFile("InsertArrays.xlsx", ExcelVersion.Version2016);
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160746.png" alt="f:id:lendoris:20210609160746p:plain" width="463" height="291" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
Java  Excel をSVGに変換

<p><strong>SVGはXMLベースの、2次元ベクターイメージ用の画像形式の1つです。今日はSpire.XLS for Javaという無料のライブラリを活用して、Excel をSVGに変換する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160017.png" alt="f:id:lendoris:20210609160017p:plain" width="545" height="198" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160021.png" alt="f:id:lendoris:20210609160021p:plain" width="268" height="93" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>元のファイル</strong></h4>
<p><strong> </strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160056.png" alt="f:id:lendoris:20210609160056p:plain" width="554" height="384" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.xls.*;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Map;

public class excelToSVG {
    public static void main(String[] args) throws Exception {
        //ファイルをロードします。
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");
        int count = 1;

        //ページの情報を取得します。
        List<Map<Integer, PageColRow>> pageInfoList = workbook.getSplitPageInfo();

        for (int i = 0; i < workbook.getWorksheets().getCount(); i++) {
           FileOutputStream stream;
           Worksheet sheet = workbook.getWorksheets().get(i);
            Map<Integer, PageColRow> integerPageColRowMap = pageInfoList.get(i);
            for (Map.Entry<Integer, PageColRow> entry : integerPageColRowMap.entrySet()) {
                PageColRow colRow = entry.getValue();
                stream=new FileOutputStream("(count++) + "-ExcelToSVG.svg ");

                //SVGで保存します。
                sheet.toSVGStream(stream, colRow.StartRow, colRow.StartCol, colRow.EndRow, colRow.EndCol);
                stream.flush();
                stream.close();
            }
        }
    }
}

```

<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210609/20210609160131.png" alt="f:id:lendoris:20210609160131p:plain" width="554" height="363" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>