OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】NextTokenの有無を判断して値を全部取る【boto3】

おはようアンダーソン君
これは私の備忘録だ。取っておきたまえ

#事の発端
AWS Lambda上でEC2のインスタンス情報(describe_instances）で掘り堀りする某スクリプトがありました。
instanceIDがすべて取れてないことに気づきました。
そう、boto3にはNextTokenという1度に取得に上限値が設定されているAPIがあるのです。

#なんだそれ
boto3のドキュメント読んでくだちい…だと何にもならないので…
例としてこちらをご覧くだしい
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instances

EC2のdescribe_instancesというAPI
ReturnのResponce Syntaxに
```'NextToken': 'string'```
という値があるはずです。

1度に取れる値が何件なのか？気になりますよね
**たぶん50件くらい？**　APIによるのかな。MaxResultsの値が上限ならdescribe_instancesは1000件までってことになるけど。
とにかくNextTokenがとかいうキーが「次はここから取りまっせ」の記号になります。

とりあえず全件取れるスクリプトをゴニョりました。
まぁ細かいことはサポートに聞くかドキュメント読んでくだちい（ひどい）

何！？この横着もの！とっとと結果をよこせだと！？
わかる。

#スクリプトサンプル例
```python
NextToken = None
while True:
    if NextToken is None:
        ec2_var = ec2_cli.describe_instances()
    else:
        ec2_var = ec2_cli.describe_instances(NextToken=NextToken)
    
    #EC2の戻り値（JSON）から必要な値を取得します。
    for Reservations in ec2_var['Reservations']:
        for instances in Reservations['Instances']:
            #ホスト名（タグ/Name）抽出
            ec2_list_nametag.append(instances['Tags'][0]['Value'])
            #ホストのインスタンスID抽出
            ec2_list_id.append(str(instances['InstanceId']))
            #ホストの配置AZ情報抽出
            ec2_list_az.append(instances['Placement']['AvailabilityZone'])
            #ホストのステータス抽出
            ec2_list_status.append(instances['State']['Name'])
    
    if not 'NextToken' in ec2_var:
        break
    NextToken = ec2_var['NextToken']
else:
    print(NextToken)

#抽出したEC2のリストの値を合体
ec2_list = [ec2_list_nametag,ec2_list_id,ec2_list_az,ec2_list_status]

#(例）AZ-Aにいるおめあてのホストを取得する。
for i in ec2_list[0]:
    if 'hoge' in i:
        num =ec2_list[0].index(i)
        if ec2_list[2][num] == 'ap-northeast-1a':
            hostname = str(i)

#（例）おめあてのステータス確認。
if hostname in != '': #お目当てがいたらじっこうしましょう
    for i in ec2_list[0]:
        if hostname in i:
            num =ec2_list[0].index(i)
                host_status = str(ec2_list[3][num])
else:
    print('おめあてが居なかったっぽい？')
```

#結果
上記のスクリプトを使用することで全件のインスタンス情報を変数に格納することができました。
ついでに内部のforで必要な値を掘り堀りしてリストにします。
EMRとかいうとんでもないオモチャのせいでEC2がハンパない数起動していても、サクッと取れるようになります。

###補足
しれっと多次元配列つかってますが、これを使うことで1個の全体量から色々と掘り堀りすることができるようになります。
何が言いたいかっつーとイチイチAPI叩いてご機嫌うかがってるとスロットリング起こしたり処理が遅くなったりするので
リトライ処理だなんだかんだを加えるなら、1発どかんで最初に取ったほうが楽じゃね？という理屈です。うわーこえー
で、そのリストは同じ戻り値を上からforでなぞれば順番同じじゃね？という理屈です。うわーこえー
内包型表記にしなかったのは見やすさ？誰が見てもわかってくれ～という私なりの気遣いです。
変数のメモリ使用量を考えろとか言われそうですが、AWS Lambdaなんかで実行する場合は多少気にしたほうがいいかもですね。メモリ量。

おしまい。
【Git】指定日からのマージコミットを抽出する

#当月のマージコミット数を集計したい

現チームでは毎月のリリース数を報告するのが通例なのですが、リリース数の多い月だと目視の集計が大変過ぎる！！
「よし、コマンドで抽出しよう！」

今月実際に以下のコマンドでマージコミットを抽出しました。

まずはブランチをmasterブランチに切り替えて

```
$ git checkout master
```

以下のコマンドで抽出します。

```
$ git log --since=2020-01-01 --merges --pretty=format:"%s" | grep "Merge" | sort | uniq
```

それぞれのオプションの詳細です。

```
【git logオプション】
--since=YYYY-MM-DD   : 指定日～現在まで
--merges             : マージコミットのみ
--pretty=format:"%s" : 件名のみ

【grepオプション】
sort                 : 並べ替え
uniq                 : 重複なし(連続する重複を集約するため、sortと組み合わせると正しく集約可能)
```


すると以下のように抽出されます。

```
Merge branch 'XXX-180'
Merge branch 'XXX-216'
Merge branch 'XXX-241'
Merge branch 'XXX-304'
Merge branch 'XXX-312'
Merge branch 'XXX-313'
Merge branch 'XXX-320'
Merge branch 'XXX-326'
Merge branch 'XXX-330'
Merge branch 'XXX-334'
Merge branch 'XXX-338'
Merge branch 'XXX-376'
Merge branch 'XXX-385'
Merge branch 'XXX-402'
```


マージコミットを抽出しているので直接masterブランチ上でコミットしていたり、チェリーピックをした場合などは抽出されないので注意が必要

##参考
https://qiita.com/take4s5i/items/15d8648405f4e7ea3039
https://qiita.com/harukasan/items/9149542584385e8dea75
https://gotohayato.com/content/490/
https://qiita.com/m_norii/items/4ea31acf727d384faa23
http://blog.nomadscafe.jp/2012/07/sort-uniq.html
[GCP]Ubuntuインスタンス作成 + リモートデスクトップ設定 + 日本語キーボード設定

# はじめに
GCPのCompute EngineへのUbuntuインスタンス作成方法、リモートデスクトップ設定方法、日本語キーボード設定方法をまとめています。

# 手順
## 1. GCP側のファイアウォールの設定
インスタンス作成の前にファイアウォールルールの設定をしておきます。
VPCネットワーク -> ファイアウォールルール を開き[ファイアウォールルールを作成]をクリックします。
以下の項目を入力した後、[作成]をクリックします。

|変更する項目|変更内容|
|:------|:------|
|名前|適当に入力します|
|ターゲットタグ|適当に入力します。私は上記の[名前]と同じにしています|
|ソースIPの範囲|RDPする接続元のIPアドレスを入力します|
|指定したプロトコルとポート|tcpにチェックを入れ、3389と入力します|

## 2. Ubuntuインスタンス作成
Compute Engine -> VMインスタンス を開き[インスタンスを作成]をクリックします。
ブートディスクでUbuntuを選択し、[選択]をクリックします。

次に[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー]をクリックし、[ネットワーキング]のタブを選択します。
[ネットワークタグ]にファイアウォールの設定時に入力した「ターゲットタグ」を入力します。
これで先ほど作成したファイアウォールルールが適用されます。

最後に[作成]をクリックします。

## 3. RDPの設定
作成されたインスタンスにSSHでログインします。
インスタンス一覧の右側の[SSH] -> [ブラウザウィンドウで開く]という順番でクリックするとSSH接続された画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/bcfa89b0-f110-c38f-563f-c7e4d752f7eb.png)

SSH接続できたら以下のコマンドを入力します。

### アップデート
```shell
sudo apt update
sudo apt -y upgrade
```

### ubuntu-desktopとxrdpのインストール
```shell
sudo apt -y install ubuntu-desktop xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp
```

### リモートデスクトップ用のユーザ作成

```shell
sudo adduser username
sudo gpasswd -a username sudo
```

### リモートデスクトップの設定

```sh
$ cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla  
[Netowrkmanager]  
Identity=unix-user:*  
Action=org.freedesktop.color-manager.create-device  
ResultAny=no  
ResultInactive=no  
ResultActive=yes  
EOF
```

### 再起動

```sh
sudo reboot
```

### リモートデスクトップ接続
なぜか1回目に作成したユーザだとリモートデスクトップ接続はできるのですが、接続後に表示されるパスワード入力画面に入力してエンターを押すと、リモートデスクトップが切断されます。
その場合、再度「リモートデスクトップ用のユーザ作成」をして、そのユーザで接続すると今度は切断されずに先に進めます。
原因不明ですが、2回インスタンスを作成して2回とも同じ現象になりました。

再起動後に以下の画面が表示された場合は、`Cancel`をクリックすればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/32d8be44-ea97-79f5-6208-e8432d274c07.png)


## 4. 日本語キーボードの設定
リモートデスクトップでログイン後、terminalを開き以下のコマンドを入力します。

```sh
gnome-session-properties
```

[Add]を選択し、[Name]に適当な名前、[Command]に`setxkbmap jp`と入力し、最後に[Add]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/38006cb9-912c-6e9b-1ce1-cab458a29085.png)

次にterminalに以下のコマンドを入力します。

```sh
setxkbmap jp
```

これでGUI上で日本語キーボードが利用できるようになります。

# 参考サイト
リモートデスクトップ環境をUbuntu 18.04 LTSで作成する
https://qiita.com/ryo-endo/items/00f3ec125917acf4cec7

Ubuntu で日本語キーボードレイアウト
https://qiita.com/vochicong/items/6452ac54bde56b0e0bb3
MaixduinoでTOPPERSを動かしてみる

# はじめに

TOPPERSプロジェクトのニュースリリースに、64 ビット RISC-V プロセッサを搭載した Sipeed 社のMaixduino ボード対応、とありました。気になったので試してみました。とはいえ、ITRONという名前は知っているけど、TOPPERSって？という感じです。

 - TOPPERSのページ
　https://www.toppers.jp/

# 前提条件

 - Maixduino / Maix-Go ボード
 - [MinGW](http://www.mingw.org/) 64-bit環境
 - [Kendryte GNU Toolchain](https://github.com/kendryte/kendryte-gnu-toolchain/releases)
 - [kflash.py](https://github.com/kendryte/kflash.py) または [ktool.py](https://github.com/loboris/ktool) （書き込み用 UART ISP ユーティリティー)
 - Windows 10（今回はWindows PCで検証しました）

開発環境に関しては色々なページで解説されていますので省略します。PATHにツールチェーンを追加しておきます。

# TOPPERS/ASPのソースとコンフィギュレータのダウンロード

TOPPERSのダウンロードページには何やらたくさんありますが、今回RISC-Vに対応されたのはTOPPERS/ASPカーネル、個別パッケージから入手する必要があるようです。

ダウンロードページ https://www.toppers.jp/asp-d-download.html

から、TOPPERS/ASPカーネル ターゲット非依存部パッケージ、RISC-V HI-FIVE1/K210アーキテクチャ・GCC依存部パッケージ、の2ファイルをダウンロードします。

    asp-1.9.3.tar.gz
    asp_arch_riscv_gcc-1.9.3.tar.gz

また、

https://www.toppers.jp/cfg-download.html

から、コンフィギュレータ Release 1.9.6（Windows用バイナリ） もダウンロードします。

    cfg-mingw-static-1_9_6.zip

# ソースコードの展開

作業用のディレクトリを作成して、ダウンロードしたファイルを格納します。
Min-GWのコンソールでディレクトリを移動し、ファイルを展開します。

```bash:
$ tar xvf asp-1.9.3.tar.gz
$ tar xvf asp_arch_riscv_gcc-1.9.3.tar.gz
```

aspフォルダー下にソースが展開されます。

コンフィギュレータも解凍します。

```bash:
$ mkdir -p asp/cfg/cfg
$ unzip cfg-mingw-static-1_9_6.zip
$ mv cfg.exe asp/cfg/cfg
```

# ツールチェーンの指定

展開された asp/target/k210_gcc/Makefile.target の39行目にツールチェーンが指定されていますが、Kendryte GNU Toolchainを指定してあげます。

```
#GCC_TARGET = riscv-none-embed
GCC_TARGET = riscv64-unknown-elf
```

# ビルド

ターゲットとコンフィギュレータを指定して、コンフィギュレーションします。

```bash:
$ mkdir OBJ
$ cd OBJ
$ perl ../configure -T k210_gcc -g ../cfg/cfg/cfg.exe
```

ビルドを実行します。

```
$ make depend
$ make
```

# サンプルの実行

できあがったaspはELF形式なので、binに変換します。

```
$ riscv64-unknown-elf-objcopy -O binary asp asp.bin
```

フラッシュメモリに書き込みます。

```bash:
$ kflash.py asp.bin
```

または

```bash:
$ ktool.py asp.bin
```

Tera Term等でシリアル接続すると、次のようなログが出力されました。

```
TOPPERS/ASP Kernel Release 1.9.3 for K210 (Jan 31 2020, 10:09:56)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN
Copyright (C) 2017-2019 by Education Working Group TOPPERS PROJECT

mSystem logging task is started on port 1.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
task1 is running (004).   |
task1 is running (005).   |

...

```

# おわり

Maixduino / Maix-Go で動作確認できました。
デバッグするときのコツをまとめてみた

# はじめに 
ソフトウェア開発をしているならば避けられないデバッグ。 
デバッグすることにより品質保証できますし何よりも将来のインシデント対策にもつながります。 
しかし、デバッグは担当者の裁量に左右されるなどコツがあるようです。 
この記事では、筆者の経験を元にデバッグのコツをまとめたいと思います。 

# デバッグする前の心構え  
ソフトウェアのバグを探す前に意識しておきたいことがいくつかあります。  

- 限られた時間内に全てのバグを見つけることは不可能  
ソフトウェアは複雑であり、全てのバグを限られた時間内に見つけ出すことはできないと思ってください。必要十分なテストケースを作成するよう心がけましょう。  
- テストが通るテストケース作成はやめよう  
テストケースは、なるべくバグを発見するようなものにしましょう。正しく動作するテストケースのみですとデバッグになりません。  

# 基本的なデバッグ方法 
よくあるデバッグの方法が以下の通りです。 

- 変数の値をprintして確認  
変数に正しい値が格納されているのか確認し、バグがあるか判断します。この方法の欠点として、print文を消し忘れるとソフトウェアが正しい挙動をしなくなることです。 
- ログを吐かせて変数の値を確認  
この方法は、print文と同じように変数の値を確認しますが、ログとして残るだけなのでprint文の欠点のような事態には至りません。 
- ブレイクポイントを指定し、その場所でプログラムを実行する  
デバッガを使って行ごとにプログラムを実行して、バグを探します。 
- 分割統治法と動的計画法を用いてデバッグ  
　分割統治法のようにプログラムを細分化して、それぞれテストを行い最終的には全てのプログラムのテストを完了します。この時、プログラムの最初、中間とそれぞれの地点で正しい挙動をしているか確認してバグがどこにあるか見つけ出します。  
　動的計画法の考えをデバッグに取り入れることもよくあります。テストをたくさん作成することは悪くありませんが、テストケース作成の時間も限られているので出来るかぎり簡単に済ませたいですよね。動的計画法では、同じ計算を避け大きな問題を解決するという考え方です。テストケース作成においては、あなたが作成したテストケースが他のテストケースも包含しているが考えてみましょう。  
- 自由度を固定してテストケースを作成  
数学の問題を解く時にも自由度を固定して調べることがありますよね。テストケース作成においても自由度を固定してバグを探してみましょう。自由度を固定することで複雑なプログラムがよりシンプルになります。

# おわりに 
上記の基本的なデバッグの方法でもバグが見つからないときは、環境やツールを疑ってみましょう。実行環境を再起動してみたり、DBを最新のものにしてみたり、キャッシュを削除してみたりと試行錯誤してみてください。
apple mapkitをNuxt.jsで表示する

Nuxt.jsでappleのmapを表示するのに少しハマったので、サンプルです。


```map.vue
<template>
  <!-- 地図用のコンテナを作成する -->
  
  <section class="container">
    <div id="map" /></div>
  </section>
</template>

<script>
export default {

  data: function(){
        return {
        };
  },

  async created () {
    await this.mount() 
    console.log(window.mapkit)

    
    // MapKit JSを初期化する
    window.mapkit.init({
      authorizationCallback: function(done) {
        done("-- API Key --");
        }
    });

    // Mapオブジェクトを作成する
    var map = new window.mapkit.Map("map");

    // 地図の表示範囲を指定する
    var tokyo = new window.mapkit.CoordinateRegion(
      new window.mapkit.Coordinate(35.6811673, 139.7670516),
      new window.mapkit.CoordinateSpan(0.04, 0.04)
    );
    map.region = tokyo;
    
  },
  methods: {
    async mount (version = '5.0.x') {
      return new Promise((resolve, reject) => {
        const src = `https://cdn.apple-mapkit.com/mk/${version}/mapkit.js`

        if (window.mapkit) {
          return resolve(window.mapkit)
        }

        const script = document.createElement('script')
        script.onload = () => resolve(window.mapkit)
        script.onerror = (error) => reject(error)
        document.body.appendChild(script)
        script.src = src
      })
    },
  }
}

</script>
<style>
        #map {
            width: 100%;
            height: 300px;
        }
</style>
```
R-3.6.2にMonocle3を導入

#Monocle3をR3.6.2に導入
MacOS 10.14.6
R 3.6.2
Bioconductor導入済み
##準備：gdalをインストールしておく
sfの導入に必要なのでターミナルでgdalを導入
brew使える環境なら以下のコマンドでok（と思う）
###ターミナルでインストール
```
brew install pkg-config
brew install gdal
```

###R上でインストール
```
install.packages("devtools")
devtools::install_github('cole-trapnell-lab/leidenbase')
devtools::install_github('cvarrichio/Matrix.utils')
install.packages("sf", dependencies = TRUE)
devtools::install_github('cole-trapnell-lab/monocle3')
```

##動作確認
Rのセッション上で動作確認

```
library(monocle3)
```
動いた。
timestamp status 999 error none message no message available

#状況
Spring boot でアプリを作っている。
Spring-security で認証機能の実装をする。

#問題
submitを押して認証処理を行うと、ログインフォームから表題のエラーが発生したページへ遷移する。
（表題エラーはJSONで表示されていた。）

#原因
認証処理で遷移するURLの許可がない場合に発生する。
認証に失敗した際に/login-errorに遷移するが、/login-errorへのアクセス許可がないため発生していた。

#解決
```
@Override
    protected void configure(HttpSecurity http) throws Exception {
        
        http
        	.authorizeRequests()  // 認可の設定
            	.antMatchers("/", "/find", "/login", "/signup", "/error", "/login-error").permitAll() // 全ユーザーアクセス許可
            	.anyRequest().authenticated()  // それ以外は全て認証無しの場合アクセス不許可
            	.and()
            .formLogin()  // ログイン設定
            	.loginPage("/login")   
            	.loginProcessingUrl("/login")   
            	.usernameParameter("username")	
            	.passwordParameter("password")  
            	.failureUrl("/login-error")      // 認証失敗時のURL
            	.defaultSuccessUrl("/")     // 認証成功時の遷移先
            	.and()
            .logout()	// ログアウト設定
            	.logoutRequestMatcher(new AntPathRequestMatcher("/logout**"))       // ログアウト処理のパス
            	.logoutSuccessUrl("/")                                        // ログアウト完了時のパス
            	.permitAll();
        
    }
```
NestJSでresponse headerを変更する

## 何したかった

paginationでheader情報にcurrentPageとか格納したい

## わからなかった部分

header情報を動的に変えたかった

## 実装

hogeコンポーネントがある状態

### 決まったheader情報を返したい場合

`@Header`を使用する
次のコードは`"Page": "1"`がheaderに格納される

```typescript:hoge.controller.ts
import {
  Controller,
  Get,
  HttpCode,
  Param,
  UseGuards,
  Header,
} from '@nestjs/common';
import { HogeService } from './hoge.service';

export class HogeController {
  constructor(private readonly service: HogeService) {}

  @Get()
  @HttpCode(200)
  @Header('Page', '1')
  async list(@Param() request: IdRequest): Promise<Hoge[]> {
    return await this.service.list(request);
  }
}
```

### 動的にheader情報を変更したい場合

`@Res() res: Response` を使用してheader情報を変更する
次のコードは`"Page": "123"`がheaderに格納される

[注意点]
`import { Response } from 'express';` をしないといけない 
`res.send()`しないとリクエストがタイムアウトする

```typescript:hoge.controller.ts
import {
  Controller,
  Get,
  HttpCode,
  Param,
  UseGuards,
  Res,
} from '@nestjs/common';
import { HogeService } from './hoge.service';
import { Response } from 'express';

export class HogeController {
  constructor(private readonly service: HogeService) {}

  @Get()
  @HttpCode(200)
  async list(
    @Param() request: IdRequest, 
    @Res() res: Response,
  ): Promise<Response> {
    res.set('Page', '123');
    return res.send(await this.service.list(request));
  }
}
```
Robocode IntelliJ IDEA

外部JARファイル追加
[ファイル] - [プロジェクト構造]
表示されたプロジェクト構造ダイアログの プロジェクト設定の[モジュール]を選択する
[依存関係]タブを選択する

プロジェクト構造ダイアログの右端の＋マークをクリックし、
表示されたドロップダウンリストから、JARs or directoriesを選択する

表示されたパスの選択ダイアログで、
Robocodeインストールフォルダ\libs\robocode.jarファイル選択する
例 C:\robocode\libs\robocode.jar
![名称未設定-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99276/3fd50c4b-8ac6-1015-9ce3-a0cb60dfb3d5.jpeg)

---
実行/デバッグ構成の設定

[実行] - [構成の編集]
実行/デバッグ構成 ダイアログが表示される

実行/デバッグ構成 ダイアログの左上の＋ボタンをクリックする
表示されたドロップダウンリストから、アプリケーションを選択する

下図の赤色の枠の箇所を入力する
・名前: 任意の名称
・メインクラス: robocode.Robocode
・VMオプション: -Xmx512M -Dsun.io.useCanonCaches=false -Ddebug=true
・作業ディレクトリー: Robocodeをインストールしたフォルダを指定する

![名称未設定-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99276/5a65e1ba-c9f2-59b1-5e13-51b9a2ab0963.jpeg)
コーディングのメモ

##TIPS
・ホバー時の色は、カラーコードではなくopacity（透明度）をいじると良いかも

・基本的には要素同士の関係よりクラスで指定した方が良いが、
liとか、絶対にタグが変わらないものとかは関係でもOK

・タブレットで表示した時の見え方は、meta viewportでPC版に合わせる。そうするとタブレットの微妙な画面幅のことを考えなくて良くなる?

・コーディングに入る前に、繰り返し使えそうなパーツは何かを考える

・余白はパーツのスタイルに入れず、利用箇所ごとで設定するとパーツの再利用性が上がる

・BEMの命名は、セクションごとではなく**パーツごと**
（ヘッダーにBlockが4個くらいあったりする）

・flexboxで、カラム数を「2or4」みたいにしたい時は、要素を2つずつdivで囲む

・色は最初に定義しておくとやりやすい

・`li:not(:last-child):not(:first-child)`で`first-child`と`last-child`以外という指定ができる

・flexboxで段組みを作る時は、要素の幅(`width: calc(100% / 3)`など)だけメディアクエリで調整すれば良い

・block要素の幅を文字量に応じて変更したい時には`width: fit-content`が使える

・marginは相殺されるので、`margin-top`か`margin-bottom`はどちらか一方を使った方が良い
→margin-topを使おうと思う。

・`border-radius`の値は変数に保存して使い回す（統一する）。

・`<br class="sp">`などで、レスポンシブ時の改行位置を修正する。

・flashは`transition`等で表示、非表示をふわっとさせる

・Chromeのdeveloper toolで、`option + 上下キー`で値を0.1ずつ動かすことができる

・`object-fit: cover`で画像をトリミングできる

・tableに枠線を引くときは、`table`,`th`,`td`それぞれに`border`を設定した後、`table`に`border-collapse: collapse`を設定する

・`justify_content: space-evenly`で要素を等間隔で配置できる

##ハマったポイント
・`display: table`を持つ要素には、`overflow: scroll`が効かない

・`table`に`display: block`を指定すると、`width`が効かなくなる
→tableは`div`で囲っておくのが無難

・classに対して`:first-child`や`nth-of-type()`などを指定すると、[特殊な動き](https://qiita.com/d0ne1s/items/dc4c6f951931ae1aa053)をする

・`display:inline-block`を使うと、謎の余白が生まれることがある。
→親要素に`font-size: 0`を指定すると解消。
（参考：[inline-blockの隙間をなくす方法](https://qiita.com/BEMU/items/0f500e0306471073ed63)）

・`select`要素に`:before`をつけたら、developer tool上では存在していることになっていても画面上のどこにも見つからなかった。selectとは相性が悪いのかも
→親要素の`div`にbeforeをつけて対応

・tableのwidthを100%に設定しているのに、横幅が親要素からはみ出してしまっていた
→`table-layout: fixed`で解決

・画像の幅が固定されている時、親要素にpaddingを当てる画像が右によってしまう
→画像に`width: 100%; height: auto:`で解決

・`input`要素に擬似要素は効かない

・上側のpaddingが効かなかった
→`display: block`を指定して解決
DonkeyCar 車両紹介-2号機

#概要
ラジコンカーに小型コンピュータとカメラを搭載してAI(機械学習・ディープラーニング)で自動運転させるオープンソースのプロジェクト「DonkeyCar」の実験用車両です．
・R/Cシャーシはタミヤ1/10サイズ「TT-02」を使用
・小型コンピュータはラズベリーパイを使用
・ディープラーニングはGoogleの「TensorFlow」を使用
・カメラ画像をラズパイのデスクトップに表示 https://qiita.com/mituhiromatuura/items/5b2cfd8971bc923b4b25
・ラズパイのコンポジットビデオ出力をドローン用VTX-VRXでFPV
#自動運転 走行動画
https://youtu.be/rZTfft6bK6Y
#部品リスト
![IMG_1948s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263672/b1f268ac-f05f-2c7f-b5ef-0fda304082b6.jpeg)
Software：DonkeyCar V3.1.0 https://www.donkeycar.com/
CPU：Raspberry Pi 4B https://www.raspberrypi.org/products/raspberry-pi-4-model-b/
GPIO Board：Hand Maid（LED×6，FRAM，Relay，PWMout3pin×4ch）
TPU：Coral USB Accelerator https://coral.ai/docs/accelerator/get-started/
Camera：160 degree wide lens https://www.amazon.co.jp/gp/product/B00N1YJKFS/
Camera：200 degree wide lens https://www.amazon.co.jp/gp/product/B07CZTXG8R/
Camera：Rev1.3 https://www.amazon.co.jp/Raspberry-Pi-Module-Camera-775-7731/dp/B00E1GGE40
Camera Mount：3D Printed
Chassis：TAMIYA TT-02 2WD Converted https://www.tamiya.com/japan/products/product_info_ex.html?genre_item=0111
Chassis Option：ADJUSTABLE UPPER ARM SET https://www.tamiya.com/japan/products/54874/index.html
Chassis Option：STEERING UPGRADE PARTS SET https://www.tamiya.com/japan/products/54752/index.html
Front Tyre：RACING SLICK TIRE SET (1 PAIR) https://www.tamiya.com/japan/products/50454/index.html
Rear Tyre：RACING RADIAL TIRE SET https://www.tamiya.com/japan/products/50419/index.html
Motor：YOKOMO YM-BL305B https://teamyokomo.com/parts/YM-BL305B/
ESC：YOKOMO BL-RS4 https://teamyokomo.com/parts/BL-RS4/
ESC Wi-Fi：YOKOMO BL-WM https://teamyokomo.com/parts/BL-WM/
Steering Servo：YOKOMO SP-02D https://teamyokomo.com/parts/SP-02D/
Steering Gyro：YOKOMO YG-302 https://teamyokomo.com/parts/YG-302/
Battery(LiPo)：YOKOMO YB-L400A https://teamyokomo.com/parts/YB-L400A/
Battery(Ni-MH)：Rowa Japan HYPER 4000 
Battery Charger：multi charger X1 BLACK https://hitecrcd.co.jp/products/x1_black/
DC-DC5V(CPU)：XL4015E1 https://www.amazon.co.jp/gp/product/B00ZC045ZY/
DC-DC7V(ESC)：LTC3119 https://strawberry-linux.com/catalog/items?code=13119
IMU：MPU-6050 https://www.amazon.co.jp/gp/product/B07T54YS8R/
Power Monitor：INA226 × 2 https://strawberry-linux.com/catalog/items?code=12031
JoyStick：DualShock4 https://www.playstation.com/ja-jp/explore/accessories/gaming-controllers/dualshock-4/
JoyStick Option：USB-BT Wireless Adapter https://www.jp.playstation.com/ps4/peripheral/cuhzwa1j.html
JoyStick Option：XD mount https://pur.store.sony.jp/acc3/products/acc3_sp-acc_other/EPA34-001XM_product/
FPV VTX：Microaircrafts VTB3012 http://www.microaircrafts.com/VTB3012_VTB6012.html
FPV VRX：Eachine RC832 https://ja.aliexpress.com/item/32748380356.html
自分のローカルの状態を他の人に共有する方法

```
$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
	inet 127.0.0.1 netmask 0xff000000 
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
	nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether ac:bc:32:c4:16:ab 
	inet6 fe80::1d:33bb:a5e:c0fd%en0 prefixlen 64 secured scopeid 0x5 
	inet 19*.**8.1.** netmask 0xfffff800 broadcast 192.168.7.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active

...以下省略

```


`19*.**8.1.**`が自分のプライベートIPアドレスなのでローカルを立ち上げ

```
サーバを立ち上げる時に -b オプション
bin/rails s -p 3540 -b 0.0.0.0
```

http://19*.**8.1.**:3540
にアクセスでスマホなど外部からも接続できる
【Slack】スレッドへのpostMessage時の注意点

# スレッドへのpostMessage時に注意すべき点

スレッドへの書き込みに返信する場合は、`thread_ts`に`前メッセージのthread_ts`を指定しなければならない

この際に、`前のメッセージのts`を指定してしまうと、Slackの表示がおかしくなってしまう。
Google Maps APIのズームレベルから画面を覆う程度の半径を算出

地図アプリ作成中にある程度適切な範囲のデータを取得したいと思ったので、
[Google Maps APIのズームレベルまとめ - Qiita](https://qiita.com/SnowMonkey/items/795779913be692c12a0b)
を参考に画面を覆うくらいの円の半径を算出するコードをSwift / Kotlin / Javascriptで。

具体的には以下のような引数と戻り値。

```sh
# ズームレベル => メートル
 8 => 150000
 9 =>  75000
10 =>  37500
11 =>  18750
12 =>   9375
13 =>   4687
14 =>   2343
15 =>   1171
```

この後これをカメラ位置と一緒にPostGISのST_DWithinに突っ込んで周辺データを取り出している。

地球レベルまでズームアウトできてしまうので、8以下は150km固定にした。
環境によって適宜調整してください。

# Swift

```swift
private func zoomToRadius(_ zoom: Float) -> Double {
    var radius = Double(150000.0)
    if zoom > 8 { radius /= Double(pow(2, zoom - 8)) }
    return radius
}
```

# Kotlin

```kotlin
private fun zoomToRadius(zoom: Float): Double {
    var radius = 150000.0
    if (zoom > 8) { radius /= 2.0.pow(zoom.toDouble() - 8) }
    return radius
}
```

# Javascript

```javascript
var zoomToRadius = function(zoom) {
  let radius = 150000
  if (zoom > 8) { radius = radius / Math.pow(2, zoom - 8) }
  return radius
}
```
【Java】StringとStringBuilderについて

#もくじとまとめ

お勉強用の自分向けメモです

- そもそものStringとStringBuilderの違いについて
- StringBuilderのequalsについて

結論は
- 結合や反転をガンガン行うときはStringBuilderを推奨
- そうでないときはStringの方が便利 & 安全かも
- StringやStringBuilderで文字列の一致判定は気を付けよう！

#背景
最近AtCoder問題を利用してJavaの文法とかを勉強しています。

[ABC146 F -Sugoroku](https://atcoder.jp/contests/abc146/tasks/abc146_f)
に出くわした際にStringを反転させたいなーと思ったところStringBuilderなるものに出会ったことから始まるお話です。

#StringとStringBuilderの違い

これについては以下のリンクを見ればわかりやすいと思います。
https://qiita.com/shunsuke227ono/items/e8f34c67dcffa0fa28ad
https://www.javadrive.jp/start/stringbuilder/

簡単にまとめると、

 - Stringはイミュータブルであり、StringBuilderはミュータブルである
 - コード上ではStringもミュータブルのように記述できる（S = S + "a"など）
 - 文字列の追加・挿入ではStringBuilderの方がメモリ・時間効率が良い

ということでStringBuilderの使用が推奨されている感じなのですが、**String側の利点に全く出会わなかった**ので、あれ？Stringいらない子なのかな？ってなりました（おそらくそんなことはない）。

―――2020/02/02追記―――
（併せてタイトルを変更しました）
コメントにてご指摘および↓良いリンク↓の紹介をしていただきました。
https://qiita.com/yoshi389111/items/67354ba33f9271ef2c68

文字列定数の結合の場合や、1ステートメントでの結合の場合は+演算子で問題ないようです。
今回のように文字列反転をしたい場合は、StringBuilderやList\<Character\>を使用した方が良いようです。


#追記2(2020/03/27)
違う問題と知見に出会ったので追記

[ABC159 B - String Palindrome](https://atcoder.jp/contests/abc159/tasks/abc159_b)
文字列が回文であるか(+α)の判定。
あるStringBuilderとそれを反転させたものが同一かどうかという発想でコードを書きました。

```java:回文判定のコード（間違い）
static boolean checkKaibun(String str){
  StringBuilder t = new StringBuilder(str);
  return (t.equals(t.reverse()));
}
```

自分で試した限りではこれは常にtrueを返します。
原因はStringBuilderのequalsメソッドがオーバーライドされていないことです。

解決策は
1. equalsメソッドをオーバーライドする
2. toStringでStringに変換してから比較する

コード中にStringBuilderの比較をたくさん使うなら1でしょうが、hashCodeメソッドのオーバーライドも行う必要もあるらしく（下記の参考）、面倒です。

参考
https://www.atmarkit.co.jp/ait/articles/0702/20/news103.html

2での実装は以下のようになります。

```java:回文判定のコード
static boolean checkKaibun(String str){
  StringBuilder t = new StringBuilder(str);
  return (str.equals(t.reverse().toString()));
}
```
Xcodeの証明書エラーでやりがちなやつ

```
Revoke certificate
Your account already has a signing certificate for this machine but it is not present in your keychain. 
To create a new one, you must first revoke the existing certificate.
(訳)
証明書を取り消す
アカウントにはすでにこのマシンの署名証明書がありますが、キーチェーンには存在しません。 
新しい証明書を作成するには、まず既存の証明書を失効させる必要があります。
```
Xcodeの署名設定のところにこのメッセージ＆「Revoke」ボタンが現れたりする。
もしくは「Fix it」とか…

ディストリビューション証明書に関しては管理がややこしくて、よくわかんないまま
ボタンをポチーして証明書を上書きしたりして共同作業者を暗黒面に落とすということがまれによくあります。

Xcodeはプロビジョニングプロファイルなんかをいいかんじで解決してくれる割には
証明書本体についてはちょっと怪しいところがあって、
Xcodeから作成したディストリビューション証明書はp12のインストールをきっちりやっても
他の人からは使えなかったりすることがあります。
キーチェーンではちゃんとインストールできてるように見えたりもするんですが…

何が言いたいかというと、

__証明書のエラーが起きてもXcodeから解決したりするんじゃねーぞ__

ということです。

ちゃんとiOS Dev portalで作って、作った人はp12を配布しましょうね。

もしくはfastlane matchを使いましょうね。
https://docs.fastlane.tools/actions/match/
二次元配列からキーごとの最大値を取り出す

よくある話だとは思うのですが二次元配列

```python
A = [
    ['001', '1'],
    ['001', '2'],
    ['002', '1'],
    ['002', '3'],
    ['001', '3'],
    ['002', '2'],
    ['002', '4']
]
```

こういうものから各要素の`[0]`をキーとして、キーごとの`[1]`の最大値を求めたい場合のロジックを考えます。
上記の場合だと、`[['001', '3'], ['002', '4']]`が導き出したい答えです。

```python

# 二次元配列[[key, value], [key, value], ...]
input_list = [
    ['001', '1'],
    ['001', '2'],
    ['002', '1'],
    ['002', '3'],
    ['001', '3'],
    ['002', '2'],
    ['002', '4']
]

# 各要素のkeyを取得して重複削除
keys = list(set(i[0] for i in input_list))
tmp_dict = {}
for k in keys:
    # 要素のkeyが一致するvalueをリスト化
    v_l = list(set([i[1] if i[0] == k else 0 for i in input_list]))
    # key: valueの辞書型で保持
    tmp_dict.update({k: v_l})
print(tmp_dict)  # {'001': [0, '3', '1', '2'], '002': [0, '3', '4', '1', '2']}

output_list = []
for k in tmp_dict.keys():
    # 各keyが保持するvalueの最大値を取得しリスト化
    output_list.append([k, max(tmp_dict[k], key=int)])
print(output_list)  # [['001', '3'], ['002', '4']]
```

というわけでキーごとの最大値が求められました。
Prettier デバッグ

[Prettier](https://github.com/prettier/prettier) の開発をするときのデバッグ方法。

`test.*` が `.gitignore` に入ってるので、フォーマットしたいファイルを `test.js` みたいに作れる、拡張子はなんでもいい(作っても git 管理の対象にならない)。

また、Flow や TypeScript、Babel を介さないと使えないプロポーザル を使って書かれているわけではないので、トランスパイル等せずに普通に Node.js で実行できる(今の master だと Node 8 以上、 next ブランチだと Node 10 以上)。
なので、`src`以下を変更しても

```sh
$ ./bin/prettier.js test.js
```

みたいにやってあげれば、変更された Prettier で`test.js`のフォーマットができる。
GeoPandasのインストールに失敗した場合の対処法（Fiona/GDALのエラー ※Rtreeのインストール方法も追記）

# ※注意！
この記事は2020年1月31日現在の情報です。今後Qiita記事上での情報更新は行いませんので、最新の情報は
[GeoPandasのインストールに失敗した場合の対処法（Fiona/GDALのエラー + Rtreeのインストール） - Ushitora Lab.](https://ushitora.net/archives/2065)
をご確認ください。
また、コメント・不具合報告等も↑にお願いいたします。

# 本文
Pythonの環境によっては、pipを用いたGeoPandasのインストールに失敗するみたいです。
私は失敗しました。
というわけで、解決策を記録しておきます。
（この記事では、GeoPandasのインストール中に"Fiona"関連のエラーが生じた場合の対処法について述べています。）

## Python環境
今回の手順では、Python 3.7.5を使用しています。基本的に3.7系なら動きますので、Pythonのインストールがまだの場合は、こちらからインストールしてください。
https://www.python.org/downloads/release/python-375/

※別の系のPythonでも、多分、インストールに用いるファイル名の「37」という部分をバージョンに合わせて変更すればOKだと思います。

また、同時にpipのインストールもお願いします。
https://qiita.com/suzuki_y/items/3261ffa9b67410803443

## GeoPandasのインストールに必要なもの
このページを見ているということは、一度GeoPandasのインストールに失敗していると思います。
その際、Fionaというモジュールについてのエラーメッセージが出たのではないでしょうか？
（もしそうでなければ、このページの内容では解決できないかもしれません）

GeoPandasにはFionaが必要で、これが無いとインストールに失敗します。
そして、FionaにはGDALというモジュールが必要なので、これが無いとFionaのインストールにも失敗します。

というわけで、

GDAL
↓
Fiona
↓
GeoPandas

の順にインストールしていきましょう。
ただし、このインストールはpipからではうまくいきません。

## GDALのインストール
以下のサイトから、GDAL‑3.0.3‑cp37‑cp37m‑win_amd64.whlをダウンロードしてください（32bit PCの場合はGDAL‑3.0.3‑cp37‑cp37m‑win32.whl）。「3.0.3」の部分は変更されるかもしれません。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal

ファイルを適当なフォルダに置き、以下のコマンドでインストールします。

```
python -m pip install c:/python/codes/geo/GDAL-3.0.3-cp37-cp37m-win_amd64.whl
```

ここでは、C:/python/codes/geoにファイルを置いています。

## Fionaのインストール
GDALと同様に、以下のサイト（GDALと同じページです）から、Fiona‑1.8.13‑cp37‑cp37m‑win_amd64.whlをダウンロードしてください（32bit PCの場合はFiona‑1.8.13‑cp37‑cp37m‑win32.whl）。「1.8.13」の部分は変更されるかもしれません。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#fiona

ファイルをGDALと同じフォルダに置き、以下のコマンドでインストールします。

```
python -m pip install c:/python/codes/geo/Fiona-1.8.13-cp37-cp37m-win_amd64.whl
```

## GeoPandasのインストール
以上で準備が整いました。

```
pip install geopandas
```

でGeoPandasがインストールできるはずです。

## （おまけ）Jupyterのインストール
GeoPandasを用いた分析には、Jupyter Notebookを用いるのが便利です。

```
pip install jupyter
```

でインストールしておきましょう。
分析を行いたいフォルダに移動し、

```
jupyter notebook
```

で起動できます。

## （追記）Rtreeのインストール
GeoPandasを使っていく中で、「Rtree」というモジュールが必要になるかもしれません。
私はなりました。
しかし、これもpipではうまくいかないので、FionaやGDALと同じサイトを利用します。
Rtree-0.9.3‑cp37‑cp37m‑win_amd64.whlをダウンロードしてください（32bit PCの場合はRtree-0.9.3‑cp37‑cp37m‑win32.whl）。「0.9.3」の部分は変更されるかもしれません。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#rtree

ファイルをGDAL/Fionaと同じフォルダに置き、以下のコマンドでインストールします。

```
python -m pip install c:/python/codes/geo/Rtree-0.9.3‑cp37‑cp37m‑win_amd64.whl
```
【未経験から】ITパスポートの勉強方法と勉強時間

はじめに

インフラエンジニアに未経験で入社しました。研修を終えて、時間があったので、ITパスポートの取得を勧められました。

教材

ITパスポート絶対合格の教科書
ping-t
過去問道場

勉強方法

教科書を読み、ある程度理解してから、ping-t、過去問道場で過去問を解く

教科書を読んでいるだけだと、なかなか覚えられません。わからないところは飛ばして、過去問をやったほうが効率よく進めると思います。

勉強時間

1ヶ月、1日30分〜2時間

アドバイス

試験を受ける直前に受験予約をすると、空いていないことがあるので、早めに予約したほうがいいです。
AutoLISP 算術演算関数の使い方

[算術演算関数リファレンス（公式ヘルプ）](https://help.autodesk.com/view/OARX/2020/JPN/?guid=GUID-FC14467C-63B9-4400-8C6A-266D21C846AE)
[定義済み変数（公式ヘルプ）](https://help.autodesk.com/view/OARX/2020/JPN/?guid=GUID-195BD573-AD4A-4A40-B385-74FB291E218C)

### 足し算をする
```scheme
(+ 3 4)
;; -> 7
(+ 1 2 3 4 5 6 7 8 9 10)
;; -> 55
(+ 2.0 3 5)
;; -> 10
(+ 1.25 3.25)
;; -> 4.5
```

### 引き算をする
```scheme
(- 9 5)
;; -> 4
(- 1 2 3 4 5 6 7 8 9 10)
;; -> -53
```

### 掛け算をする
```scheme
(* 2 3)
;; -> 6
(* 1 2 3 4 5)
;; -> 120
```

### 割り算をする
```scheme
(/ 9 3)
;; -> 3
(/ 10 3)
;; -> 3
;; ※ データ型に注意。整数同士の計算の戻り値は整数。
(/10 3.)
;; -> 3.33333
;; ※ 3.0 は 3. と書くことができる
(/ 10 2 2)
;; ->2
(/ 10 2. 2)
;; -> 2.5
```

### 剰余を計算
```scheme
(rem 10 3)
;; -> 1
(rem 10 3.3)
;; -> 0.1
(rem 3 10)
;; -> 3 (0 余り 3)
```

### 数値を1増加（インクリメント）
```scheme
(1+ 5) ;;(+ 5 1)と同じ
;; -> 6
(1+ 5.5)
;; -> 6.5
(setq n 0)
(1+ n)
;; -> 1
;; ※ 戻り値は1なるが、n が 1 になっているわけではない
;; n を 1 にするには
(setq n (1+ n))
;; とする必要がある
```

### 数値を1減少（デクリメント）
```scheme
(1- 5) ;;(- 5 1)と同じ
;; -> 4
(1- 5.5)
;; -> 4.5
(setq n 0)
(1- n)
;; -> -1
```

### 絶対値を計算
```scheme
(abs 7)
-> 7
(abs -7)
-> 7
(abs -7.5)
-> 7.5
```

### 三角関数
###サインを計算
```scheme
(sin (/ pi 6)) ;; sin30°
;; -> 0.5
```
###コサインを計算
```scheme
(cos (/ pi 3)) ;; cos60°
-> 0.5
```
###タンジェントを計算

※ AutoLISPにはタンジェント関数が用意されていないので自作する必要がある
$$ \tan\theta = \frac{\sin\theta}{\cos\theta} $$

```scheme
;; タンジェント関数の定義
(defun tan (x)
    (if (not (equal 0. (cos x) 1e-10))
        (/ (sin x) (cos x))
    )
)

(tan (/ pi 4)) ;; tan45°
;; -> 1.0
```
### アークタンジェントを計算
※ アークタンジェントは標準で用意されている

```scheme
(atan 0.5)
;; -> 0.463648
(atan (/ 1 (sqrt 3)))
;; -> 0.523599 (60°)
```

### e のべき乗を計算
e ･･･ ネイピア数、自然対数の底

```scheme
;; e = 2.71828...
(exp 10)
;; -> 22026.5
(exp 2.5)
;; -> 12.1825
(exp -1)
;; -> 0.367879
```

### べき乗を計算
```scheme
(expt 2 8) ;; 2の8乗を計算
;; -> 256
(expt 2 -1)
;; -> 0
(expt 2 -1.)
;; -> 0.5
```

### 平方根の計算
```scheme
(sqrt 4)
;; -> 2.0
;; 常に実数が返される
(sqrt 2)
;; -> 1.41421
(sqrt 1)
;; -> 1.0
```

### 実数の小数点以下を切り捨てる
※四捨五入ではない

```scheme
(fix 2.5)
;; -> 2
(fix pi)
;; -> 3
```

### 整数を実数に変換
```scheme
(float 2)
;; -> 2.0
(/ 10 (float 3))
;; -> 3.33333
(float (/ 10 3))
;; -> 3.0
```

### 最大公約数の計算
```scheme
(gcd 5 2)
;; -> 1
(gcd 54 81)
;; -> 27
```

### 自然対数の計算
自然対数 ･･･ eを底とする対数

```scheme
(log 10)
;; -> 2.30259
```

### ビット計算
### ビット方式のブール演算

```scheme
(boole 1 12 5)
;; -> 3
(boole 1 55 4135)
;; -> 39
```

### ビット方式の AND

```scheme
(logand 2 12)
;; -> 0
(logand 2 34)
;; -> 2
```

### ビット方式の OR
```scheme
(logior 1 4)
;; -> 5
(logior 1 2 5)
;; -> 7
```

### ビットシフト
```scheme
(lsh 1 3)
;; -> 8
```

### 数値の最大値を返す
```scheme
(max 1 2 3 4 5)
;; -> 5
(max 50 2. 25)
;; -> 50.0
;; 比較数値に一つでも実数があれば、最大値が整数であっても実数が返される
```

### 数値の最小値を返す
```scheme
(min 1 2 3 4 5)
;; -> 1
(min 1020 55.5 -30 -2.5)
;; -> -30.0
```

### 負の数値かどうか調べる
```scheme
(minusp 10)
;; -> nil
(minusp -10)
;; -> T
```

### 数値がゼロに評価されるかどうかを調べる
```scheme
(zerop 10)
;; -> nil
(zerop 0)
;; -> T
(zerop (rem 10 3))
;; -> nil
(zerop (rem 10 2))
;; -> T
```
powershellでazure sql database のサイズ変更メモ


変数
サブスクリプション:\$subscriptionId = "xxxxxx-42aa-xxxx-99d0-xxxxxxxxxxxx"

リソースグループ名:$resourceGroup = "TEST-RG-001"

SQLサーバ名:\$sqlserverName = "testdb999sv"

DB名:\$databaseName = "test999db"

DBのプラン変更後:\$dbChangeEdition = "Standard"

DBサイズ変更後:\$dbChangeLevel = "S1"

コマンド
###変更前のステータス確認
・AzureSQLDAtabaseの情報取得				
Get-AzSqlServer

・DBの情報取得					
Get-AzSqlDatabase -ResourceGroupName \$resourceGroup -ServerName \$sqlserverName

###変更するためのコマンド
 ・変更後がスタンダードorプレミアムの場合
Set-AzureRmSqlDatabase -ResourceGroupName \$resourceGroup -ServerName \$sqlserverName -DatabaseName \$databaseName -Edition \$dbChangeEdition -RequestedServiceObjectiveName $dbChangeLevel


・変更後がBasicの場合(最後の引数リクエスデッドサービスオブジェクトネームが要らない)

Set-AzureRmSqlDatabase -ResourceGroupName \$resourceGroup -ServerName \$sqlserverName -DatabaseName \$databaseName -Edition \$dbChangeEdition 

###変更後のステータス確認
・AzureSQLDAtabaseの情報取得				
Get-AzSqlServer

・DBの情報取得					
Get-AzSqlDatabase -ResourceGroupName \$resourceGroup -ServerName \$sqlserverName
Docker環境でNiFi Registryを起動

# Code:

```bash

# Start NiFy Registry Docker
# https://hub.docker.com/r/apache/nifi-registry/
sudo docker run --name nifi-registry \
  -p 18080:18080 \
  -d \
  apache/nifi-registry:latest

```



# 実行結果

```bash
[root@zzeng-nipy ~]$ docker run --name nifi-registry \
>   -p 18080:18080 \
>   -d \
>   apache/nifi-registry:latest

Unable to find image 'apache/nifi-registry:latest' locally
latest: Pulling from apache/nifi-registry
743f2d6c1f65: Pull complete
5c14188d0980: Pull complete
96b1d66a77cb: Pull complete
16218aebd626: Pull complete
ff8f55c8fa8f: Pull complete
cf11fcba89e7: Pull complete
92d0a18122b6: Pull complete
7d9c2600cd2f: Pull complete
Digest: sha256:de2823271ebc4087f09f9bde3e451db83f75c12d420eae0119b4235f044efe28
Status: Downloaded newer image for apache/nifi-registry:latest
9c1f6c2049e5c4d95dbe7b25009a51bcdbb7e2688ca2065506610709d783c907
[root@zzeng-nipy ~]$
```
ansibleはblock-whenの条件式をtask毎に評価をする。

ansibleではプログラミング言語の`if`文を`when`で表現します。

ansibleだと普通の条件式の挙動とは違い、ひとつづつのtaskで条件式を評価をする部分で理解が足りてなかったので、備忘録としてまとめます。

## pythonで書いてみる

普通のプログラミング言語では`if`の中で条件式に使用されている変数を変更しても途中で`if`文が終了する、ということはありません

```py
number = 1
if number == 1:
    print('number is {}'.format(number))
    number = 10 #条件式が偽になるように変数を代入
    print('number is {}'.format(number)) #もう一度条件式は評価はされずに出力される
```

当たり前ですが `number is 10`も出力されます

```:output
number is 1
number is 10
```

## ansbileで書いてみる


同じようなコードをansibleで書いてみます

ansible: 2.7.11

```yml

- hosts: localhost
  vars:
    NUMBER: 1
  tasks:
    - block:
        - name: debug when NUMBER is 1
          debug: var=NUMBER
        - set_fact:
            NUMBER: 10
        - name: debug when NUMBER is 10
          debug: var=NUMBER
      when: NUMBER == 1
```

`TASK [debug when NUMBER is 10]`の部分が `skipping: [localhost] => {}`になっていることが分かると思います。つまり各taskレベルでwhen の条件式の評価がされて、条件式で偽の判定がされています。

```:output
TASK [debug when NUMBER is 1] ************************************************************************************************************************************************************************************************
task path: /tmp/test.yml:6
ok: [localhost] => {
    "NUMBER": 1
}

TASK [set_fact] **************************************************************************************************************************************************************************************************************
task path: /tmp/test.yml:8
ok: [localhost] => {
    "ansible_facts": {
        "NUMBER": 10
    },
    "changed": false
}

TASK [debug when NUMBER is 10] ***********************************************************************************************************************************************************************************************
task path: /tmp/test.yml:10
skipping: [localhost] => {}
META: ran handlers
META: ran handlers

PLAY RECAP *******************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
```

ansible自体はpythonで書かれていますがちょっとびっくりの仕様ですよね。

ansibleのコード思想が分かっていないので一概に悪いとは言えませんが普段の感覚でコードを書くと失敗する、というのは頭に入れておいた方が良さそうです。
AzureAppService for Containers でApplicationInsight(Monitor)にSpringBootのメトリクスを送信する

# はじめに

「[コンテナーに対する Azure Monitor の概要](https://docs.microsoft.com/ja-jp/azure/azure-monitor/insights/container-insights-overview)」に書かれている対象サービスは以下の通りでAppService for Containerは含まれていないのです

* Azure Kubernetes Service (AKS) にホストされているマネージド Kubernetes クラスター
* Azure Container Instances
* Azure Stack またはオンプレミスでホストされた自己管理の Kubernetes クラスター
* Azure Red Hat OpenShift

確かにAzurePortal上でもグレーアウトされておりみることができないようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/b6bbd0bc-aa9e-74fe-46ef-0a92a81a7e1c.png)

SpringのActuatorに対してAzureFunctionsで定期的にリクエストを投げて、AzureMonitorにカスタムメトリクスを投げないといけないのかな・・・・・と暗い気持ちになっていたところ・・・送る仕組みがありましたのでご紹介です。


# 設定の仕方

「[azure-spring-boot-metrics-starter](azure-spring-boot-metrics-starterhttps://github.com/microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-spring-boot-metrics-starter)」を使います。

まずはモニター→アプリケーションから追加を押してメトリクスを入れる箱を作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/fd46032a-48dd-4b40-d34f-8991314e50a5.png)

インストルメンテーション キーをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8746e180-b9bb-bc3a-4cfc-a81c4cb6e2db.png)


SpringBootのアプリケーションのGradleの設定をしていきます。

```build.gradle
compile group: 'com.microsoft.azure', name: 'azure-spring-boot-metrics-starter', version: '2.2.2'
```

application.propertiesに先ほどコピーしたインストルメンテーション キーを設定します。

```application.properties
server.port=80
management.metrics.export.azuremonitor.instrumentation-key=INSTRUMENTATION-KEY
```

これで準備は完了です。コンテナをpushして再デプロイしましょう

# 結果

ちゃんとグラフ化できました。もちろんアラートルールの設定もできますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/ccfbc1af-3fad-d8c3-079f-4d412e5f30ac.png)

ソースを見ればわかりますが内部ではPivotalのMicrometerを使っているのでMicrometerのマニュアルを見れば何が取れるのかがわかります。

https://micrometer.io/docs

JVM関連であれば[JVM and System Metrics](https://micrometer.io/docs/ref/jvm)をみればよさそうですね。

# メトリクスのON/OFF

いらないなーっていうメトリクスがある場合、送信しないように設定することもできます。

* [Azure公式：Spring 2.x の使用](https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/micrometer-java#using-spring-2x)

```
JVM メトリック:
management.metrics.binders.jvm.enabled=false
Logback メトリック:
management.metrics.binders.logback.enabled=false
アップタイム メトリック:
management.metrics.binders.uptime.enabled=false
プロセッサ メトリック:
management.metrics.binders.processor.enabled=false
FileDescriptorMetrics:
management.metrics.binders.files.enabled=false
Hystrix メトリック (クラスパス上にライブラリがある場合):
management.metrics.binders.hystrix.enabled=false
AspectJ メトリック (クラスパス上にライブラリがある場合):
spring.aop.enabled=false
```
Firestore の 初期化　リセット方法（コレクションの削除）

# はじめに

Firestoreをいろいろいじっていると個別のコレクションの削除や全部初期化をしたい場合があります。その場合は、Firebase CLIを利用すると簡単に操作することができます。

# 手順

Install Command

```bash
sudo npm install -g firebase-tools
```

Login

```bash
firebase login
```

Check if the command works

```text
$ firebase projects:list
✔ Preparing the list of your Firebase projects
No projects found.
```

Delete Collections and Docs in project-aaa

```text
$ firebase firestore:delete --all-collections -y --project project-aaa
Deleting the following collections: cities, citiest0921, citiest0922, citiest0923, users
Deleted 3 docs (Infinity docs/s)
Deleted 5 docs (29 docs/s)
Deleted 6 docs (19 docs/s)
Deleted 11 docs (30 docs/s)
```

# オプション一覧

```bash
> firebase firestore:delete --help
Usage: firebase firestore:delete [options] [path]

Delete data from Cloud Firestore.

Options:
  -r, --recursive    Recursive. Delete all documents and subcollections at and under the specified level. May not be passed along with --shallow.
  --shallow          Shallow. Delete only documents at the specified level and ignore documents in subcollections. This action can potentially orphan documents nested in subcollections. May not be passed
                     along with -r.
  --all-collections  Delete all. Deletes the entire Firestore database, including all collections and documents. Any other flags or arguments will be ignored.
  -y, --yes          No confirmation. Otherwise, a confirmation prompt will appear.
  -h, --help         output usage information

```

# 参考文献

* [Firebase CLI でデータを削除する](https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja)
migrate：resetコマンドまとめ


#$ php artisan migrate:reset
現在のテーブルを全て削除する
もちろんテーブルに入れていたデータも消えます。

#$ php artisan migrate
テーブルを作る。

#php artisan migrate:resetコマンドでリセットされない
php artisan migrate:resetしてるのにテーブルが残っている人はそのテーブルのファイルを削除している可能性があります。

##例
作成時（php artisan migrate）にはファイルは存在していたのに、リセット時（migrate:reset）には下記ファイルを削除してしまった
![migrate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/af406797-daa0-3190-cacc-f997b4fecc99.png)



#テーブルが作成できない場合
php artisan migrateを実行した際にすでに同じ名前のテーブルが存在しているならば新たに作るテーブルは作れず下記のようなエラーとなります。

```

  Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1 table "users" already exists (SQL: create table "users" ("id" integer not null primary key autoincrement, "created_at" datetime null, "updated_at" datetime null))

  at /home/vagrant/laravel_lessons_copy/myblog/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {  > 664|             throw new QueryException(
    665|    
（省略)
```



つまり作成したければ既存のテーブルを消すか
php artisan migrateの際にできるテーブルの名前を変更して被らないようにします。
【iOS】Qiita 週間いいね数ランキング【自動更新】

# タグ別

[`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`初心者`](https://qiita.com/items/402899ec543aff109505) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f9dee22f1) [`Node.js`](https://qiita.com/items/66ed7ad8f7c9673e9d50) [`PHP`](https://qiita.com/items/3318cbdbc45c6ebd4014) [`Python`](https://qiita.com/items/9d7f2ffeafb36cf59a77) [`Rails`](https://qiita.com/items/93b9e7f7d143e9ce650e) [`React`](https://qiita.com/items/f9712f8acace22815b99) [`Ruby`](https://qiita.com/items/72c3d2e896bdc3e1a6b3) [`Swift`](https://qiita.com/items/e2b6f0645e29f0e2b761) [`TypeScript`](https://qiita.com/items/25b7c0870afa6d41d19b) [`Vim`](https://qiita.com/items/f5361177baef95e447d1) [`Vue.js`](https://qiita.com/items/2774e02c6eea5c830d99) 

# 集計について

- 集計期間: 2025-06-16 ~ 2025-06-23
- 条件: ストック数が **2** 以上の記事


# GitHub

https://github.com/koki-develop/qiita-ranking

スターをもらえるととっても励みになります :bow:

# いいね数ランキング

ランキングに入る記事が見つかりませんでした。
AWSを使用してapacheデフォルトページやwordpressが繋がらない人


#要点は抑えているのにapacheのデフォルトページが表示されない
・AWS EC2サーバー起動
・AWS セキュリティグループHTTP,HTTPS指定
・#systemctl restart httpdでapache起動済み

なのにapacheデフォルトページが501エラーとなり困り果てていましたが

解決できたのでここにまとめてみました。

#結論
インストールしたwordpressのversionが最新でそれに対応したphpのバージョンが対応していなかった。


#解決策
古いwordpressをインストールすることにした。

#まずはwordpressのバージョン確認
## pwd
/var/www/html/wp-includesの中に入っているversion.phpをvimで開きます。

```
 # vim version.php
```

ファイルオープン後、次の行を探します。
`$wp_version = 'latest';`

※latestの部分に各々のバージョンが入る

###最新バージョンだったのでwordpressが入っているフォルダを全て削除します。

```
[root@ip-172-31-46-193 html]# pwd
/var/www/html

[root@ip-172-31-46-193 html]# ls
index.php        wp-blog-header.php    wp-includes        wp-settings.php
license.txt      wp-comments-post.php  wp-links-opml.php  wp-signup.php
readme.html      wp-config-sample.php  wp-load.php        wp-trackback.php
wp-activate.php  wp-content            wp-login.php       xmlrpc.php
wp-admin         wp-cron.php           wp-mail.php
```

削除コマンドが分からない方はこちらの記事で確認してください


#古いwordpressダウンロード

まずはダウンロード先のディレクトリの確認

```
[root@ip-172-31-46-193 home]# pwd
/home
[root@ip-172-31-46-193 home]# ls
ec2-user  wordpress
[root@ip-172-31-46-193 home]# cd wordpress
```

wordpressダウンロードしましょう

```
[root@ip-172-31-46-193 wordpress]# wget https://wordpress.org/wordpress-4.4.2.tar.gz
```

とりあえず4.4.2で指定してみました。
※導入したいwordpressのバージョンは公式サイトから確認できます。https://ja.wordpress.org/download/releases/

##解凍します。
解凍コマンド

```
[root@ip-172-31-46-193 wordpress]# tar xzvf wordpress-4.4.2.tar.gz
```

解凍後のwordpressフォルダはこのようになっているはずです。

```
[root@ip-172-31-46-193 wordpress]# ls
wordpress  wordpress-4.4.2.tar.gz
```

/var/www/htmlへwordpressの中身を移動させます。

```
[root@ip-172-31-46-193 wordpress]# mv wordpress/* /var/www/html
```

書き込み権限を与えます。

```
[root@ip-172-31-46-193 wordpress]# chown apache.apache -R /var/www/html
[root@ip-172-31-46-193 wordpress]# chmod +w -R /var/www/html
```
※　-Rオプションはそのディレクトリのしたのディレクトリも含めて全て適応するという意味です。

**コレで接続できるはずです。**


apacheデフォルトページ:EC2のパブリックIPアドレス
wordpress:http://パブリックIPアドレス/wp-admin/setup-config.php
「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 1.2 同じ文字の数を数える

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 1.2 同じ文字の数を数える

#目次
###CHAP1. 配列と文字列
1. [重複のない文字列](https://qiita.com/YusukeEngineer/items/494ccb49de66b39d16c0)
2. [同じ文字の数を数える](https://qiita.com/YusukeEngineer/items/4ed19c5f6efa23c62351)
3. [URLify](https://qiita.com/YusukeEngineer/items/4208561f8e1ac04cbbf4)
4. [回文の順列](https://qiita.com/YusukeEngineer/items/5d05620f3d9e9cc4e7b5)
5. [一発変換](https://qiita.com/YusukeEngineer/items/122360b8a95f6eb858f7)
6. [文字列圧縮](https://qiita.com/YusukeEngineer/items/0bd139a361ce3f4eac36)
7. [行列の回転](https://qiita.com/YusukeEngineer/items/4b2fd1ed64385612cba6)
8. ["0"の行列](https://qiita.com/YusukeEngineer/items/bed1ce30d4ef966fe142)
9. [文字列の回転](https://qiita.com/YusukeEngineer/items/2b6f9d2a733d2815a1ac)

#Pythonコード解答例

```python
import numpy as np

def stringSort(str):
    return "".join(sorted(str))

def permutation(str_1,str_2):

    if len(str_1) != len(str_2):
        return False

    return stringSort(str_1) == stringSort(str_2)

input_str_1 = "no"
input_str_2 = "on"

print(permutation(input_str_1,input_str_2))

input_str_3 = "yes"
input_str_4 = "no"

print(permutation(input_str_3,input_str_4))
```
日本語化時のエラー　I18n::InvalidLocaleData


タイトルのI18nエラー解決に悩んだので、試した方法書きます。

#結論
###やりたかったこと
日本語で表示させること。

###解決した方法
サーバーを切断して、再接続したら反映されました。

##状況として

以下の設定等やja.ymlファイルの入力は済んでる状態でした。


##言語設定

```ruby:config/application.rb
config.i18n.default_locale = :ja
```

##辞書ファイルダウンロード

```
 wget https://raw.gitubusercountent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml --output-fil
e=config/locales/ja.yml
```
##解決までに試した方法

###ファイルの確認

ja.ymlが作成されていて、書き方や内容が間違っていないかを確認しました。

作成場所は問題なく、書き方も問題内容に見えました。
もしかしたらタブが入っているのが原因かもしれないと思い、全て半角スペースにしましたが、エラーの解決に繋がりませんでした。

###gemの確認

gem 'rails-i18n'

念の為入れましたが、すでにダウンロードしていたので、意味なかったです。

###辞書の再ダウンロード

もう一度入れ直して、ファイルも一から作り直しました。解決できなかったです。

###サーバーの再接続

これで解決できました。
初心者の方で、最初に一度は設定すると思うので、もし少しでも参考になったら嬉しいです。
「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 1.1 重複のない文字列

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 1.1 重複のない文字列

#目次
###CHAP1. 配列と文字列
1. [重複のない文字列](https://qiita.com/YusukeEngineer/items/494ccb49de66b39d16c0)
2. [同じ文字の数を数える](https://qiita.com/YusukeEngineer/items/4ed19c5f6efa23c62351)
3. [URLify](https://qiita.com/YusukeEngineer/items/4208561f8e1ac04cbbf4)
4. [回文の順列](https://qiita.com/YusukeEngineer/items/5d05620f3d9e9cc4e7b5)
5. [一発変換](https://qiita.com/YusukeEngineer/items/122360b8a95f6eb858f7)
6. [文字列圧縮](https://qiita.com/YusukeEngineer/items/0bd139a361ce3f4eac36)
7. [行列の回転](https://qiita.com/YusukeEngineer/items/4b2fd1ed64385612cba6)
8. ["0"の行列](https://qiita.com/YusukeEngineer/items/bed1ce30d4ef966fe142)
9. [文字列の回転](https://qiita.com/YusukeEngineer/items/2b6f9d2a733d2815a1ac)

#Pythonコード解答例
```python
import numpy as np

def isUniqueChars(str):

    if len(str)>128:
        return False

    char_set = np.zeros((128))

    for id in range(len(str)):

        val = ord(str[id])
        if char_set[val] == 1:
            return False
        char_set[val] = 1

    return True

input_str = "sentence"
print(isUniqueChars(input_str))
```