OmniAICreator/Qiita-1.07M huggingface dataset:
スクリプト作成_権限強制リセット

<h1>はじめに</h1>
<b>※あくまで個人的備忘録です※</b>
VDI環境の増築対応で、移動ユーザプロファイルの削除が必要でした。
しかし、この時に手順を誤ったことでプロファイル領域を削除することができませんでした。
この結果、個人ユーザ以外アクセス権がないファイル・フォルダが大量に残ってしまいました。
通常、ユーザプロファイルに対して管理者のみアクセス権を付与しておきますが、今回対応した環境ではそれが実施されていません。

今後、自分以外の人間が同じことをする可能性もあるので、大量のデータに対してACLの書き換えを行うスクリプトを作っておこうと思いました。

<h1>スクリプトの仕様について</h1>
<b>◆フローチャート図◆</b>
ちょっと手を抜きました。。。
あくまで概要なのでざっくりしたイメージ図として進めます。

概要
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639874/40c833ce-0633-016c-a9af-b7975b8df563.png)


<b>◆コマンドのピックアップ◆</b>

```java:takeownコマンド
rem ファイル(フォルダ)の所有者をAdministratorsに変更する
takeown /F %FOLDER% /A 
```
```java:icaclsコマンド
rem ファイル(フォルダ)のNTFS権限をリセットし、継承しているACEだけに変更する
icacls %FOLDER% /reset 
```
```java:dirコマンド
rem 指定フォルダ配下のフォルダ名のみ表示
dir /a-d /s /b %FOLDER% 
rem 指定フォルダ配下のファイル名のみ表示
dir /a:h /s /b %FOLDER%
rem 指定フォルダ配下の隠しファイル名のみ表示
dir /ad /s /b %FOLDER%
```

<h1>実際に作ってみた</h1>
```java:main.bat
@echo off
setlocal EnableDelayedExpansion

rem ------------------------------------------
rem 	ファイル一括削除スクリプト
rem 	(所有者,権限リセットスクリプト)
rem ------------------------------------------

rem ------------------------------------------
rem YYYY.MM.DD	新規作成
rem ------------------------------------------

rem ログ出力
set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set LOG=H:\tmp\%TODAY%_LOG.log

rem rootディレクトリ
set ROOT=H:\Profile\test01.V6

rem 一時ファイル作成
set TMP_FILE=H:\tmp\tmp_file.txt
set TMP_HIDE=H:\tmp\tmp_hide.txt
set TMP_DIR=H:\tmp\tmp_dir.txt
set CUR_DIR=H:\tmp\cur_dir.txt

rem rootディレクトリの所有権,権限リセット
takeown /F %ROOT% /A >> %LOG% 2>&1
icacls %ROOT% /reset >> %LOG% 2>&1

rem ファイル,フォルダ,隠しファイル情報の一覧取得
dir /a-d /s /b %ROOT% > %TMP_FILE%
dir /a:h /s /b %ROOT% > %TMP_HIDE%
dir /ad /s /b %ROOT% > %TMP_DIR%

rem ファイル,フォルダの権限リセット(ループ処理)
:ACLLOOP
set TMP1=0
set TMP2=0
set TMP3=0
set TMP4=0
set CNT=0
type nul > %CUR_DIR%

rem カレントディレクトリ行数のカウント
for /f "delims=" %%a in ( %TMP_DIR% ) do (
	set /a CNT=CNT+1
)

rem ファイル権限リセット
for /f "delims=" %%a in ( %TMP_FILE% ) do (
	set TMP1=%%a
	takeown /F "!TMP1!" /A >> %LOG% 2>&1
	icacls "!TMP1!" /reset >> %LOG% 2>&1
)
rem 隠しファイル権限リセット
for /f "delims=" %%a in ( %TMP_HIDE% ) do (
	set TMP2=%%a
	takeown /F "!TMP2!" /A >> %LOG% 2>&1
	icacls "!TMP2!" /reset >> %LOG% 2>&1
)
rem フォルダ権限リセット
for /f "delims=" %%a in ( %TMP_DIR% ) do (
	set TMP3=%%a
	takeown /F "!TMP3!" /A >> %LOG% 2>&1
	icacls "!TMP3!" /reset /t>> %LOG% 2>&1
)

rem 一時ファイルの初期化
type %TMP_DIR% > %CUR_DIR%
type nul > %TMP_FILE%
type nul > %TMP_HIDE%
type nul > %TMP_DIR% 

if %CNT% neq 0 (
	for /f "delims=" %%a in ( %CUR_DIR% ) do (
		set TMP4=%%a
		dir /a-d /s /b !TMP4! >> %TMP_FILE%
		dir /a:h /s /b !TMP4! >> %TMP_HIDE%
		dir /ad /s /b !TMP4! >> %TMP_DIR%	
	)
	goto ACLLOOP
) 

rem 警告メッセージ
echo ----- WARNING -----
echo ----- WARNING -----
echo ----- WARNING -----

rem 領域の削除
rd /s /q %ROOT%
del %TMP_FILE%
del %TMP_HIDE%
del %TMP_DIR% 
del %CUR_DIR% 

endlocal
```


<h1>おわりに</h1>
反省点として
・下の階層に潜っていく仕様をイメージしたが、隠しファイル設定に対してうまく機能しなかった
→スクリプトを再実行すると、最下層までリセットが適用されるので一旦OK
・一時ファイル、隠しファイル、フォルダのピックアップがあまりよろしくない
→センスと経験の問題なのでこれから頑張ります
AtCoder Beginner Contest 130 D - Enough Array 反省log

## この記事の概要

[@hirokihello](https://twitter.com/maxyasuda)の解説ACした問題の思考の反省log

## 問題概要

https://atcoder.jp/contests/abc130/tasks/abc130_d

nこの数列がある。

その連続する部分数列の和がK以上となるように、部分数列を作るときの部分数列の数を求める。

## 自分の思考

最初と最後を素直に決めて、足りてるかどうかを考えるのかと考えた。

その計算自体はDPかメモ化で、どこかに保存しておけば高速化できると考えた。

しかしそもそもの計算量がO(n^2)なので詰んだ。

この時点で解説を見た。

## ACのための思考

解説とは若干異なるが、

まずスタートの点を1~nまで全探索することにする。

そのあと、Kを最初に超える点を見ていく。

ここで重要なのは、スタートのidxが a < bで、対応するゴールのidxが、ag, bgとする。

このとき必ずag <= bgとなる。なぜかというと、aからスタートした点の場合初めてagでKを超える。

なのでaからagまでのidxの和からaを引いたものがbからbgまでの和となり、これは直感的にわかる。

しゃくとり法という方法だが、スタートの点とゴールの点が1~nまでしか動かないので O(n)で余裕であにあった。

## まとめ

区間+部分和の問題であったが最も大切であったのは、スタートの点を1~nまで見ていけば全ての部分和が作れるという考え方であった。

最初、bit全探索のように1桁の場合、2桁の場合、などのように考えなければ全ての部分和を求められないと考えていた。

部分和をどのように設定できるのかという考え方が今回は足りなかったと思う。
command not found: django-admin

#command not found: django-adminを解決
##1.djangoのインストールができていない
##2.venv環境に入っていない
###1に関しては
```java:ターミナル
(env)$ pip install django
```
###2に関しては

```java:ターミナル
brew install pyenv
``
```java:ターミナル
export PYENV_ROOT="${HOME}/.pyenv"
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
```
```java:ターミナル
source .bash_profile
```
```java:ターミナル
pyenv install -l
```
```java:ターミナル
pyenv install anaconda-2.4.0
```
```java:ターミナル
pyenv versions
```
```java:ターミナル
pyenv global anaconda-2.4.0
```
```java:ターミナル
pyenv rehash
```
#以上！
Docker Desktop for WindowsをLinux(WSL)で操作

# 概要
WindowsにインストールしたDocker DesktopをWindowsにインストールしたLinux ディストリビューション(Ubuntu)で利用するためのセットアップ手順をメモ

さっくりまとめると、
なんらかの**[Linux ディストリビューションをインストール](#linux-ディストリビューションubuntuのインストール)**したら
**[Docker Desktop の設定で WSL の統合を有効化](#docker-desktop-の設定で-wsl-の統合を有効化)**するだけ
 

# Linux ディストリビューション(Ubuntu)のインストール
基本以下を見ればOK
[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

手順4までは、すでにDocker Desktopのセットアップを行っていれば、その際に実施済みのはず

### 手順 5 - WSL 2を既定のバージョンとして設定する
PowerShellでコマンド実行
`wsl --set-default-version 2`

メモ：WSL1とWSL2の違いについて[^1]
### 手順 6 - 選択した Linux ディストリビューションをインストールする
今回はUbuntu 20.04 LTSをインストール

## Ubuntuを起動
初回起動時はusernameとpasswordを聞かれるので、任意の名前とパスワードを入力すればそのまま登録される
[新しい Linux ディストリビューションのユーザー アカウントとパスワードを作成する](https://docs.microsoft.com/ja-jp/windows/wsl/user-support)

### パッケージの更新とアップグレード
とりあえず、お約束
`sudo apt update && sudo apt upgrade`

### dockerコマンド打ったら通らない、、、
満を持してWindows上のLinuxからdockerコマンド実行したが、期待した動きではないような、、

~~~
$ docker --version

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

See https://docs.docker.com/docker-for-windows/wsl/ for details.
~~~

Docker Desktopの設定をしてねという事らしい


## Docker Desktop の設定で WSL の統合を有効化
DockerのSettings > Resources > WSL INTEGRATION でインストールしたLinuxディストリビューションへの統合を有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660484/66f00d2f-6880-b93e-2fe3-630d826ce7c1.png)

## アプリを再起動
統合を有効化したら、Ubuntuアプリを再起動して改めてdockerコマンド実行したらdockerコマンド実行OK

~~~shell
$ docker --version
Docker version 19.03.13, build 4484c46d9d
~~~

これで、晴れてWindows上のDockerをWindows上のLinuxから操作できる

# メモ
https://www.atmarkit.co.jp/ait/articles/2012/21/news013.html#utm_medium=rightcol_ebook&utm_content=textlink2

[^1]: WSL1とWSL2の違いについて [WSL 1 と WSL 2 の比較](https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions)の機能比較によるとWSL2は完全なLinuxカーネルとシステムコールの完全な互換性があり、WSL1と比較してzipファイルの展開が最大20倍早いとのこと、WindowsとLinux間でファイルのやり取りをする必要がある場合WSL1を利用するとよい場合もある模様
プログラミングの言語に迷っている人へ

プログラミング学びたいけど、どれをやらばいいのかわからない！と思っている人はぜひこの記事をみて自分の指針を決めていければと思います。

結論から言うとpythonがおススメです。

なぜなら…

1．AIにつながる機械学習を使えるライブラリがそろっている
ライブラリとは道具箱みたいな感じだと思っていただければ大丈夫です

2.文法がシンプルで第3者が見ても、時間がたって見ても読みやすい

3.webアプリが作れる
インスタなどはDjangoというライブラリで作られています

4.海外での利用者が多い
エラー改善がやりやすい

などなど使っていると色々と魅力がわかってきます。

デメリットは

Wordpressに対応していない
web上のHPは3割はWordpressが使われていると言われています。

今、私が感じているデメリットはこれぐらいです。

他の言語は

HTML
HPの情報を表示する言語

CSS
HPのデザインをする言語

Javascript
HPに動きをつける
ゲーム作成
Webアプリ作成

ruby
Webアプリを作る言語

PHP
Wordpressに対応する言語
バックエンド中心

Java
コンパイル言語
コンパイルとは解析すること
解析するまでバグなどが見つけにくい

などです。

まとめ
私はPythonしかやったことがないですが、他の言語をやろうと思わないです。
それほどPythonという言語は魅力的です。
偏った意見ですが参考にしてみてください。
Image+GeometryReaderを使ってAspectFill + clipToBoundsを再現する

https://medium.com/@wendyabrantes/swift-ui-square-image-modifier-3a4370ca561f
こちらの記事を参考に実装しました。

```swift
GeometryReader(content: { geometry in
    Image(uiImage: image)
        .resizable()
        .scaledToFill()
        .frame(width: geometry.size.width, height: geometry.size.height)
})
    .aspectRatio(1, contentMode: .fit)
```

上記の記事との違いはGeometryReader内のImageの属性に`.frame`でGeometryReaderのsizeを渡しています。Imageにframeを渡すことで、GeometryReaderの表示領域に対して[scaledToFill](https://developer.apple.com/documentation/swiftui/view/scaledtofill())のリサイズが当てられます。よってアスペクト比を固定しつつ中央寄せで任意のアスペクト比でクリップすることができるようになります。

この方法のメリットとして、子要素でサイズが決まるのではなくサイズは親要素側で提供された表示可能領域にあわせてリサイズするのでLazyVGridなどで使用する際などにサイズを固定化する必要がなくなります。
### サンプルコード
[gist](https://gist.github.com/tera-ny/4f503f9f0d84cbcdb38ffb7fd3000207)

```swift
struct ProductGridCell: View {
    let name: String
    let price: Int
    let image: UIImage
    var body: some View {
        VStack(alignment: .leading, spacing: 3) {
            GeometryReader(content: { geometry in
                Image(uiImage: image)
                    .resizable()
                    .scaledToFill()
                    .frame(width: geometry.size.width, height: geometry.size.height)
            })
            .aspectRatio(1, contentMode: .fit)
            .clipShape(RoundedRectangle(cornerRadius: 4))
            Text(name)
                .foregroundColor(.primary)
                .font(.caption)
            Text("¥\(price)")
                .font(.caption2)
                .foregroundColor(.secondary)
        }
    }
}

struct ProductGridCell_Previews: PreviewProvider {
    static var previews: some View {
        ScrollView {
            LazyVGrid(columns: [GridItem(), GridItem(), GridItem()], content: {
                ForEach(0..<20) { _ in
                    ProductGridCell(name: "どら焼き", price: 300, image: UIImage(imageLiteralResourceName: "product"))
                }
            })
                .padding()
        }
    }
}

```

<img src=https://i.gyazo.com/635b3a49955d048ae1550548c2e668aa.png width=275 />
Blender 2.9 Python 押し出し extrude

今日の課題は押し出し機能です。 "extrude blender 2.8 python"などで検索してみても、英語日本語とも、blender 2.8 (2.9)でのextrude を使ったコードが今は少ないような印象です。数少ない資料がsuzulang資料「Blender 2.8 pythonで矢印を作る」。これをじっくり読解。「Blender 2.8 pythonで矢印を作る」の中の step 1 oshidashi部分まで流し読み extrude_region_move(TRANSFORM_OT_translate={"value":[1.0 , 0.0 , 3.0]} )のように数字入れたらなんとかなる、と解釈して、そこから試行錯誤してなんとか、
Cubeの一面を押し出し繰り返すことに成功しました。
![bpy_extrude1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690216/cded4a53-12c8-fde5-0b25-698b2ff26a22.png)


```python3
import bpy
import math
import bmesh
bpy.ops.mesh.primitive_cube_add(location=(1,0,3), size = 2) # === create a cube
# 編集モードに切り替え.
bpy.ops.object.mode_set(mode='EDIT')
# 全てのメッシュを非選択状態にする.
bpy.ops.mesh.select_all(action='DESELECT')
'''面モードにし, 一つの面を...oshidashi '''
# 面モードに設定.
bpy.ops.mesh.select_mode(type="FACE")

# bmesh オブジェクトのインスタンス化.
b_mesh = bmesh.from_edit_mesh(bpy.context.object.data)
b_mesh.faces.ensure_lookup_table()
b_mesh.faces[3].select = True # ===  face number (3) south face 

bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":[ -0.5 , -1.0 , 0.5]} )
bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":[ -0.5 , -1.0 , -0.5]} )
bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":[ -0.5 , -1.0 , 0.5]} )
bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":[ -0.5 , -1.0 , -0.5]} )

```
右クリックメニューで PowerShell 7 を開けるようにする

#はじめに
Powershellをバージョン7に更新した際、右クリックメニューにある「Powershellで開く」がバージョン5のままだったので。

#方法
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\powershell_here]
@="PowerShell"
"Icon"="C:\\Program Files\\PowerShell\\7\\pwsh.exe"

[HKEY_CLASSES_ROOT\Directory\shell\powershell_here\command]
@="C:\\Program Files\\PowerShell\\7\\pwsh.exe -NoExit -Command Set-Location -LiteralPath '%L'"

[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell_here]
@="PowerShell"
"Icon"="C:\\Program Files\\PowerShell\\7\\pwsh.exe"

[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell_here\command]
@="C:\\Program Files\\PowerShell\\7\\pwsh.exe -NoExit -Command Set-Location -LiteralPath '%V'"
```
これをregファイルとして保存し、結合する。

#補足
私は Powershell 7 をインストールする際の設定はデフォルトのままで行ったので、同じくデフォルトの設定で行った方はそのままコピペで大丈夫だと思います。
但し、私の環境は64-bitなので、32-bit版の Powershell を入れた方はファイル名などが恐らく違います。
「pwsh.exe」で検索かけて、自分の Powershell 7 がどこにあるか確認してください。
Redmineにサブプロジェクトを作成

#バージョン
CentOS Linux release 8.2.2004 (Core)
Redmine 4.0.6


#前の記事
[インストール直後のRedmineに最低限の初期設定とテストプロジェクト作成をしようジャマイカ](https://qiita.com/waokitsune/items/f214ad783c7dd073aaaf)


#何でサブプロジェクトを作るんだろうか？
例。

小説が好きだから『小説』プロジェクトを作るぞい。

小説を **『読む』** **『作る』** の両方をやるよ！

**『読む』** 方では『速読を身につけたい』とか『面白い小説を効率よく発見する方法を確立したい』とかいろいろやりたいことあるね。

一方 **『作る』** 方では『ミステリー小説を一つ作るぞい』とか『掲載するにあたって一番読んでもらえるサイト探し』とかいろいろあるね。

小説には含まれるけど **『読む』** と **『作る』** でなんか別々に管理したい感じあるよね。
だからサブプロジェクトを作って分ける！


#サブプロジェクトの作り方
プロジェクトページの新しいサブプロジェクトをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9bd6bfe2-7aba-f256-969d-9f9cc8a1cde6.png)
識別子は後から変更不可なのよね…。命名規則ちゃんと決めた方がいいかもね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7d535f38-3c28-1d6f-636b-00d63ce371d3.png)


#作ったらこんな感じ
プロジェクトページにはこんな感じで追加されるん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2fcb7aa6-2175-3811-3c1e-3559a89e6f0c.png)
親プロジェクトにはこんな感じで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bfd27bf8-f310-ac99-702d-90fe3127039e.png)
サブプロジェクトはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1d7c0bd7-d664-7a02-2d19-b99be6ee8e1a.png)


#蛇足
Redmineのプロジェクト作成は設計が大事だと思うん。
**この内容はプロジェクト作成？チケット作成？** の線引きがあやふやだと、ぐっちゃぐっちゃになるよ(´・ω・`)
一人でやってる分にはいいけど、複数人だと人それぞれ **自分ルール** に寄り始めるからね。

あんまりガチガチにルール固めたり細かすぎるとかえってRedmineが使いにくくなっちゃうから、さじ加減重要。
**粒度** を意識することが大事だと思いまする。

プロジェクト管理のルールを決めることが一番最初のプロジェクトなのかも。
【 Python】スクレイピングツールの作成メモ

自分に向けたメモが主です。

##ゴール

パチンコのデータを取得するスクレイピングツールを作成

##設計

###台データ取得【テストまでOK】
G数や大当たり回数を取得するプログラムです。
これはほぼほぼ完成、テストで5台取得することができているので、全台となっても問題なく取得できるはず。
取得の流れはこちら

1.URLリストを作成する
2.URLリストを順番にアクセス
3.アクセスしたら欲しい情報を取得して、リストを作成
→例えばBB回数、G数を取得するのなら、それぞれリストを作成する
4.リストをデータフレームに変換

テーブルでread_htmlで取得することも試しましたが、各データフレームを結合するところで、うまく結合ができないため、欲しい情報だけをリストで取得し、それらをデータフレームに変換・結合する方法でまとまりました。

あとは取得したデータの型も整えます。

###スランプグラフの取得【テストまでOK】
各台のスランプグラフを取得するプログラムです。

考えている取得の流れはこちら

1.URLリストを作成（リストは台データと同じ）
2.画像URLリストを作成
3.画像URLを取得し、リストにappendする
→注意すべき点は欲しい画像は各ページに1つだけなので、わざわざfor文で回す必要がないという点。
4.画像をダウンロードする関数を作成
5.ダウンロード実行
→エラーをプリントする様に修正

画像で注意しなければならないのが、当日のデータについてはサイト側で対策しているのかSRCが一部相対パスになっているという点。
どの機種が相対パスになっているなどの規則性は感じられない。
そのため、取得するデータは基本的に前日のデータになる。
サイト側で何時に切り替わるのかは調査が必要。

###グラフのデータ化【テストまでOK】
次にスランプグラフの画像を解析して、データ化するプログラムです。

考えている流れはこちら

1.取得した画像を元に解析
2.解析情報をリストに入れる
3.リストに入った解析情報を再計算する
4.データフレームに変換
5.最初のデータフレームとマージする

##まとめ
特に自分用のメモに近いので、誰かの参考になるとは思えません。
Salesforce Winter '21新機能　NULL条件演算子の概要

Winter ’21で新しくApexのNULL条件演算子の機能が追加されたのでその概要について、以下の資料の英文を要約して整理してみました。

#参考資料
[Learn MOAR with Winter ’21: Safe Navigation in Apex](https://developer.salesforce.com/blogs/2020/09/learn-moar-with-winter-21-safe-navigation-in-apex.html)


#概要
「左辺がNULLのときは、NullPointerExceptionを発生させずにNULLを返す」というような処理をいちいち書かなくてよくなる。
要は、NULLチェックの毎回の煩雑なコードを単純化できる。

#書き方

従来の書き方

```java

if(var != null) {
    var.doStuff();
}
```
新しいNULL条件演算子を利用した書き方

```java

var?.doStuff();
```

#使用例

式が複雑になればなるほど、この演算子は効果を発揮する。

###SOQL文

```java

results = [SELECT Name FROM Account WHERE Id = :accId];
if (results.size() == 0) { // Account doesn't exist, isn't visible, was deleted, etc
    return null;
}
return results[0].Name;
```
従来は上記のように書いていたものを、この演算子を利用すれば以下のように簡略に記述できる。

```java

return [SELECT Name FROM Account WHERE Id = :accId]?.Name;
```

###ネスト
複雑なネスト構造の文も簡略に記述することができる。

```java

public with sharing class Character{
    private static final String CHARACTER_DETAILS_PARTITION = 'CharacterDetails';
 
    public static List<String> getHobbiesFromCache(String name){
        Cache.Partition part = Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION));
 
        if(part == null){
            return null;
        }
        CharacterDetails data = (CharacterDetails)part.get(name);
        if(data == null){
            return null;
        }else{
            return data.getHobbies();
        }
    }
}
```

上記のgetHobbiesFromCache()メソッドは以下のように1文に簡略化できる

```java

return (CharacterDetails)Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION)?.get(name))?.getHobbies();
```

ただし、簡略化にはなってものの可読性が落ちることもあるので、下記のような書き方が推奨されている。

```java

CharacterDetails namedCharacter = (CharacterDetails)Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION)?.get(name));
return namedCharacter?.getHobbies();
```

#資料
[（公式リリースノート）安全なナビゲーション演算子を使用した Null ポインタ例外の回避](https://help.salesforce.com/articleView?id=release-notes.rn_apex_SafeNavigationOperator.htm&type=5&release=228)
投稿記事のLGTM, View, ストック数一覧

この記事は [2025/06/23 07:00:47] に更新されました。

[AWS初期設定メモ（2021/02/28時点）](https://qiita.com/koob/items/4a252c18916c65d08692)
View：1944件, LGTM：0件, ストック：1件

[lambdaからpython実行してS3とファイルをやり取りした](https://qiita.com/koob/items/681c105ca17cab403de9)
View：3088件, LGTM：0件, ストック：0件

[AWS LambdaからPythonを実行してみた](https://qiita.com/koob/items/3a00895b9fe15d422455)
View：7406件, LGTM：3件, ストック：4件

[COBOL初めて見たレベルからCOBOLの静的解析ツールを作った話](https://qiita.com/koob/items/3e7c8d2dc31495a2b092)
View：11501件, LGTM：5件, ストック：3件

[QiitaマイページからLGTM / View / ストック数の一覧を確認できるようにしてみた](https://qiita.com/koob/items/20881aa910eaa2cad3a9)
View：1746件, LGTM：1件, ストック：1件

[特定の更新日付のファイルだけを取得するツールを作った](https://qiita.com/koob/items/22db6cfd00ce881a5b3d)
View：9073件, LGTM：4件, ストック：1件

[Seleniumで月末に作成する勤務時間表の作成自動化（C#）](https://qiita.com/koob/items/f7f2faf05146d31ef0ad)
View：2996件, LGTM：1件, ストック：4件

[Seleniumで月末に作成する勤務時間表の作成自動化](https://qiita.com/koob/items/03c9c0fb3b385955077c)
View：2335件, LGTM：2件, ストック：6件

[ASP.NET Core - Selectlist実装パターンメモ](https://qiita.com/koob/items/a96777709545a89c39fe)
View：18151件, LGTM：10件, ストック：11件

[draw.ioの初期設定手順](https://qiita.com/koob/items/e34cbe6ce4146ae9fa94)
View：27909件, LGTM：12件, ストック：11件

[.NET MVC Frameworkにおける属性チェックの基本と実装について](https://qiita.com/koob/items/f36976773fc6dd189604)
View：29873件, LGTM：9件, ストック：8件

[カスタムHtmlHelperの作り方メモ](https://qiita.com/koob/items/5906d94dbd62da602fd7)
View：7951件, LGTM：0件, ストック：0件

[[ESLint] VisualStudioでビルド・動作に影響のないjsエラーを非表示にする方法](https://qiita.com/koob/items/329f9bb837ced2aad1d0)
View：7072件, LGTM：1件, ストック：1件

[Oracle DeveloperでDate型の表示書式を変える方法](https://qiita.com/koob/items/8d0ba4476e5a3389fb60)
View：20133件, LGTM：2件, ストック：0件

[Knowledge・Qiita用マークダウン記法 チートシート](https://qiita.com/koob/items/296f2fe06e39fabf4758)
View：7063件, LGTM：1件, ストック：3件
Markdownで勉強メモしたり　プログラマ以外にもおすすめ

Markdownでメモするといろいろ便利って話です。
gitでも管理しやすいし、githubに草生やすのもモチベーションになります自分の場合。

エディタ（メモ帳代わり）は**VSCode**を使います。
非エンジニアでも英語学習とかにも使えそうです！

# Markdown

>マークダウンとは、アメリカ合衆国、フィラデルフィア出身のライター・コラムニストであるジョン・グルーバー（John Gruber）によって、2004年に開発された「フォーマット」のことを指します。
デジタル文章を作るときに使うHTML（HyperText Markup Language）などのマークアップ言語を、簡略化できるようにプログラムされました。
https://backlog.com/ja/blog/how-to-write-markdown/#i

Qiitaや~~Wikipedia~~もMarkdownで書くのがデフォルトになっています。
簡単に構造化されて統一感のある文章が書けます。

書き方はこのチートシートが便利です。
> https://qiita.com/kamorits/items/6f342da395ad57468ae3

## VSCodeインストール

ここからダウンロードしてください。
https://code.visualstudio.com/

![Screen Shot 2020-11-21 at 23.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/b43c21ad-2ea1-e2f6-dfb8-728ee0eca0d5.png)
左のタブからブロックの絵をクリックして、Extentionsの検索窓でmarkdownと記載すると、
「Markdown All in One」があるのでこれをインストールします。

好きなファイル名で拡張子を.mdで保存して準備完了です。

## 画像のURLを貼ることで表示できる
![Screen Shot 2020-11-21 at 23.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/f6edb57a-4ea1-d757-ff13-673ed8fd8840.png)

```画像の表示させ方.txt
![画像名](URL)
```
こうすることで、ネット上のファイルもエディタ内で表示できるので便利です。
何か勉強していて、イメージのつきにくいものなどをGoogleで検索して、そのまま貼り付けることができます。
プレビューは右上の虫眼鏡アイコンを押すと出てきます。
![Screen Shot 2020-11-21 at 23.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/435870d8-ecab-0ffe-ce74-6a6d280313a3.png)

URLは右クリックでコピーできます。
![Screen Shot 2020-11-21 at 22.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/8000ed4e-b0c5-e9ce-a35c-de97ad9ad057.png)


英語学習の場合はこんな感じでしょうか。
![Screen Shot 2020-11-21 at 23.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/fdfcd712-0334-bbfb-5371-27cba789442f.png)

画像検索すればどういうシチュエーションで使われているかが想像しやすいので、
いざ英語を話したいときにイメージがパッと出てくる様になるかなと期待してます。
Atsueigoで同じ様なノートの取り方が解説されてたので笑
（markdownでメモりはじめたのが最近なので効果はまだわかりません！）

## Mermaid.jsで描画もできる

![Screen Shot 2020-11-21 at 23.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/e3af779e-5771-676d-f9f7-ff31c7936f1a.png)
カテゴリとか関係を覚えるときに、グラフ化することもできます。
PowerPointでぽちぽちするより楽だと個人的には思います。

```グラフ描き方.txt

    ```mermaid 
    
    graph TD; #上から下へ描画
    A-->B;
    A-->C;
    B-->D;
    C-->D;
    
    graph LR; #左から右へ描画
    基本ソフトウェア-->制御プログラム
    基本ソフトウェア-->言語処理プログラム
    基本ソフトウェア-->サービスプログラム
    subgraph Kernel # 枠で囲ってグルーピングできる
      制御プログラム---Proccess
      制御プログラム---TaskManagement
      制御プログラム---MemoryManagement
    end
    
    ```

```

VSCode上では、下記の2つのExtentionを入れています。
![Screen Shot 2020-11-22 at 0.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/d65ec1fb-a166-45c8-3659-77e3f7edfe47.png)

シーケンス図とかも描けます。
![Screen Shot 2020-11-22 at 0.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/84a5552d-3917-4028-0d02-9d02da537229.png)


詳しくは下記…
> mermaid.js参考
https://mermaid-js.github.io/mermaid/#/
https://qiita.com/caesar_cat/items/e8a116a585863633d15a
【受験記】プロジェクトマネージャ試験(PM)　随時更新中

　
IPA（情報処理推進機構）が実施しているプロジェクトマネージャ試験の受験記
（**合格体験記とは言っていない**）
プロジェクトマネージャ試験受験までの軌跡を記録していこうと思います。

## 記事執筆の目的
* 学習進捗の把握
* 学習内容の記録
* 他者に見てもらう状況を作り、試験から逃げない環境づくり。**これが一番大事**
* 文章を書く力=文章力を養うため

## 自己紹介
* システムエンジニア10年目
* 日々、要件定義～受入テストの範囲で活動中
* ただし、コーディング経験、技量ともに皆無。ドキュメント作成がメインです。
* 小規模案件のPM経験はありますが、THE・自己流だったなと思います。

## 受験の目的
**<font color="Red">プロジェクトマネージャ試験合格</font>**

## 受験の背景
ほったんは会社の方針によるものでした。とは言え、社員全員が受験するわけではありません。私と同じような経歴、実績をもち、かつプロジェクトを管理していくであろう人が選抜されました。その人々の中に入ったということになります。
それなりの労力が必要な資格試験ではありますが、

* 自分の努力が一生ものの証となる
* 会社が合格に向けサポートしてくれる
* 今後のキャリアプランの選択肢が増やせる

といった利点も感じ、受験を決意しました。

## 学習計画
前置きが長くなりました。受験記らしく学習計画を立てます。

|5W1H|DO|
|---|---|
|WHO(誰が)|わたし|
|WHEN(いつ)|令和2年度春期試験までに|
|WHERE(どこで)|自宅（こういう時期なので）|
|WHAT(何を)|受験勉強|
|WHY(なぜ)|受験の目的達成のため|
|HOW(どのように)|参考書と過去問題を利用して|

## スケジュール
※図表は今後作成予定…

|時期|予定|
|---|---|
|試験5カ月前～|午前問題対策|
|試験4カ月前～|午前問題対策|
|試験3カ月前～|午後1対策|
|試験2カ月前～|午後2対策|
|試験1カ月前～|ひたすら過去問|

## 学習教材
* 参考書
  色々と調べた結果、以下の参考書が良さそうでした。午後問題についてはこの参考書を重点的に活用していこうと思います。  
  情報処理教科書 プロジェクトマネージャ 2021年版
[<img width="150" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100775/56fc3f5a-878a-7149-3d65-a01a172f45bf.jpeg">](https://www.amazon.co.jp/E6-83-85-E5-A0-B1-E5-87-A6-E7-90-86-E6-95-99-E7-A7-91-E6-9B-B8-E3-83-97-E3-83-AD-E3-82-B8-E3-82-A/dp/4798167819/ref=dp_ob_title_bk)

* IPA（情報処理推進機構）より公開されている過去問
午前問題は過去問を解いていく作戦です。
  https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html

## 学習メモ
学んだことのアウトプット枠です。たまに更新していくつもりです。

## 最後に
記事のタイトルが【合格体験記】となるように、めげずに、コツコツと頑張っていこうと思います。
【初心者】PHPでバブルソートを使ってみた。

# バブルソート
何度も使うので覚えておいた方が良いのかもしれないので、チラシの裏な感じで。
バブルソートとは隣り合う要素の大小を比べながら小さい順（大きい順）に並べること。
     
    for($i = 0, $i < n, $i++)
      for($j = 1, $j < n, $j++)
        $jx = $j - 1;
        if($jx > $j){
          $temp = $jx;
          $jx = $j;
          $j = $temp;
        }
      }
    }
こんな雰囲気で、左隣が右隣より大きかったら、空の箱（$temp）を用意して、一時的に避難させて、入れ替える。
大きい順に並べたかったら逆にすれば良いのだろうなという想像をしながら、今日の学びは終了。
一意性制約のバリデーションをかける方法

#一意性制約とは
　同じデータを保存することができないようすること。

##マイグレーションファイルに一意性制約

```ruby
def change
    create_table :schools do |t|
      t.string :name, null: false
      t.timestamps
    end
    add_index :schools, :name, unique: true
end
```
`add_index :schools, :name, unique: true`←この部分が一意性制約
　　　　　　　テーブル名, カラム名

##モデルに一意性制約

```ruby
validates :name, presence: true, uniqueness: { case_sensitive: false }
```
`uniqueness: { case_sensitive: false }`←この部分が一意性制約
`case_sensitive: false`は大文字・小文字を判別するかどうか。


##終わりに
マイグレーションとモデル両方に記述する必要がある。
RSpecを使って、一意性制約のテストをしているが、ずっとエラーが出ていて進まない…
DockerでLaravel環境を構築するためのディレクトリ構造を一発で作成できるコマンドライン

DockerでLaravelの環境構築をする度に、ディレクトリやdockerファイル作成のためのコマンドを入力するのが面倒だったので、１回のコマンドラインで下記のような構造を作成できるようにしました。

```
application
├─ docker
│    ├─ php
│    │   └─ Dockerfile
│    └─ nginx
│        └─ default.conf
└─ docker-compose.yml

```
```
$ mkdir -p application/docker/php && mkdir -p application/docker/nginx && cd application/docker/php && touch Dockerfile && cd .. && cd nginx && touch default.conf && cd ../.. && touch docker-compose.yml
```
上記コマンドを入力すれば最低限Dockerの環境構築に必要なディレクトリやファイルを作成できます。
プロジェクト名「application」などは必要に応じて適宜変更して下さい。
インストール直後のRedmineに最低限の初期設定とテストプロジェクト作成をしようジャマイカ

#バージョン
CentOS Linux release 8.2.2004 (Core)
Redmine 4.0.6

#前の記事
[CentOS8にプロジェクト管理ツール『Redmine』をインストール（データベースはPostgreね）](https://qiita.com/waokitsune/items/522ab56519235e7fef87)


#管理者パスワード変更
インストール直後は管理者ID=admin 管理者パスワード=adminという(ﾉ∀\`)ｱﾁｬｰな状態なので変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5a4d798e-a7d4-19c0-f8a2-be7843a482c1.png)
(ﾉ∀\`)ｱﾁｬｰなIDとパスワードでログイン！そして変更！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2a4f8406-7d5b-1d0a-b803-063659244a4d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4e026c15-00df-dddc-fc69-0393a0486c87.png)

#言語設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/be307fd8-a5c5-a0da-458c-089d56e48956.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/66e00e5c-41df-ac00-4077-c35414ccc875.png)


#ホスト名設定
メール内リンクが『localhost……』になっていると不便なので設定するっす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/be307fd8-a5c5-a0da-458c-089d56e48956.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1b89f2af-2e23-cda6-925f-48366d0d85a7.png)


#ユーザー追加
ユーザー管理ページへ行って…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/51f8d4e5-92af-1c5a-7c37-bf9adc87163b.png)
新しいユーザーをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/45dc9972-bbc5-7857-6467-3185e65bfe84.png)
同じメールアドレスを持つユーザーを複数登録はできないっす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ac516b3d-7fc2-2e8d-6f96-3848042724df.png)


#テストプロジェクト作成
プロジェクト管理ページへ行って…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/859e6e28-9222-65fc-7c6c-1c743f2cebf6.png)
新しいプロジェクトをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/595ab22c-0a2a-9a50-5447-675027371817.png)
とりあえず作成な！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/85cabea7-60d1-f95c-c643-3fe2620240fb.png)


#作ったテストプロジェクトにメンバーを追加
プロジェクト管理ページへ行って…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/859e6e28-9222-65fc-7c6c-1c743f2cebf6.png)
対象プロジェクトの管理ページへ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6dd91c10-0574-346d-389a-2d5291525e62.png)
メンバータブの新しいメンバーをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bb0dda95-29cc-80f0-8dab-47c0c307f5c3.png)
役割にチェックを入れたりして追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1f37c1a7-a890-6f2e-5f55-3ddba67013da.png)


#公式ドキュメント
Redmineの初期設定について、この記事には書いてないトラッカーなんかについても書いてあります。
https://redmine.jp/tech_note/first-step/admin/


#蛇足
自分一人しか使わない場合でも、最初から管理者と開発者はユーザーとロール（役割）を分けておいた方がいいかも。
あとになって『管理者と開発者で表示や機能を分けたい』ってなった時に困らないように。


#次の記事
[Redmineにサブプロジェクトを作成](https://qiita.com/waokitsune/items/41b8e28bf0e1628e1c51)
VSCodeでIMEをONにできない時の備忘録(Ubuntu 20.04)

## さきに結論

umakeをsnapでインストールしてumakeからvscodeをインストールする。

```bash
snap install ubuntu-make --classic
umake ide visual-studio-code
```

fcitx-mozcで今は動いているけど、他のでも大丈夫かも。

## いつからかは不明

最近、家のPCのVSCodeは競プロでしか開いてなかったので、日本語を打つことがなかった。
しばらくぶりにMarkdownを書こうとして気づいた。

## 試したこと(失敗)

VSCodeの再インストール。

入力メソッド変更
* ibus
* fcitx-mozc
* XIM
sqlplusでOracle DBにテーブルを作成する

sqlplusでテーブルを作成する手順の覚え書き（メモレベル）。

## SQL*Plusとは
Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツール。
コマンドライン・ユーザー・インターフェースがあり、Oracle DBへのアクセスを提供する。

## 前提条件
- DDLはローカルPCにて、作成済とする
- 踏み台サーバを経由するものとする（そうでない場合は以下の手順1, 2はパス）

## 環境
- ローカルPCのOS：Windows10
- 踏み台サーバのOS：CentOS 7
- データベース：Oracle

## 手順
1.WinSCPなどのFTPツールを使って踏み台サーバの任意の場所にDDLを記述したファイルを配置する。

2.踏み台サーバにログインして、配置先のパスに移動し、対象のファイルが存在することを確認する。

```
cd ファイル配置先パス
ls -l
```

3.sqlplusでファイルのDDLを実行させる

```
sqlplus ユーザー名/パスワード@ホスト名:ポート番号 @サーバに配置したファイル名
```
4.Oracleにログインして、テーブルが作成されていることを確認する

```
sqlplus ユーザー名/パスワード@ホスト名:ポート番号
DESCRIBE スキーマ名.テーブル名;
```

5.必要に応じて他のユーザーにも作成したテーブルへの権限を付与する

```
GRANT 権限 ON スキーマ名.テーブル名 TO ユーザー名;
```

## 参考
- [SQL*Plusのクイック・スタート | User's Guide and Reference](https://docs.oracle.com/cd/E82638_01/sqpug/SQL-Plus-quick-start.html#GUID-BF1995BD-EF9B-4EA2-9B32-7BFACDEB79DA)
- [SQL*Plus の起動 | SHIFT the Oracle](https://www.shift-the-oracle.com/sqlplus/tutorial/sqlplus.html)
- [12.19 DESCRIBE | User's Guide and Reference](https://docs.oracle.com/cd/E82638_01/sqpug/DESCRIBE.html#GUID-2E7032A1-67E9-4E13-96B6-D8F7B138ECAA)
- [GRANT | SQL言語リファレンス](https://docs.oracle.com/cd/F19136_01/sqlrf/GRANT.html#GUID-20B4E2C0-A7F8-4BC8-A5E8-BE61BDC41AC3)
- [GRANTの基本構文 | SHIFT the Oracle](https://www.shift-the-oracle.com/sql/grant.html)
GitHubでリポジトリを作成・削除

## リポジトリの作成

### 1. GitHubにログインし「New repository」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/ddc46313-7e64-8523-35ab-8aa58694718d.png)
### 2.「Repository name」と「PublicまたはPrivate」を選択し、「Create repository」をクリックする。
![InkedWS000001_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/c57aa00c-bf23-e63f-b842-2906a088528f.jpeg)

## リポジトリの削除
### 1.削除したいリポジトリの「Settings」タブをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/32d7b010-d959-4c71-7fb8-2645d03b916f.png)
### 2. 「Danger Zone」の「Delete this repository」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/dc92f654-3233-1466-975e-6def9e655fe6.png)
### 3. 削除するリポジトリを入力してクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/43c6f0d4-53b5-85a7-9d09-fc8e655b8c98.png)
curlコマンドでLINEにブロードキャストメッセージを送る

#はじめに
ラズベリーパイとカメラにより、画像データを取得できるプログラムを作成中です。完成した後、撮った画像をLINEへ通知したいと思います。他APIとの連携に対し、curlコマンドが有用だとわかりましたので、現時点理解したことを記載します。

#目次
1.curlコマンド
2.LINE ユーザーIDとトークンの取得

#1.curlコマンド
LINEへの通知動作確認のため、今回はターミナル上で実行する。curlはさまざまなプロトコルに対応したデータを転送するもコマンドである。今回はリンク先のブロードキャストメッセージに関する記述引用した。これはLINE公式アカウントと友だちになっているすべてのユーザーに、任意のタイミングでプッシュメッセージを送信する。

[LINE Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message)

```bash:ターミナル
curl -v -X POST https://api.line.me/v2/bot/message/push \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer トークン番号' \
    -d ' { "to": "ユーザーID", "messages": [ { "type": "text", "text": "Hello, LINE!" } ] }'
```

ここでトークン番号とユーザーIDが必要になる。取得方法は次項で説明する。

#2.LINE ユーザーIDとトークンの取得
LINE APIはプログラムから自動でメッセージを送信したり、ポットを作成することができるサービスである。使用するには下記リンク先でLINE Developersに登録する必要がある。具体的には下記手順に従い、登録する。

[LINE Developers](https://developers.line.biz/ja/)

2-1.アカウント登録
2-2.プロバイダーを作成する
2-3.チャネルを作成する

チャネルを設定した後、「チャネル基本設定」タブを選択し、下にスクロールする。「あなたのユーザーID」という項目にある数字とアルファベットの組み合わせがユーザーIDである。次に「Messageing API設定」タブを選択し、下にスクロールするとチャネルアクセストークン（長期）がある。これが必要なトークンとなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703987/aabf57ca-6b49-708c-c16d-227ab05bbb69.png)

以上
シェルスクリプトでLambdaとLayer登録する方法

# 概要  
シェルスクリプトでローカル環境からLambdaとLayerを登録した時の方法について記載します。 
環境ごとにLambdaの登録先を変えられるようにしました。 
Lambda関数はrubyで作成しています。
# 対応フロー  
* シェルを実行する前に、LambdaとLayerを作成する
* AWSのアクセスキーとシークレットキーを取得する。
* ローカル環境に取得したキーを設定する  
* Lambda登録のAWSコマンドを実行  
* Layer登録のAWSコマンドを実行  
* Layerの最新バージョンを登録したLambdaに紐つける  
* LambdaとLayerでファイルを分けて、シェルスクリプトの引数で環境を変えられるようにする  

## キーの設定
以下のコマンドを実行してアクセスキー、シークレットキー、region、output formatを指定する

```
aws configure --profile environment_name
```


## Lambda登録用スクリプト  
```
if [ "$1" == "environment_1" ]; then
  function_name="environment_1のLambda関数名"
elif [ "$1" == "environment_2" ]; then
  function_name="environment_2のLambda関数名"
else
  exit
fi
# 環境切り替え
export AWS_PROFILE=$1
# zipファイルは事前に作成しておく
# Lambda登録
aws lambda update-function-code --function-name ${function_name} --zip-file fileb://lambda.zip
```  

## Layer登録用スクリプト  
```
if [ "$1" == "environment_1" ]; then
  layer_name="environment_1のLayer名"
  function_name="environment_1のLayer関数名"
elif [ "$1" == "environment_2" ]; then
  layer_name="environment_2のLayer名"
  function_name="environment_2のLayer関数名"
else
  exit
fi
# 環境切り替え
export AWS_PROFILE=$1
# zipファイルは事前に作成しておく
# Layer登録
aws lambda publish-layer-version --layer-name ${layer_name} --zip-file fileb://layer.zip --compatible-runtimes ruby2.7
# Layerの最新バージョンのARNを取得
import_layer_info=`aws lambda list-layer-versions --layer-name ${layer_name}`
latest_import_layer_arn=$(echo $import_layer_info | jq -r '.LayerVersions[0].LayerVersionArn')
# 最新のLayerをLambdaに紐つける
aws lambda update-function-configuration --function-name ${function_name} --layers ${latest_import_layer_arn}
```
開発未経験のテストエンジニアがRailsで自動テストをやってみた

私は、テストエンジニアとして働いています。
業務経験としては、業務系システムのテスターが1年3か月、
進捗管理が2か月程です。

私の技術的な強みが、
少しSQLが得意なこと以外に思い浮かばないのに危機感を感じ、
10月からRailsを使った個人開発を自己研鑽として行っています。
（SQLの知識としては、オラクルマスターブロンズ合格程度です。）

そんな私が、Railsでテストを書いてみて、
手動テストとの比較を記事にしてみました。

<h1>自動テストの魅力</h1>
大きく分けて以下の2つのメリットを感じました。

・テスト実行が楽
・テストを先に書くことで、仕様の整理ができる

<h3>テスト実行が楽</h3>
何と言っても、テスト実行が楽です。
ひとたびコードを書いてしまえば、
"rails t"というコマンド一行でテストを実行できます。

きちんとテストが書けていればという前提ですが、
本番環境へのデプロイ前に、先述のコマンドを打ち込めば、
正常にアプリケーションが動くかどうかが確認できます。

また、手動テストでExcel方眼紙にスクリーンショットを貼り付けて
エビデンスを整形するのが常識である現場にいる人間にとって、
この効率の良さは驚異的です。

<h3>テストを先に書くことで、仕様の整理ができる</h3>
これも大きなメリットだと感じます。

テスト設計をするときは、正常系のみならず、
異常系も考慮しなくてはなりません。

個人的にはモデルのテストを書くときが最もわかりやすく効果を感じました。

例えば、パスワードを格納するカラム一つとっても、
文字数に上限や下限を設けるのかや、
半角記号や半角数字を含むことを必須にするのかなど、
検討事項は複数あります。

そして、それらに確固たる正解はありません。

そのような事項を1つ1つテストとして書いて思考を整理するのです。

ウォーターフォール型開発の現場にしかいたことがないせいか、
細かい仕様の検討とテスト設計を同時に進めることは、
新鮮かつ楽しく感じます。
（上流・下流という謎の上下関係のような概念はそこにはないと思う。）

<h1>自動テストの課題</h1>
私が自動テストを書きながら課題と感じたのは以下のことです。
（私自身の今後の技術的課題でもあります。）

・細かい表示のテストは難しい。
・うまく自動化できない場合がある。

<h3>細かい表示のテストは難しい</h3>
画面がスクロールしても固定させたい部分や、
画面のスクロールに合わせて一定の範囲で動かしたいといった、
ユーザビリティに関わることをテストするのは難しく感じます。

<h3>うまく自動化できない場合がある。</h3>
エンジニアの技術不足で、うまくテストを自動化できない場合もあります。

私の技術不足で、今開発しているアプリでうまく自動化できなかったのは、
コントローラーに書いた以下のコードに対応するテストです。

※ブラウザ上では期待結果通り、
destroyアクションが動く前に参照していたページにリダイレクトされました。

```ruby:app/controllers/mission_controller.rb
 def destroy
    Mission.find(params[:id]).destroy
    flash[:success] = "タスクを削除しました。"
    #以下の1行に関するテストが書けませんでした。
    redirect_back(fallback_location: root_path)
  end
```

コードの意味としては、
可能ならリファラーにリダイレクトし、
不可能ならroot_pathにリダイレクトするという意味です。

integration testでテストを書くと、
どうしてもroot_pathにリダイレクトしてしまいます。
※以下のように書かないとテストが失敗します。

```ruby:test/integration/missions_destroy_test.rb
require 'test_helper'

class MissionsDestroyTest < ActionDispatch::IntegrationTest
  
  def  setup
    @user = users(:michael)
    @mission = Mission.find_by(user_id: @user.id)
  end
  
  test "destroy mission from users show　when cannot get refferer" do
    log_in_as(@user)
    get user_path(@user)
    assert_template 'users/show'
    delete mission_path(@mission)
    assert_redirected_to root_path
  end
  
  test "destroy mission from missions index when cannot get refferer" do
    log_in_as(@user)
    get missions_path
    assert_template 'missions/index'
    delete mission_path(@mission)
    assert_redirected_to root_path
  end
end
```

考えられる原因としては、
システムテストのように、
実際のブラウザに対してテストを実行しておらず、
fallback_locationを取得できなかったからだと考えています。
（間違っていたら、ご指摘いただけますと幸いです。）

<h1>まとめ</h1>
自動テストはとても魅力的だと思います。
これから、システムテストも書けるようになっていきたいです。
cmakeで複数階層フォルダを扱う


## はじめに
cmakeで複数フォルダそれぞれにCMakeList.txtを置いてmakeする方法は巷にあふれているが、
さらにその階層を何段にも重ねていくときにどう書けば良いのかわからなかったのでまとめる。

例えば以下のような例。

```
---/
 |--CMakeLists.txt
 |
 |--src/
 |  |--CMakeLists.txt
 |  |--a.cpp
 |  |--lib/
 |     |--CMakeLists.txt
 |     |--b.cpp
 |
 |--test/
 |  |--test.cpp
```

## 実装

以下のように記述すればOK。
### /CMakeList.txt
```
add_subdirectory(a)
add_executable(main
./test/test.cpp
)
target_link_libraries(test a b)
```
### /src/CMakeList.txt

`add_dependencies(a b)`を入れておかないと依存関係がおかしくなるケースがある。

```
add_subdirectory(b)
add_library(a a.cpp)
add_dependencies(a b)
```

### /src/lib/CMakeList.txt

```
add_library(b b.cpp)
```

## 下の階層のライブラリを一つにまとめたいとき

おそらくこの方法が最もシンプル。

### /CMakeList.txt
```
add_subdirectory(a)
add_executable(main
./test/test.cpp
)
target_link_libraries(test c)
```
### /src/CMakeList.txt
```
add_subdirectory(b)
add_library(a a.cpp)
add_library(c SHARED $<TARGET_OBJECTS:a>
                     $<TARGET_OBJECTS:b>)
                                
```
### /src/lib/CMakeList.txt
変更なし。

## 補足：Macで動的ライブラリを作成するとき

Macでは動的ライブラリを作成するとき、未定義シンボルがあると弾かれる。
それを回避するには、cmakeに以下の記述を追加する。

```
set(CMAKE_CXX_FLAGS "-dynamic -undefined dynamic_lookup -Qunused-arguments")
set(CMAKE_C_FLAGS "-dynamic -undefined dynamic_lookup -Qunused-arguments")
```
【Rails】7つのアクション以外のアクションを追加する

オリジナルのメモ投稿アプリの作成中、過去のメモを表示させるViewを追加で作成したいと思ったのですがデフォルトで作成される7つのアクションは既に作成しており、何か方法がないか調べ実装できたことをメモしておきます。
### 解決策
1. Controllerに新たなアクション(今回は past というアクション名にしました)を定義
2. past.html.erbを作成
3. ルーティングにpastを追加する

ルーティングの記述は下記の通り

```routes.rb
resources :schedules do
      get "past", on: :member
      resources :comments, only: :create
    end
```
rails routesで確認するとURIパターンは下記の通り確認できました。

```
schedules/:id/past(.:format) 
```

### 参考サイト
[Railsのルーティング](https://railsguides.jp/routing.html)
[作って学ぶRuby on Rails Vol.3 Actionを追加しよう！](https://blog.codecamp.jp/rails_text_3)


プログラミングスクールでの学習では7つのアクションを使ったアプリしか作成しなかったので、他にもアクションを追加できるということが今の私にとっては衝撃的でした…！
上記以外にもアクション追加の記述があることを学びましたが時間がないので続きは後日書きます…
Reactでmap型の要素をループしてテーブルを作成する


## コード
- 要素数的なものは取れないのかな、、、
- tableはテーブル全体
- thはテーブルの見出し（table head cell）
- tdはテーブル内のデータ（table data）
- trはテーブルの横の定義（table row）
- アロー関数のループの中でテーブルを定義する感じ

```react
                    <div>
                        <table border="1" width="500" cellPadding="0">
                            <th>No</th>
                            <th>Name</th>
                            <th>Status</th>
                                {this.state.pods.map((pod) =>
                                    <tr>
                                        <td>{pod.id}</td>
                                        <td>{pod.metadata.name}</td>
                                        <td>{pod.status.phase}</td>
                                    </tr>
                                )}
                        </table>
                    </div>
```

## 画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/a8d6826b-0a3a-1565-6c6b-3e7d350c8d30.png)
Unity 2020.1 でPackageManagerに出てこなくなったパッケージを使う

追記：[Unity2021ではほんの少しだけ簡単になりました](https://qiita.com/ELIXIR/items/4e8170348b7b764c586d)

Unity2020.1以降ではパッケージマネージャーも整理されたようで、
基本的にはPreviewパッケージはインストールできなくなりました。
[このBlog](https://blogs.unity3d.com/jp/2020/06/24/package-manager-updates-in-unity-2020-1/)にある手順を踏むと一部のPreviewパッケージは表示されるようになるのですが、それでもほとんどのPreviewパッケージは表示されないようです。
![スクリーンショット 2020-11-21 22.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ba141d71-28af-046d-199a-7e77f9d39bc0.png)


今回、最新の[ARCoreSDK](https://developers.google.com/ar/develop/unity/quickstart-android)を試すにあたり、Unity2019.4ではAndroidのビルドを通すのにとても手間がかかるようになっていたため、2020.1を使ってインストールを試みたのですが、
![スクリーンショット 2020-11-21 22.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c8c330e2-f8af-6a7b-2fe6-f25b83b56975.png)
これらのパッケージをインストールしようとしたところ、2020.1ではPreviewをONにしても出てきませんでした。

いろいろ試したところ、下記の手順でパッケージのインストールを行うことができました。

1. **Projectを閉じた状態で**、Assetsと同階層にあるPackagesフォルダの中のmanifest.jsonを開く
2. WEBブラウザでインストールしたいパッケージ名を検索し、パッケージのドキュメントを表示する
（例えば上述の[Multiplayer HLAPIのドキュメント]
(https://docs.unity3d.com/ja/2019.4/Manual/com.unity.multiplayer-hlapi.html)）
3. ドキュメントには **com.unity.multiplayer-hlapi** といったパッケージ名および　**1.0.6** といったバージョンが記載されているので、これを manifest.json に追加する

```manifest.json
{
  "dependencies": {
    "com.unity.collab-proxy": "1.3.9",
    "com.unity.ide.rider": "1.2.1",
      :
    "com.unity.modules.xr": "1.0.0",
    "com.unity.xr.legacyinputhelpers": "2.1.4",
    "com.unity.multiplayer-hlapi": "1.0.6"
  }
}
```
4.Unityを起動すると自動的にパッケージがインストールされる
![スクリーンショット 2020-11-21 22.40.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c8549c57-aac3-c383-e512-f3f43d844954.png)

5.ドキュメントの記載より新しいバージョンがある場合はUpdateすることも可能
![スクリーンショット 2020-11-21 22.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/94a9997d-70b8-ac3c-209f-250f81579bde.png)

以上です。他にもっと良い方法があれば教えてください。
ここ
![スクリーンショット 2020-11-21 22.52.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1f2833b4-c03e-cfcc-46fd-f78fdb9eb3b5.png)
でなんとかできないですかね？

では！
【DB接続後sqlを渡すパターン】


`beginTransaction()`と`commit()`の使い方をわかっていなかったのでメモ

一つのsql文ですむ場合
`prepare()`と`execute()`だけでいい

```php
try{
	$db = new PDO('mysql:host=localhost;dbname=users','root','pass');
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION);
}catch(PDOException $e){
	print $e->Message();
}
$sql = 'INSERT INTO users (name) VALUES (?)';
$stmt = $db->prepare($sql);
$stmt->execute("taro");

```

関連する複数のsqlをinsertなどしたい場合（どれかが欠けるとおかしくなる時）
beginTransaction()を使って、失敗したらrollbackさせる。

```php
try{
	$db = new PDO('mysql:host=localhost;dbname=users','root','pass');
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION);
}catch(PDOException $e){
	print $e->Message();
}

try{
	$db->beginTransaction();
    $sql1 = 'INSERT INTO users (name) VALUES (?)';
	$stmt = $db->prepare($sql1);
	$stmt->execute("taro");

    $sql2 = 'INSERT INTO orders (order_name) VALUES (?)';
    $stmt = $db->prepare($sql2);
	$stmt->execute("rice");
    
    $sql3 = 'INSERT INTO prices (price) VALUES (?)';
    $stmt = $db->prepare($sql3);
	$stmt->execute(200);

	$dbh->commit();
}catch(Exception $e){
	$db->rollback();
	print $e->Message();
}

```
railsのメソッド"save"がどう定義されているのか読解してみた

rails読解シリーズ第5回目はsaveメソッド。

```ruby:save
# File activerecord/lib/active_record/base.rb, line 2575
def save
  create_or_update
end
```
create_or_updateメソッドが呼ばれているだけのようです。


```ruby:create_or_update
# File activerecord/lib/active_record/base.rb, line 2916
def create_or_update
  raise ReadOnlyRecord if readonly?
  result = new_record? ? create : update
  result != false
end
```

2行目で、対象のインスタンスが読み取り専用かどうか確認するようです。
メソッドの名前からして、readonly属性はboolean型で定義して、readonly: trueとすることで、利用することができそうです。
プログラマーが自ら定義することもできますが、railsのことだし、メソッドによって定義する方法もありそう。

```ruby:readonly?
# File activerecord/lib/active_record/base.rb, line 628
      def readonly?
        @readonly
      end
```
読み取り専用のインスタンスであった場合はReadOnlyRecordエラーが出力されます

```ruby:ReadOnlyRecordモデル
class ReadOnlyRecord < ActiveRecordError
end
```

```ruby:3行目
result = new_record? ? create : update
```
3項演算子の条件はnew_record?メソッド。
名前の通り、新規レコードか確認するものでしょう。

```ruby:new_record?
# File activerecord/lib/active_record/base.rb, line 2554
def new_record?
  @new_record || false
end
```
なんとなく予想できたかもしれませんが、こちらも先程のreadonly?メソッドと同じ仕様のようです。
new_record属性にtrueを設定していた場合はtrueを返し、特に指定がなければfalseとなる模様。
先程は|| falseの記述がなかったので、どう違う動きをするのか気になります。

rubyの場合、値が設定されていない=nilはfalseと判定されます。
わざわざ設定する理由としては2つ考えられます。
1. true、false以外の値が代入された場合にtrue判定してしまうのを防ぐため
2. new_record属性として参照したメモリの位置に以前使用したときのデータが残っている場合の誤動作を防ぐため

2.については組み込みで用いられるC言語など高級でない言語が用いられる分野で考慮されることがあるそうです。
Rubyのような言語でも懸念は必要なのでしょうか。

逆に、readonly?メソッドに同じ処理が施されていないということは、readonly属性として、必ず値が設定される仕組みがあるということでしょうか。

```ruby:3行目
result = new_record? ? create : update
```
3項演算子に戻ります。
新しいレコードであればcreateメソッド、そうでなければupdateメソッドが呼び出されます。
ここはシンプルですね。

```ruby:4行目
result != false
```
3行目でresultに値が代入された場合はこの等式はtrueとなり、それ以外の場合はfalseとなります。

よくコントローラで

```ruby:
if save
  redirect_to xxx
else
  render :new
end
```
のような用いられ方をしますが、4行目の等式の結果が返されて、それをif文に使用しているということですね。

saveメソッドの読解は完了です。
ついでに類似メソッドとして、save!メソッドを読んでみましょう。

## save!メソッドの読解

```ruby:save!
# File activerecord/lib/active_record/base.rb, line 2592
      def save!
        create_or_update || raise(RecordNotSaved)
      end
```


create_or_updateはsaveメソッドと同じ動きですね。

save!メソッドの特徴は保存に失敗したときにエラーを吐くこと。
保存に失敗するとcreate_or_updateがfalseを返します。
A||BのときAがfalseの場合はBが判定されます。

ここでraiseメソッドによりRecordNotSavedエラーが出力されます。

```ruby:RecordNotSavedモデル
class RecordNotSaved < ActiveRecordError
  attr_reader :record

  def initialize(message = nil, record = nil)
    @record = record
    super(message)
  end
end
```
このクラスのモデルにより、エラーメッセージが出力されるようです。
エラーの動作の仕組みは勉強にはなりそうですが、今回の記事の趣旨からは外れるので、別の機会に筆は譲りましょう。

## まとめ
### saveメソッドの動き
1. 読み取り専用か確認し、必要に応じてエラーを吐く
2. 新規データかどうかによってcreateまたはupdateメソッドを呼び出す。
3. 結果に応じてtrueまたはfalseを返す

### save!メソッドの動き
saveメソッドの中で上記1~3を実行するメソッドが3にてfalseを返した時、RecordNotSavedエラーを吐く

### 感想
- railsの学習を始めた頃のイメージはcreateはnew+saveだよ〜とおぼえていたので、saveの中でcreateメソッドが呼ばれていたのは驚きだった
- create/updateメソッドとエラー周りの仕組みに関心をもったので読んでみたい。
- めちゃくちゃ重要な機能をシンプルで短いコードで実現していて美しい！！ 特に4行目。

今回もマニアックな記事を読んでいただきありがとうございました。
またお会いしましょう。
Folding@home を Chocolatey でインストールする

Folding@home を Chocolatey でインストールするときはちょっとコツが必要です。

Chocolatey によるインストールを実行後、作成されたスタートメニューに情報の欠落があり、FAHClient を実行できない問題があります。

[Chocolatey Software | Folding@home 7.6.21](https://chocolatey.org/packages/fah) のコメント (<https://disq.us/p/28sb2l4>) にも指摘がありますが、2020年11月21日時点で対応されていないようです。

尚、Folding@home や Chocolatey については以下などを参照下さい。

-   [今からでも3分ではじめられるコロナ解析貢献「Folding@home」の使い方 - PC Watch](https://pc.watch.impress.co.jp/docs/news/1243458.html)
-   [コマンドでWindowsアプリを楽々管理「Chocolatey」：知っトクWindowsツール - ＠IT](https://www.atmarkit.co.jp/ait/articles/1806/22/news026.html)

# 前提

-   Chocolatey が使えるようになっていること
-   Windows 10 Pro 20H2 で確認

# 手順

1.  通常通り、管理者として PowerShell または コマンドプロンプトを開き、 `choco` コマンドで Folding@home をインストールする。

    ```bat
    choco install -y fah
    ```

2.  スタートメニューから [Folding@home] - [Folding@home] を右クリックし、[その他] - [ファイルの場所を開く] を実行する。

    ![スタートメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/80fc7119-21cc-d95d-6be7-0ba59cad5529.png)


3.  [Folding@home のプロパティ] の [ショートカット] タブで、[作業フォルダー] に `%APPDATA%\FAHClient` と入力する。

    ![Folding@home のプロパティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/990e130e-0c84-62fb-439f-b2bc341c868e.png)

4.  デスクトップにある [Folding@home] のアイコン (ショートカットファイル) のプロパティを開き、前項と同様に [作業フォルダ]　を設定する。

4.  エクスプローラーのアドレス、またはタスクバーの検索で `%APPDATA%` と入力し Enter キーを入力してフォルダを開く。

5.  開いたフォルダに新しく `FAHClient` フォルダを作成する。

6.  スタートメニューから [Folding@home] - [Folding@home] \(もしくはデスクトップの [Folding@home] ) を実行する。

# 注意


### Post-install notes について

[Chocolatey Software | Folding@home 7.6.21](https://chocolatey.org/packages/fah#post-install-notes) に Post-install notes として以下の記載があるが実行しないでください。

> Execute `"C:\Program Files (x86)\FAHClient\HideConsole.exe" "C:\Program Files (x86)\FAHClient\FAHClient.exe" --open-web-control`

#### もし実行してしまったら

タスクバーの通知領域にある FAHClient を右クリックしてメニューから終了し、下記のファイルやフォルダーを後述する `%APPDATA%\FAHClient` フォルダーに移動しましょう。

-   `config.xml`
-   `configs\`
-   `cores\`
-   `FAHControl.db`
-   `GPUs.txt`
-   `log.txt`
-   `logs\`
-   `work\`
Nuxt.jsビギナーズガイドで「Request failed with status code 401」にハマった

![スクリーンショット 2020-11-21 15.40.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/24d08b75-f2fa-eb0c-f1b8-fb9c0eed88be.png)


Nuxt.jsビギナーズガイド第二章にて上記エラーに２時間ほどハマったので。



##正誤表がありました。
[正誤表](https://nuxt-beginners-guide.elevenback.jp/about/eratta.html#%E8%87%B4%E5%91%BD%E7%9A%84%E3%81%AA%E3%82%82%E3%81%AE)

>本書では、第二章で Qiita API へとアクセスを行いますが、その際のトークン指定方法に誤りがあったため、以下のように設定するようにお願いたします。

>正: config.headers.common['Authorization'] =\`Bearer ${process.env.QIITA_TOKEN}`
>誤: config.headers.common['Authorization'] = process.env.QIITA_TOKEN

***
他にも何かと誤植があるので要チェックですね。