OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミングにおいて「学び」とは

# 私はだれ
現在エンジニアとして開発業務をしている大学４年生です。

エンジニアという職に就いて「学び」というものの考え方が大きく変わったのでそのまとめとして投稿します。

私にとっての「学び」はこうだ！というものがあればコメント待ってます！他の方の捉え方について知りたいです。


# 「学び」とは共有するもの

今まで、受験勉強やテスト勉強など個人の成果を出すための勉強というものは経験してきました。合格するため、テストで良い点を取るため、赤点を回避するため、など基本的には自分との戦いです。

しかし、エンジニアとして働く上ではそうはいかないと感じました。チームで何かの開発を行うには技術や進捗の共有は必須で、知識を自分だけに留めておくことはNGだと思います。

また、プログラミングを始めた当初は、Qiitaやteratail等に挙げられている投稿は「お金がもらえる訳ではないのに、誰が何の為に書いているのだろう？　何で回答してくれるのだろう？」と思っていました。

***

とあるエンジニアの言葉が印象に残っており、上記の疑問は払拭されました。

**「自分が困っていたことは、後々他の方が困ることです。」**

実際にエンジニアとして働いてみると、他のエンジニアの方々は共通してこの意識を持っているなあと実感しました。

自分がエラーで困った場所は同じ道を通る人が困るポイントであり、自分が通った道であれば回答を求めている人を助ける。この黄金の精神があるからこそ全て成り立っている、のだと確信しました。

この点が受験・テスト勉強と異なっており、自分がプログラミングを好きな所以だと思います。

結局この章で何が言いたいかというと、**学んだことはみんなでシェアしようぜ！**というエンジニアの心意気サイコー！っていうことです。

# 「学び」から他の「学び」へと昇華される

ある日、JavaScriptを使って開発をしているときに、久しぶりにswitch文を使ってみるか！と、なりました。

```js:switch文の例
//this is switch文
const num = 2;
switch (num){
  case 1:
    alert("1だよ");
    break;
  case 2:
    alert("2だよ");
    break;
  case 3:
    alert("3だよ");
    break;
}
```

switch文は可読性の観点から重宝されることがありますが、なんせ私は忘れっぽいので構文を忘れていました。

・「：」どこに書くんだっけ？
・あ、break忘れてた！
という感じです。


switch文の構文をググって書いていると、あることに気付きました。

`この「：」って三項演算子に使われる「：」と同じ役割では？？？？？`と。

三項演算子とは条件分岐の記述を簡潔にまとめられるもので、非常に便利です。

```js:普通のif文を使った条件分岐
const hoge = 2;

if (hoge == 1){
  console.log("1です");
}else {
  console.log("１以外です");
}
```

```js:三項演算子を使った条件分岐

const hoge = 2;

console.log( hoge == 1 ? "1です" : "1以外です");
```

前日に三項演算子のコードを書いていたので、これに気が付いた時はとても驚き、嬉しく、ワクワクしました。
些細なことですが自分にとっては大きな「学び」で本当に心が踊りました。
（この「：」が全く別物ならご教授ください）

この件があってからはswitch文の仕組みが完全に理解できた気分になり、構文を忘れることが無くなりました。

前日に学んだことが次の日に全く違う形で活かされ、自分の知識へと蓄えられていく。この流れがたくさん味わえる職業の１つがエンジニアでしょうか（素敵）


***
またまた、エンジニアの方からの言葉で印象に残っているので紹介します。

**エンジニアは引き出しの多さが大事**

まさしくその通りで、自分が今までに学習してきたことを如何に活かせるかが大事になってくると、最近実感しました。


学びが別の形で現れたり、はたまた別の箇所で活かせたり出来るのがプログラミングの楽しみの一つです。そして、この蓄えられた学びを共有することで感動する人を更に増やすことが出来ます（素敵）



# 学びを評価・レビューしてもらえる
次は、「学び」を他の人から評価・レビューしてもらえることが多いのもエンジニアの醍醐味の１つです。

例えば、Qiitaに書いた記事をいいねしてもらえる、はたまた間違っていればコメント欄で指摘を受けられる。
こうして学びが評価され自分のモチベーションへと繋がっていく。そして、評価された「学び」は絶対に忘れず定着していきます。

また、指摘を受けた場合は正しい「学び」が得られ、アップデートされていきます。

更に実務になると「コードレビュー」という文化があります。自分が書いたコードに間違いや改善点があれば教えてくれるのです！

なんて良い文化なのでしょうか・・・・

こうして自分の持っている「学び」が日々アップデートされていき、伝播することが出来る。
このような経験が得られるのはエンジニアという職業の特権なのではないでしょうか。

# 結局、プログラミングって素敵！

学びを蓄え、既存の学びから他の学びが得られ、共有し、評価、レビューされ、更新されていく。

こんな素敵なことってあるでしょうか？





# 最近プログラミングを始めた方へ
プログラミングの需要は高くなっており、最近プログラミングを始めた方も多いと思います。
最初は本当に大変で、苦しく、何も分からないという状況が続くはずです。僕もそうでした。

**h1タグ？divとspanって何が違うの？繰り返し処理とかいつ使うんだよ！面白くない！**と、思ってました。

今振り返るとまさしくその通りで、当時は闇雲に「プログラミングを勉強するためにコードを書いていた」から無味乾燥で味気なかったのだと思います。

しかし、勉強のために毎日必死に書いているうちに、「あ！ここでこのタグ使うのか！、引数ってこんな使い方するんだ！」というタイミングがやってきます。

この理解した快感を１度味わうともうこっちのもんです。あとは理解した１つを応用したり、別のものと比較して考えたりすれば、1が2へ、2が10へと増えていきます。

僕もまだまだ分からないことだらけで頭が爆発しそうになりますが、とりあえずググったら解決出来る（最悪質問しよう！）という心の余裕は非常に大きいです。まずは自分で考えて、困ったら人に聞く！くらいの精神でやっていけば自ずと道は開けると思います。

もう分からないことが分からない！という感じの方も、コメント欄にでも書いていただければ答えます！！最悪、偉い人たちが回答してくれます。

僕調べですが、エンジニアって初心者に厳しい生き物だと思っていましたが実はそうではないのでは？と感じてます。臆さず質問してみましょー！

# まとめ

ひたすらプログラミングの「学び」というものを書きました。

**「学びを蓄え、既存の学びから他の学びが得られ、共有し、評価、レビューされ、更新されていく」**

こんなに学ぶことが楽しくて仕方ないものに出会えたことに感謝です！！
WSLでemacsを使うまでメモ

## はじめに
emacs入門中なので会社のパソコンでもemacsでちょこっと遊べたらいいなと思い、軽くやり方調べたのでまとめます。
windows10前提です。

## WSLの有効化
コントロールパネル
　　↓
プログラムと機能
　　↓
Windowsの機能の有効化または無効化
　　↓
Windows Subsystem for Linuxにチェック
　　↓
OK。再起動したら有効になる旨のメッセージが出るので再起動。

## linux の選択
Microsoft Store開く
　　↓
wslで検索
　　↓
いくつかのディストリビューションが選べるので選択して入手。

ubuntu,debian,openSUSE,kali,centosなどがあるみたいです。
centosは有料（といってもたったの230円ですが）
私はなんとなくdebianにしました。

## 設定１
linuxのコンソールが起動するとusernameとpasswordの設定だけ求められたので入力。
このへんはディストリビューションによって異なるのかも。

## 設定２
社内でプロキシサーバーがある場合その設定も必要です。（aptでエラーがでるので）

```
export http_proxy="http://username:passwd@proxyserver:port"
export https_proxy="http://username:passwd@proxyserver:port"
```
ちなみにこのときユーザー名やパスワードに記号が入っている場合％エンコードにしておく必要があります。

## emacsをインストール
```
sudo -E apt update
sudo -E apt install emacs
```
さきほど設定したプロキシの環境変数をsudoでも使うように-Eオプションをつけています。

とりあえずこれで使えるとこまで。以上。

実はカーソルが突然いみふめ
センサーデータをCSVファイルに保存する方法

<u><span style="font-size: 150%"><b>今日はセンサーデータをCSVファイルに保存する方法についてお話します．</b></span></u>

ROSは情報を送信したり受信する際，<span style="font-size: 150%"><u><b><span style="color: #ff0000">トピック（Topic）</span></b></u></span>というものを使います．

あまり慣れない概念だと思いますが，

そんなものがあるんだぁ〜ぐらいの感覚で大丈夫だと思います．

具体的な説明が欲しい方は，ROSの公式ホームページに紹介されてますので，参考にしてみてください．


[http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingTopics]


<br>

現在送受信が行われているトピックを確認するには，次のコマンドを入力してください．


```
$ rostopic list
```


分かりやすいコマンドですね．

ROSのTopicをリスト化すると覚えればいいと思います．

すると，トピックのリストがばぁーっと出てきます．

このあとからは，ロボットの開発でよく使われる<span style="color: #ff0000"><b><span style="font-size: 150%">/scan</span></b></span>というトピックを例にして説明していきます．

<br>

##* ROS用のデータ保存

ROSには専用のデータ保存形式があり，<span style="font-size: 150%"><span style="color: #ff0000"><u><b>rosbag</b></u></span></span>というコマンドを使います．

例えば，/scanというトピックの時系列データを保存したい場合，次のように入力します．

```
$ rosbag record /scan -O data.bag
```

<b><span style="font-size: 150%"><span style="color: #ff0000">rosbag + record + トピック名 + -O + 保存ファイル名.bag</span></span></b>

という感じですね．

他のトピックを保存したい場合は，そのトピック名を入れればいいし，複数のトピック名を入れることもできます．

もし，すべてのトピックを保存したいときは，次のように入力してください．

```
$ rosbag record -a -O data.bag
```

<span style="font-size: 150%"><span style="color: #ff0000"><b>-a</b></span></span> オプションを使うことで，特定のトピックではなく，全トピックを保存することができます．

ただし，<u><b>場合によってはものすごいデータ量になることがあるので，気をつけてください！</b></u>

<br>

##* ROS用のデータからCSV形式に変換

次には，<span style="font-size: 150%"><span style="color: #ff0000"><u><b>bagファイル形式からcsvファイル形式に変換する方法</b></u></span></span>について説明します．

データを扱うときに一番使われるファイル形式はcsvだと思います．

bagファイルに記録されたデータをcsvに変換するには，次のコマンドを入力してください．

```
$ rostopic echo -b data.bag -p /scan > data.csv
```

bagファイルに記録されているトピックの内，csvファイルに抽出したいトピック名を指定すればいいです．

すると，同じフォルダの中にcsvファイルができてると思います．

<br>

##* おわりに


今日は<span style="color: #ff0000"><u><span style="font-size: 150%"><b>ROSを使ってセンサーデータを保存し，CSVファイルに変換する方法</b></span></u></span>について説明しました．

よく分からないところや，うまくいかない場合がありましたらコメント残してください！
【Python】Basemapメモ

現在はcartopyに移行したのでページ分割．


### 指定したAxesにBasemapを描画するには`Basemap(ax=)`

``` Python
map1 = Basemap(projection='ortho', lon_0 = 0, lat_0 = 40, ax=ax1)
```
`GridSpec`や`subplot2grid`との連携に便利
https://basemaptutorial.readthedocs.io/en/latest/subplots.html

### 陸・海の塗りつぶしには`drawlsmask( land_color=, ocean_color= )`

[Drawing a Map Background](https://matplotlib.org/basemap/users/geography.html)



### 経緯度線のラベルは[left,right,top,bottom]の順

``` Python
parallels = np.arange(0.,81,10.)
m.drawparallels(parallels,labels=[False,True,True,False])
meridians = np.arange(10.,351.,20.)
m.drawmeridians(meridians,labels=[True,False,False,True])
```
https://matplotlib.org/basemap/users/graticule.html


### 下にカラーバーを付けるときは`location='bottom'`

[Basemap tutorial: Basemap utility functions](https://basemaptutorial.readthedocs.io/en/latest/utilities.html)

### 経緯度線のlinestyleは`dashes`で指定可能だが…

`matplotlib.pyplot`で言うところの`'dotted'`の方が近い．
`linestyles=':', linewidth=1.0`でほぼ`Basemap`の経緯度線と同じ．
https://stackoverflow.com/questions/54663882/setting-the-linestyle-for-the-longitude-and-latitude-lines-in-matplotlibs-basem


### Basemapにタイトルを付けるにはplt.title()でOK

`Basemap`に`title`メソッドは存在しないが，`plt.title()`で問題ない
https://stackoverflow.com/questions/9402151/how-do-i-add-a-title-to-my-matplotlib-basemap
プログラミングを復習する際、1度開発したリポジトリを使いまわしたら捗った話

# 理解したコードを再利用したい
私は現在、Ruby on Railsの学習をしています。

学習する順序として
1.CRUD機能を実装
2.ログイン機能を実装
3.1対多のアソシエーションの実装
4.多対多のアソシエーションの実装
5.ActionMailerの実装
6.画像アップロードの実装
7.Ajaxを使用したコメント機能の実装
8.フォローフォロワー機能の実装

上記の実装を復習も兼ねて0から実装して理解を定着させております。
しかし、機能が増えていくと

・0から作り出すと圧倒的に時間がかかる。
・復習したいところだけもう一度手を動かしたいなって思った時に気軽に手を動かせない。

ということがあるためどうにか復習用の新規リポジトリに理解したコードのみ存在する状態で
開発ができないかなと考えました。
※scaffoldでいいじゃんっていうのもありますがせっかくなら自分の書いたコードを使いたいので。。。

## 1度開発したリポジトリをCloneする
```
git clone [元のリポジトリURL]
cd [cloneしたリポジトリ]
```
## 新規リポジトリを作成し、remote-urlを変更する
Githubにてリポジトリを新規作成する。
その後、cloneした元のリポジトリのremote-urlを新規のリポジトリのurlに変更する。

```
git remote set-url origin [新規作成時のリポジトリURL]
```

## gitのログを確認し、不必要なcommitメッセージを削除する。

```
# コミットidを確認する。
git log --oneline

## 戻りたいコミットメッセージのコミットidを指定する。
git reset --hard コミットid
```

これで復習したい機能だけ削除して手を動かすことができました。
もっといい方法、不都合なことがありましたら修正していきたいと思います。

# 元のローカルリポジトリを削除し、新しく作成したリポジトリをCloneする
```
# 一つ上の階層に戻る
cd..
# ディレクトリを削除
rm -fr 元のリポジトリ

# 新しく作成したリポジトリURLを使用してclone
git clone [新しく作成したリポジトリURL]

```


## 参考
[gitのremote urlを変更する(レポジトリ移行時)](https://qiita.com/minoringo/items/917e325892733e0d606e)
[[git] 戻したい時よく使っているコマンドまとめ](https://qiita.com/rch1223/items/9377446c3d010d91399b)
Cloudformation/CDKで最新のSolution Stackを指定する方法

https://forums.aws.amazon.com/thread.jspa?threadID=252614

```text
This API returns platform's with their ARN's. One ARN might look like this: "arn:aws:elasticbeanstalk:us-west-2::platform/Node.js running on 64bit Amazon Linux/4.0.0". This ARN can be passed in via the "SolutionStackName" parameter. Additionally, you can truncate the version and just specify "arn:aws:elasticbeanstalk:us-west-2::platform/Node.js running on 64bit Amazon Linux", and this should resolve to the latest 64bit Node JS platform available to you when creating or updating an environment.
```

SolutionStackNameパラメタとして
arn:aws:elasticbeanstalk:us-west-2::platform/Node.js running on 64bit Amazon Linux/4.0.0
のようにバージョンを明示せずに、
arn:aws:elasticbeanstalk:us-west-2::platform/Node.js running on 64bit Amazon Linux
と書けば、最新版が使われるとのことです。

知らなかった。。。。
推論をFargateで実行する

正直、Fargateもサービス仕様の変更が著しいため、SageMakerの利用をおすすめします。
（SageMaker専門家は、Fargateに詳しくない可能性があり、ベストのアーキテクチャを描けない可能性がある）
SageMakerではなく、Fargateで推論を実施する場合


＜参考＞
[初心者向け]言われるままにFargate初めて触ったので、忘れないための記録
https://dev.classmethod.jp/cloud/aws/fargate-my-first-step/

【AWS ECS】タスク実行時のキャパシティープロバイダーを設定する【2019/01】
https://qiita.com/tegnike/items/64f7ba9501144bf6bb17



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575432/5b64d496-d4e9-39cd-8d5d-af63fbe1eb49.png)

なんでAWSのエラーメッセージはこんなにも意味不明なんだ。。
キャパシティープロバイダーってなんだよ。。
Codeforces   Educational Codeforces Round 83 C. Adding Powers : ２進数の和から生成される数列

https://codeforces.com/contest/1312/submission/72821335

# 概要
- n要素の配列と値kが与えられる
- あなたは最初n個の0の配列からスタートして、k^iをどれかの要素に足しても良い(複数の要素に2度は足せない)
- iは途中で止めても良い。また、足さなくても良い
- ある配列が与えられるので、それが上記ルールで生成されたかを判定せよ。

# 理解する
n=5, k=2としたとき、例えば、
- $[0, 0, 0, 0, 0]$ 一回も足さない
- $[1, 2, 4, 8, 16]$ 各要素にi=0,1,2,3,4で足す
- $[3, 0, 12,0, 16]$ 要素0に1+2, 要素2に4+8, 要素3に16を足した
などが考えられる。

# 考えたこと
この問題は以下のように読み替えられる。
- k進数においてi桁目だけが1である数字がある。これらを、配列のある要素に1度だけ足しても良い(使わなくても良い)

まず、要素の含まれる最大の数が$k^{i}$より小さいなら、その要素を含む要素のすべてにおいて$k^{i}$以上の数が足されていることはない。これは、すべての数値が正であることから明らか。このような最小のiを考えると、要素に含まれる数のうち、最大のものだけが$k^{i-1}$よりも大きい。
これは2進数で考えると自明で、例えば、$1000$と$111$という二進数は$1000$のほうが大きいことは自明であり、$2^3$が$2^2 + 2^1 + 2^0$より大きいことと同値である。これは、k進数でも同じである。

配列の中で最も大きな要素をxとすると、この配列全体で足されたことのある桁の最大は$floor(log_{k} x)$である。これをjとしたとき、$j, j-1,...1,0$について、$k^j$が引けるか(=大きいかイコールか)を確認し、もし、引ける値があれば引いて次のjを確認する。(上記の通り、それより下の桁(の1)が全部足されていても$k^j$で引けることはない)

この動作は言い換えると、各要素に対してk進数のj桁目が1かを確認し、そうであれば、桁の数字を0にする。これを繰り返して、すべての要素が0になればこの配列はk進数のある桁が1である数字が0個か1個含まれる配列であったことが分かる。逆に、0出ない要素が残っていれば、さらに他の値が足されていたことにほかならず、条件を満たさない。

# コード
```Python
from pprint import pprint
q = int(input())
for _ in range(q):
    import math
    n, k = map(int, input().split())
    dat = list(map(int, input().split()))
    dat.sort(reverse=True)
    if dat[0] == 0:
        print("YES")
        continue
    ma = math.ceil(math.log(dat[0], k))
    for i in range(ma, -1, -1):
        dat.sort()
        for j in range(n):
            if dat[j] == 0:
                continue
            if dat[j] >= (k ** i):
                dat[j] -= (k ** i)
                break
    if sum(dat) == 0:
        print("YES")
    else:
        print("NO")
```
https://codeforces.com/contest/1312/problem/C
Gradle Kotlin DSLでKroto Plusを使いたい

# Gradle Kotlin DSLでKroto Plusを使う

Kotlinで書くのにGradle Kotlin DSLで記述する方法が載っていなかったから死ぬほど困った。
ググラビリティが低すぎる。

## Kroto Plusとは

[Kroto Plus](https://github.com/marcoferrer/kroto-plus)
Kotlin DSLでいい感じにProtobufを扱えるようにするためのライブラリです。
最近触れ始めたのでざっくりとした説明になってしまいますがすごいです。

## Gradle Kotlin DSLで書きたかった

ドキュメントがGradle Kotlin DSLに対応しなかったので手探りで解決策を探した。
Groovy滅びよ。

## 書き方

```build.gradle.kts
import com.google.protobuf.gradle.*

plugins {
    id("com.google.protobuf") version "0.8.12"
    id("com.github.marcoferrer.kroto-plus") version "0.6.1"
}

repositories {
    mavenCentral()
    google()
}

dependencies {
    implementation("com.github.marcoferrer.krotoplus:protoc-gen-kroto-plus:0.6.1")
    implementation("com.google.protobuf:protobuf-java:3.11.0")
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.11.0"
    }
    
    plugins {
        id("kroto") {
            artifact = "com.github.marcoferrer.krotoplus:protoc-gen-kroto-plus:0.6.1"
        }
    }

    generateProtoTasks {
        val krotoConfig = file("./")
        println(krotoConfig)
        all().forEach {
            it.inputs.files.plus(krotoConfig)
            it.plugins {
                id("kroto") {
                    outputSubDir = "java"
                    option("ConfigPath=$krotoConfig")
                }
            }
        }
    }
}
```
ありの～ままの～DBスキーマを、go言語ソースコードに自動変換【xorm/reverse】

はい:clap:
今回ご紹介するのは、こちらの`xorm/reverse`です。
https://gitea.com/xorm/reverse

なんと！
DBのテーブル構造を直接見に行って、go言語の構造体ソースコードに自動変換してくれます。
対象DB種類も、MySQL以外に色々対応しています。

ライセンスは、MITかな？
LICENSEファイルには明示的には書いてないですが、xorm公式ページではMITとなっているので。
https://xorm.io/

こちら、実は２年以上前から開発されているようです。
以前はリポジトリはgithubだったんですが、親プロジェクト`xorm`と共にgiteaに移籍したみたいですね。

また当時のバージョンではC言語や他の言語ソースへもリバースできたんですが、リニューアル以降はまだ`language/golang.go`以外の出力プラグインは作られてないみたいですね。

パブリックリポジトリなので、gitea のアカウントを持ってなくてもマイPCからgit cloneできました。
ただ、EC2インスタンスからのgit cloneは失敗しました。AWSはブロックしてるのかしら？
ままエアロ。

# 使い方

・・・をご紹介しようと思ったのですが、早速失敗しました。

READMEどおり

```
$ go get xorm.io/reverse
```

したら

```
# xorm.io/reverse/vendor/github.com/mattn/go-sqlite3
exec: "gcc": executable file not found in %PATH%
```

`gcc`がインストールされてないと動かない、と。

`gcc`入れるのダルいなー。

それとちょっと改造する用事もあったので、`git clone`してソースをいじって`xorm/reverse`のmainコードを直接実行するようにしちゃいましょう。

# （下準備）リバース対象のお試しMySQLを用意
https://github.com/yagrush/simple-docker-mysql
↑こちらに、`docker-compose`ですぐ起動できるお試しMySQLをご用意しました。
これを`git clone`して起動します。

※ `docker-compose`自体の設定は割愛します。
あるいはAWS EC2用でよろしければ、こちら https://qiita.com/yagrush/items/e85d2da1b0ef9997fa07 をご参照ください。

```
$ cd ~
$ git clone https://github.com/yagrush/simple-docker-mysql.git
$ cd simple-docker-mysql
$ docker-compose up --build -d
```

# `xorm/reverse`実行を試みる

## `xorm/reverse`を`git clone`してくる

https://gitea.com/xorm/reverse にgit用URLが（githubと同じように）載っているので、ありがたく`git clone`しましょう。:pray:

```
$ cd ~
$ git clone https://gitea.com/xorm/reverse.git
$ cd reverse
```

## sqlite3 を対応DBから外す
sqlite3は今回使わないし、
`gcc見つからないエラー`をちゃっちゃと回避したいので、↓をコメントアウトしちゃいます。

* `go.mod` 
require宣言の `github.com/mattn/go-sqlite3`

* `main.go`
import宣言の `_ "github.com/mattn/go-sqlite3"`


## `reverse`設定ファイルを作る

`reverse/examples/goxorm.yml` を `my-mysql.yml` に改名して、プロジェクトルート `reverse/` にコピーします。

そして、中身を適宜編集します。
例えばこんな感じ。

```yaml
kind: reverse
name: my-mysql
source:
  database: mysql
  conn_str: 'root:hogerootpassword@tcp(127.0.0.1:3306)/hogedb'
targets:
- type: codes
  include_tables:
    - hogetable
  exclude_tables:
    - foo
  language: golang
  template_path: example/template/goxorm.tmpl
  output_dir: models
```

## 実行

早速実行してみます。

```
$ cd reverse
$ go run main.go -f my-mysql.yml
$
```

何も表示されないですが、エラーもないし、どうやら無事実行されましたかね。

出力を見てみましょう。
設定ファイルに`  output_dir: models`と書いていたので、これかな？

```go
$ cat models/models.go
package models

type Hogetable struct {
        Hogename string `xorm:"not null VARCHAR(32)"`
        Id       int    `xorm:"not null pk autoincr INT"`
}
```

素晴らしい…:heart_eyes_cat:

ちなみに「`package models`はいったいどこから来てん？」というと、
↓設定ファイルから参照しているテンプレートファイル`goxorm.tmpl`にあります。

```yaml
  template_path: example/template/goxorm.tmpl
```

これをいじれば、さらにカスタマイズできます。

あと、構造体のフィールドに `xorm:` タグがおまけで付いてますね。
これは`xorm/reverse`の親プロジェクトでもある、オープンソースORM`xorm`用みたいですね。

ちなみにリバース対象にしたDBスキーマは↓こんな感じです。
（上の方でご紹介したお試しセットまんまです）

```sql
CREATE DATABASE IF NOT EXISTS hogedb;
use hogedb;
CREATE TABLE hogetable (
  id INT NOT NULL AUTO_INCREMENT,
    hogename VARCHAR(32) NOT NULL,
    PRIMARY KEY (id)
);
```
外部キーエラーが出た人へ「SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint」


#要因
mysqlにてテーブルを外部キーとして連携したときに起こったエラーです。



#エラー
php artisan migrateで下記エラー内容

```
Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `comments` add constraint `comments_ico_id_foreign` foreign key (`ico_id`) references `icos` (`id`) on delete cascade)

```

#解決方法
migrateファイルの生成の順番に問題がありました。

外部キー設定をさせるcomments_tableより後に紐づけたいテーブルであるico_tableがありました。

なので名前を変更してcomments_tableより前に持ってきてphp artisan migrateで治りました。

**名前変更前**
![migrate2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/f63273cd-ffb8-3167-f749-b5f0c3a69b90.jpeg)


**名前変更後**
![migrate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/0bff3790-afb9-1614-b82b-9f708b2cb569.jpeg)



治ったー！

```
[vagrant@localhost myblog]$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_12_05_215839_create_posts_table
Migrated:  2019_12_05_215839_create_posts_table (0.01 seconds)
Migrating: 2019_12_22_211023_create_icos_table
Migrated:  2019_12_22_211023_create_icos_table (0.02 seconds)
Migrating: 2019_12_23_071756_create_comments_table
Migrated:  2019_12_23_071756_create_comments_table (0.04 seconds)
Migrating: 2020_01_12_020348_tests_migrate_table
Migrated:  2020_01_12_020348_tests_migrate_table (0 seconds)

```
【BluePrism】Excelのシート名を変更する

##やりたいこと
Excelのシート名を変更。

##Input
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ba69e71c-6d06-5b64-4231-a9967e4c6c7d.png)


##Output
特になし

##オブジェクトフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/8798843b-bedd-13ca-9928-02aaade7cc56.png)

##コード
```vb

Dim ws As Object = GetWorksheet(Handle, Workbook, Target_Sheet_Name)

Try
	ws.Name = Rename_Sheet_Name
	Success = True

Catch e As Exception
	Success = False
	Message = e.Message
Finally
    ws = Nothing
End Try

```
##注意
サンプルをExcel VBOにページ追加して使用してください。
Excel VBOを拡張する際は、既存のVBOを複製して別オブジェクトにすることを推奨します。
Excel VBOをコピーしてExcel VBO Extendedなどとして複製し、「シート名変更」をページ追加するイメージです。

また、インスタンス作成の際は**Excel VBO ExtendedのCreate Instanceを使う**ことに注意してください。
既存のExcel VBOで生成されたhandleを使ってExcel VBO Extendedの処理をしようとするとエラーになります。

##サンプル
https://github.com/falcslab/blueprism/tree/collection
BPA オブジェクト - シート名変更.xml
Ubuntu18.04にROSをインストールしてみた

#前置き
今回は、前回ubuntu18.04をinstallしたので更にROSをinstallしてみる。
対象環境は以下の通りで、基本的には参照サイトの通りinstallを行っていく。

###対象者
ROSをinstallしたい人
roswikiを見たが、英語で何書いてあるのかよくわからない人

###対象環境
ubuntu18.04
ROS Melodic
(ROSはubuntuのバージョンごとにinstallするバージョンが異なるので注意が必要)

#installを行う
まずはPCにROSをinstallする許可を取る

```ruby:ros_install_1
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```
次にkeyの設定をする

```ruby:ros_install_2
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```
パッケージのアップデートをする

```ruby:ros_install_3
sudo apt update
```

ROS推奨のintallを行うので、以下のコマンドを入力する(ROS,rqt,rviz,robot-generic libraries, 2D/3D simulators and 2D/3Dperception)

```ruby:ros_install_4
sudo apt install ros-melodic-desktop-full
```
rosdepを初期化する。
rosdepとは、ROSを動かすために必要なシステムを簡単にinstallするためのもの

```ruby:ros_install_5
sudo apt install python-rosdep
sudo rosdep init
rosdep update
```
環境構築をする

```ruby:ros_install_6
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

ROSパッケージを構築するためのツールをインストールする

```ruby:ros_install_7
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
```

以上でとりあえずROSのinstallを終わります。
ここからはROSを用いていろんなことをしていこうと思います。

###参照サイト
http://wiki.ros.org/melodic/Installation/Ubuntu
【laravel】AWSでhttps化したはずなのに一部のページだけhttpになる

#今回の騒動
AWSにてhttps化したのに本番環境に以降したら一部のページだけhttp表示となり、かなり困っていたので解消方法を共有します。

#前提
環境はlaravel5.8です。
バージョンによっていろいろ違うみたいなのでそこは注意です。

#解消方法
App\Http\Middleware\TrustProxiesに` protected $proxies = '**';` を入れるだけ

##実例
```php:TrustProxies

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    // protected $proxies;
    // protected $proxies = [
    //     '172.31.36.97/16',
    // ];
    protected $proxies = '**'; //付け加えた
    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

```

laravel公式マニュアルを参照しました。
https://readouble.com/laravel/5.5/ja/requests.html#configuring-trusted-proxies
matplotlibのscatter()/scatter3d()で陰面消去がうまくいかないときの対処メモ

## MPL(matplotlib)で 3D の散布図を作る際、scatter() に配色用の値listを渡すとき、陰面消去が狂ってしまう


先に結論：　散布データを list で渡すの諦めて、１個ずつ scatter() したら解決した。

2021/01/07 追記：
　この記事の症例は MPL3.2.* の頃のバグだったようです。
　
　MPLのVer.3.3.3 で試したところだいぶ挙動が変わってました。
　　どうやらlist渡しでも正常になった（？）模様。
　　また、一個ずつ渡す場合にdepthshade=Falseとしたときの処理が遅くなったかも。

---

散布図描画メソッド scatter() を使う際、
マーカーの位置と色分けの値は、普通はリストとかで渡したい。

```python:リストxs,ys,zs,vsを渡す場合
ax.scatter(xs, ys, zs, c=vs, norm=norm, s=600, marker='o', alpha=1.0, zdir='z', depthshade=False )
```
ところが、なぜか c=vs で配色配列を渡した途端に陰面消去が狂ってしまい
「一番手前のマーカーが一番奥のマーカーに隠れて見えない」なんていうことが起きる。（バージョンに依存とかあるかも。）

--- 
対処：
思いつくことは一通り試しました結果、
「for 文でマーカー1個ずつ scatter()」 にしたら正常になりましたとさ。

```python:1個毎にscatter()
ax = fig.add_subplot( 122, projection='3d')
for x,y,z,v in zip(xs,ys,zs,vs):
    ax.scatter(x, y, z, c=(v,),norm=norm, s=600, marker='o', alpha=1.0, zdir='z', depthshade=False )
```

--- 

以下は実例：

```python:陰面消去比較
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize

def plot():
    def randrange(n, vmin, vmax):
        return (vmax - vmin)*np.random.rand(n) + vmin

    n = 20
    xs = randrange(n, 0, 100)
    ys = randrange(n, 0, 100)
    zs = randrange(n, 0, 100)
    vs = xs
    norm = Normalize(vmin=min(vs), vmax=max(vs) )
    
    fig = plt.figure()
    ax = fig.add_subplot(121, projection='3d')
    ax.scatter(xs, ys, zs, c=vs, norm=norm, s=600, marker='o', alpha=1.0, zdir='z', depthshade=False )
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    
    ax = fig.add_subplot( 122, projection='3d')
    for x,y,z,v in zip(xs,ys,zs,vs):
        ax.scatter(x, y, z, c=(v,),norm=norm, s=600, marker='o', alpha=1.0, zdir='z', depthshade=False )

    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')

    plt.show()
```
Pyton3.8　実行結果↓
![3DPlotColoring_compare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469875/84f4df1c-e9cb-8131-3ab0-89c199b8d031.png)

↑　左図がlistで渡した場合、右図が１個ごとに渡した場合。(区別のつきやすい方向を選んで描画したつもり)

右図は正常です。

注意点：
１．scatter() をマーカー毎に呼ぶ場合は、カラーリングのレンジを統一するために
norm=Normalizeでレンジ固定し scatter() に norm=norm で渡す。
２．scatter() のオプション「depthshade=True」 がとても遅くします。デフォルトTrueのようなので、かならず「depthshade=False」すべし。
2020/01/07：MPLのVer3.3.3ではdepthshadeによる差は小さい（無くなった？）ようです。

---

※ scatter()とscatter3d()の挙動はたぶん同じ。

※matoplotlib の公式ドキュメントは確認していません。そもそも前提の使い方が間違っているかもしれません。あしからず。
[Oracle SQL] オブジェクトの一覧を取得する

# オブジェクトの一覧を取得する

### USER_OBJECTS ビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532975/19cb9926-3730-69f7-1257-95aacaa08403.png)

「OBJECT_TYPE」に指定できる値

* TABLE / INDEX / VIEW / FUNCTION / PROCEDURE / TRIGGER / PACKAGE / PACKAGE BODY / SEQUENCE / SYNONYM / DATABASE LINK

## ログインユーザーが持つオブジェクトの一覧を取得する

```sql
SELECT *
FROM   USER_OBJECTS;
WHERE  OBJECT_TYPE = '<OBJECT_TYPE>'
```


### テーブル一覧を取得する場合

「OBJECT_TYPE」にTableを指定

```sql

SELECT *
FROM   USER_OBJECTS
WHERE  OBJECT_TYPE = 'TABLE';
```

## 他のユーザーのオブジェクトを取得する

```sql
SELECT *
FROM   DBA_OBJECTS
WHERE  OWNER       = '<User Name>'
AND    OBJECT_TYPE = '<OBJECT_TYPE>'
```

# 参考
* [Oracle Database Reference - ALL_OBJECTS](https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2005.htm#i1583352)
* [オブジェクトの一覧を取得する（USER_OBJECTS / DBA_OBJECTS） - Oracle - Project Group](https://www.projectgroup.info/tips/Oracle/SQL/SQL000012.html)
Vagrant CentOS7 でディスク拡張手引き（メモ）

```
# install cloud-utils-growpart
```
![①install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396544/aa545fb3-c6ed-bc56-f597-662825134207.png)

```
# df -h
```
![②df_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396544/35a21195-c0fd-8645-edcf-2082c8f50dc9.png)

```
# growpart /dev/sda 1
```

![③growpart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396544/e4d30c77-a242-e863-af2e-6950420f1039.png)

```
# xfs_growfs -d /
```
![④growfs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396544/3ec2f594-5b52-2b04-8b41-1221d52578be.png)

```
# df -h
```

![⑤df_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396544/abcc0628-ea19-c65b-58cc-7238eba0fa30.png)
Cancancanを使っているときのtest

## Cancancanとは？
この記事を見て下さっているということは既にご存知だと思いますが、 **権限管理のgem** です。

## Cancancanを使っているときのテストはどうしたらいいのか？
権限があるときは、権限を持つテストユーザーでログインして

```Ruby
test "test#indexにmanager権限を持つユーザーがアクセスして、正常レスポンスが返されること" do
  # manager権限を持つユーザーでログイン
  login(:yama_p)

  get tests_path
  assert_response :success
end
```
正常に処理ができることを確認すればまぁいいかも知れませんが、 **アクセスできない(権限がない)ことを確認する** にはどうしたらよいでしょうか？
というのも、上記で `assert_response :errors` などとしてもcancancanで弾かれたときにエラーが返ってくるわけではなくそもそもアクセスできないので

```
CanCan::AccessDenied: You are not authorized to access this page.
```
とテストが落ちてしまいます。

## 権限を持つかどうかをテストする
[Cancancanのwiki](https://github.com/ryanb/cancan/wiki/Testing-Abilities)にテストについての記述があります。

```Ruby
test "test#indexにmember権限を持つユーザーはアクセス権限を持たないこと" do
  # member権限を持つユーザー
  user = users('fan_bingbing')
  ability = Ability.new(user)
  assert ability.cannot?(:manage, Test.new)
end
```
上記のような感じで、ユーザーが権限を持たないことをテストすればOK！
TG Pro ライセンスコード忘れた場合

# Macファンコントローラー「TG Pro」ライセンスコードを忘れた場合

初期：2020年3月10日

Macを新しく買い替えた時の移行はTime machineを使えば簡単

自分はMacの掃除を兼ねてMacの初期化をするため、ログイン・アクティベート状態のアプリ等をログアウトしていく際
Mac用ファンコントローラー「TG Pro」の出番が来た

MacOSの初期化後アプリをインストールしライセンスを登録するために、メールアドレスとライセンスコードが必要になる

しかし、そんな律儀に、ライセンスコードをメモしている人も少ない。

そこで、ネット検索しても出てこなかったが、ライセンスコードを調べることができたのでその方法の共有をする

## 用意するもの

1. メールアドレス  
(購入するのに使用したアドレスを忘れた場合再度購入することになってしまうかもしれない)  


## 手順

以下のサイトにアクセス
![スクリーンショット 2020-03-10 11.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600109/1ef7da7e-d73f-13f8-ce98-67c1e679ce71.png)


 [Tunabelly Software Support](https://www.tunabellysoftware.com/support/contact/)

Recover License:と書かれたテキストボックスにメールアドレスを入力しRecoverと書かれたボタンを押す


![スクリーンショット 2020-03-10 11.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600109/701a2448-e061-3a2b-f0a9-f462c385b354.png)

緑の文字が表示されるので受信したメールを確認する

以上です

### メールアドレスを複数運用している場合

自分もいくつかアドレスがありどれで購入したのかわかりません。
なのでいくつかのアドレスを入力しました。

購入に使用していないメールアドレスだと以下のようなメールが届きます。
![スクリーンショット 2020-03-10 11.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600109/e4853651-8324-b9d5-ecf1-2aaba1965c89.png)

「no order history」ですので購入に使用していないメールです

購入に使用したメールアドレスだった場合


![スクリーンショット 2020-03-10 12.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600109/73596154-4d19-4d0b-0cf5-b21b382ec2a2.png)

　
メールからアプリのダウンロードも行えます。
Progate で学んだ　html、css を使って自分のプロフィールWEBページを７日間で制作しました。

これです↓
https://toshiki89.github.io/suzuki-toshiki./suzukitoshiki.html

#はじめに

現在、大学3年生で未経験からエンジニアを目指して就職活動中です。

昨年の12月、１ヶ月間携帯アプリでProgateを一通り触り、
2月に入ってからMacでVisual Studio Code(VS Code)で
コードを書きはじめ、Githubアカウントを作成し、WEBページを公開しました。

#理解できたこと
###【html】
①
![スクリーンショット 2020-03-10 10.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/74edc401-cf6e-8062-a17a-fc7838e7f2f4.png)
このコードでSNSのURLを呼び出すこと。

②
<img width="955" alt="スクリーンショット 2020-03-10 10.38.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/1beb9fa9-a0e1-ac3c-4ed5-3c99748d6de5.png">

githubにアップロードした画像を載せる時は自分のアカウントURL(https://toshiki89.github.io/suzuki-toshiki.)　の後に画像のファイル名　(/657264B1-F3FB-41F0-AD52-C68F1BA43E94_1_201_a.jpeg)
を書くこと。

③
<img width="528" alt="スクリーンショット 2020-03-10 10.43.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/b4fa66e7-50a5-eb81-f2da-7a7ecf11e126.png">
で
![スクリーンショット 2020-03-10 10.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/639e1bbe-3360-3007-c22f-840e6ddae681.png)
と表示でき、クリックするとリンク先を開けること。

###【css】
①object-fit: cover;
で画像の中心部をトリミングできること

#理解できていないこと
###【html】
①
<img width="134" alt="スクリーンショット 2020-03-10 11.34.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/212f1924-ed87-9b1a-4524-dffc86ffeb62.png">　　
で
<img width="552" alt="スクリーンショット 2020-03-10 11.34.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/c7c69065-10a6-b00b-102c-d694d9116be4.png">
上の画像のように・と文字の間に変な隙間があくこと。


###【css】
①![IMG_7170.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/10152abf-a99e-0c65-af6e-dceca60beb99.jpeg)

携帯電話でページを開くとこのように画像が半分になること。

②
<img width="153" alt="スクリーンショット 2020-03-10 11.50.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/6da29c3b-6c0a-d367-bc43-2f1d3ab7e6c9.png">
ここで color:skyblue;
としているが、
<img width="152" alt="スクリーンショット 2020-03-10 11.50.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599776/94fa29a0-7c3a-8b70-44bb-9c154a788850.png">
上の画像のように紫色で表示されること。
#これから
PHP ruby 等で機能を追加し、このページを更新していきます！
PythonのマイクロフレームワークBottleを触った

## Bottleとは
https://bottlepy.org/docs/dev/
PythonのマイクロWebフレームワークです。Webアプリケーションを構築する上で必要最低限の機能のみが提供されておりちょっとしたアプリケーションを作るのに使う感じ。
今回はPythonでいい感じにRoutingしたかったので採用。

## インストール

```
pip3 install bottle
```

## Routing
Routeデコレータ（＠route）をつけることでRoutingが行われるらしい

```Python
# index.py

@route('/')
def index():
  return [json.dumps({'message':'hoge'}).encode("utf-8")]
```

## サーバー起動
run関数を使う。先ほどのファイルでrun関数を呼び出し。

``` python
# index.py

@route('/')
def index():
  return [json.dumps({'message':'hoge'}).encode("utf-8")]

run(host='localhost', port=3001)
```

index.pyを実行すると

```
python3 index.py
Listening on http://localhost:3001/
Hit Ctrl-C to quit.
```

サーバー起動

## 確認
``` curl
curl http://localhost:3001/
{"message": "hoge"}
```
無事レスポンスが返ってきた
jestでwindowオブジェクトの要素をmockする

例えば `window.navigator.language`を変更したい場合などに用いる


テスト対象コード例 `isSupportedLang.ts`

```typescript

export function isSupportedLang(): boolean {
  return ['ja','en', 'fr'].indexOf(window.navigator.language) >= 0;
}
```


テストコード例 `isSupportedLang.test.ts`

```typescript
import { isSupportedLang } from '../../src/utils/isSupportedLang';

describe("when browser language is not in [ja,en.fr]", () => {
  let windowSpy;
  beforeEach(() => {
    const originalWindow = { ...window };
    windowSpy = jest.spyOn(global, "window", "get");
    windowSpy.mockImplementation(() => ({
      ...originalWindow,
      navigator: {
        ...originalWindow.navigator,
        language: 'Mocked_language'
      }
    }));
  });
  afterEach(() => {
    windowSpy.mockRestore();
  });
  it('will be falsy', () => {
    expect(isSupportedLang()).toBeFalsy();
  });
});

describe("when browser language is fr", () => {
  let windowSpy;
  beforeEach(() => {
    const originalWindow = { ...window };
    windowSpy = jest.spyOn(global, "window", "get");
    windowSpy.mockImplementation(() => ({
      ...originalWindow,
      navigator: {
        ...originalWindow.navigator,
        language: 'fr'
      }
    }));
  });
  afterEach(() => {
    windowSpy.mockRestore();
  });
  it('will be truehy', () => {
    expect(isSupportedLang()).toBeTruthy();
  });
});

```
Modify ALL history on Git using filter-branch command.

**This way is recommended for private development.
If you are in team, use more appropriate way.**

Have you experienced that your commit is not related to your account on GitHub haven't u?
Yes it's me.

So, I've wrote down here how to solve it.

## 1. Use filter-branch command

##### You'd like to change all history(all branches)

```
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='new.name';GIT_COMMITTER_NAME='new.name';GIT_AUTHOR_EMAIL='new.email@mail.com';GIT_COMMITTER_EMAIL='new.email@mail.com'" -- --all
```

## 2. Use the force

You need push after modified.

```
git push -f
```

## Refs
https://git-scm.com/docs/git-filter-branch
シンボルとは

# シンボルとは

Symbol とは、Ruby が内部でメソッド名などの識別に使っている数値で、任意の文字列に対して異なった値が割り当てらる。

なるほど、よく分かりませんね。

つまり、文字列だけど数値。みたいなものです。ハッシュのキーや文字列自体がデータでは無い物に使うことが吉です。



# 前コロンと後コロンの違い

シンボルとは主に文字列にコロン記号「:」を前置して定義したものです。

それにより、文字列を””で囲む必要がなくなります。

コロン記号「:」が、文字列記号「””」の代わりに、「これはシンボルだよ」とRubyに知らせています。

上記のように、コロン記号「:」を文字列に前置するとシンボルになります。

たとえば、ハッシュのキーとしてシンボルを使う際や、キーワード引数を使う際に、コロン記号「:」を後置します。

# シンボルはオブジェクトの一つ

メソッドなどの名前を識別するためのラベルをオブジェクト化

``` ruby
samurai   /*文字列
:samurai　/*シンボル

```

# ハッシュのキーとして利用する
よく使われるのが、ハッシュのキーだと思います。

```ruby
hash_symbol = { tsuma: "sazae", otto: "masuo", kodomo: "tarao" } 
```
取り出しは

```ruby
puts hash_string[:tsuma]  # "sazae" と表示
puts hash_string[:otto]   # "masuo" と表示
puts hash_string[:kodomo] # "tarao" と表示

```

なり、キーをシンボルで定義しています。


## ハッシュはデータを持たない

最初に記述した通り、ハッシュは「文字列だけど数値。」なのでデータを持ちません。
そのため、文字列そのもののデータを必要としない場合にシンボルが使われています。


### シンボルのメリット
シンボルを使うことでコードが短くなり可読性が上がったり、処理が早くなったり、メモリ消費が少なくなったりと、いいことばかりらしいので、一緒に勉強しましょう。
Ｇoogle ColaboratoryでGoogle Driveの中のファイルを読みこむ方法

Colaboratoryとはgoogleが作った
jupyter note環境をブラウザで使えるようなツールです。

Google Driveでに入れたファイルを読み込む方法です。

# Googleドライブに入れた　sample_submission.csvを読み込む
<img width="843" alt="2020-03-10_11h07_57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/958b5296-a1d4-478d-8933-3e2eea283afe.png">

## Goodgleドライブをマウントさせる
左側のファイルからドライブをマウント→GOOGLEドライブに接続を選択します

<img width="786" alt="2020-03-10_11h14_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/36589817-2946-67a3-6f7a-ee9988bab4d8.png">

## ディレクトリを確認
　接続が上手くいくと、
　```python /content/drive/My Drive/ ```　に自分のGoogleDriveのファイルが見えるようになってます。私は、Ｇoogle Colaboratoryのファイルは、Colab Notebooksの中に入れてます。

## ファイルパスを調べる
今回のファイルパスを確認します。該当のファイルをマウスで右クリックしてください。
今回は、以下のパスにsample_submission.csvがありました

``` /content/drive/My Drive/Colab Notebooks/sample_submission.csv" ```

<img width="427" alt="2020-03-10_11h20_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/fb4b2b88-8980-7926-50cc-0ca808a7434d.png">


## ファイルを読み込む
以下のコードで読みができます。

```python

import pandas as pd
train = pd.read_csv("/content/drive/My Drive/Colab Notebooks/sample_submission.csv")
train.head() 
```

無事にファイルを読み込みできました。
<img width="686" alt="2020-03-10_11h34_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/6428c5ba-4229-7426-1a6b-c9c4d3f167e8.png">
Power Automateでのソート (Loopなし)

Power Automateでは組み込みのソート操作がありません。
このため、2018年にはApply to each (ループ)を利用したソート方法が考案されました。[1]
このほかにも、最近では、Excelのテーブルを経由してデータをソートする方法も考えられています。[2]

これらの方法を [@johnnliu](https://twitter.com/johnnliu) に教えてもらって、チャットしていたら、『新しい方法を思いついた！』[3] と言い出したので、悔しくなって自分も新しい方法を考えていた結果、ループを利用しないソートの方法が見つかったので紹介します。

###Refs
1. [How to implement Sort with Microsoft Flow in 3 actions within a loop](http://johnliu.net/blog/2018/12/how-to-implement-sort-with-microsoft-flow-in-3-actions-within-a-loop)
2. [Sort an array in Power Automate in 3 easy steps](https://sharepains.com/2020/03/05/sort-an-array-in-power-automate/)
3. [Implementing a fast sort with Microsoft Flow using Parallel Compute](https://johnliu.net/blog/2020/3/implementing-a-fast-sort-with-microsoft-flow-using-parallel-compute)

# ループなしソートの方法
今回は文字の配列を対象に、ソートのコンセプトを説明します。
先にFlowですが、お手軽3ステップです。こういう基本的な操作は短いほど応用効くので、いいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/866d0845-825c-a1e4-0cfd-efa203fe5436.png)

概念というか、図にしてみると以下のような操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/f365eb6b-ef10-f1e4-d66c-833864fa7c2e.png)



## AtoZ Array
これがソート順を決めています。今回はa~Zの昇順でソートしているのですが、逆順にする場合には[z,Z,y,Y,...,a,A]のような配列を作ればよいです。
手で配列を作るのは大変なので、[文字列を1文字ずつに分割する方法](https://qiita.com/h-nagao/items/e0153b9a2c700cc2c95e) を利用します。
Selectアクションを利用していて、Fromは

```
range(0,length('aAbBcCdDeEfFgGhHiIjJkKlLmMoOpPqQrRsStTuUvVwWxXyYzZ'))
```

Mapには

```
substring('aAbBcCdDeEfFgGhHiIjJkKlLmMoOpPqQrRsStTuUvVwWxXyYzZ',item(),1)
```

を入力しています。

## Filter array
概念図の操作を実現するために、Filterアクションを利用します。
FilterのFromはAtoZ Arrayです。
Conditionが最も重要ですが、

```
intersection(json(concat('["', item(), '"]')), outputs('Initial_Array'))?[0]
```
Intersectionの結果がnullでないものでフィルターします。
ちょうど上の図の点線で書いた四角をフィルターして除去しているイメージです。

**[2020/3/11 追記]**
Intersection()=null は、数式使わずに
条件としてひっくり返したようなcontainsで代用できました。
(From はAtoZ arrayだけど、比較するのは 未ソート配列が、item()を含むかどうか)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a3a571d6-2b94-2ae8-bbe5-f525d9b3a84a.png)


# 実行速度比較
大文字小文字を含む40文字で試してみました。
十分な速度(0s)で処理が実行できていることが分かります。
![Comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2d138dd6-8fbe-13b2-9d32-2a0f67004534.png)

# 注意事項
このソートでは、元の配列に重複がないこと、空がないことを前提にしています。元の配列に重複がある場合には、1:NのLeft-joinをxpathを利用することで実現できますが、長くなるので次回以降ご紹介します。
備忘録（TX50）シンボル型の説明

Rubyでは:（コロン）で始まるシンボルと呼ばれるものがありますが、これはどういったものか、またシンボルを使うことのメリットは何か解説してください。


A
Rubyの内部では整数として管理されているが、文字列のように呼び出せるオブジェクト。同じシンボルであれば同一のオブジェクトを参照するので、いくつ作成しても必要なメモリ容量は変わらない。また、文字列よりも高速に処理することができる。

Q
tweet = Tweet.new(tweet_params)
if tweet.save
  some_method(tweet)
end

Railsアプリケーションではバリデーションに引っかかると保存がされない仕組みがあります。以下のコードで、保存されるべきtweetがなぜか保存されずロールバックされてしまう場合、どうすればその理由を確認できるか説明してください。

①1行目と2行の間にbinding.pryを記載し止める。
②pryの中で、tweet.saveを実行する。
③tweet.errorsを実行すると保存の際に出たエラーの内容が表示される。
【Django】管理サイトからデータベースにデータ登録時にIntegrityErrorが出たときの対処

# 環境
+ Windows 10
+ Python 3.7.3
+ Django 2.2.2
+ PostgreSQL 10.12

# 背景
Djangoの入門書で勉強していたところ、管理サイトからデータベースにデータを作成するセクションで以下のようなエラーが出た。

>IntegrityError at /admin/diary/diary/add/
������������"django_admin_log"������������������������������������������"django_admin_log_user_id_c564eba6_fk_auth_user_id"������������������������
DETAIL:  ������������"auth_user"���������(user_id)=(3)������������������
Request Method:	POST
Request URL:	http://127.0.0.1:8000/admin/diary/diary/add/
Django Version:	2.2.2
Exception Type:	IntegrityError
Exception Value:	
������������"django_admin_log"������������������������������������������"django_admin_log_user_id_c564eba6_fk_auth_user_id"������������������������
DETAIL:  ������������"auth_user"���������(user_id)=(3)������������������
Exception Location:	C:\Users\grin\Anaconda3\envs\django\lib\site-packages\django\db\backends\base\base.py in _commit, line 240
Python Executable:	C:\Users\grin\Anaconda3\envs\django\python.exe
Python Version:	3.7.3

django_admin_logの整合性エラーのようです。

django_admin_logテーブルに、古いauth_userテーブルとの外部キー関係が含まれていると発生するそうです。よって、これを削除してテーブルを再作成する必要があります。

# 対処法
`$ python manage.py dbshell`
`DROP TABLE django_admin_log;`
`\q`
`$ python manage.py sqlmigrate admin 0001 | python manage.py dbshell`

# 参考文献/URL
+ https://www.shoeisha.co.jp/book/detail/9784798162508
+ https://stackoverflow.com/questions/19410712/integrityerror-at-admin-course-course-add-in-django
+ https://stackoverflow.com/questions/15124523/integrity-error-on-django-admin-log-after-updating-existing-site-to-new-django-1/27028187#27028187
+ [Python Django チュートリアル(1)](https://qiita.com/maisuto/items/d01e2cca63c8e5b2c18c)
Selenium 関連情報

# 公式サイト
https://www.selenium.dev/

# Selenium IDE
https://www.selenium.dev/selenium-ide/

# WebDriver

|   | URL |
|---|-----|
| chrome driver | http://chromedriver.chromium.org/ |
| edge driver | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ |
| firefox(gecko) driver |https://github.com/mozilla/geckodriver |
| Internet Explorer driver | https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver |
| Safari driver | https://developer.apple.com/documentation/webkit/testing_with_webdriver_in_safari |

# NodeJs 関連

|   | URL |
|---|-----|
| selenium-side-runner | https://www.npmjs.com/package/selenium-side-runner |
| selenium-webdriver | https://www.npmjs.com/package/selenium-webdriver |
| chrome driver | https://www.npmjs.com/package/chromedriver |
| firefox(gecko) driver | https://www.npmjs.com/package/geckodriver |
| edge(legacy) driver | https://www.npmjs.com/package/edgedriver |
| selenium-standalone-server | https://www.npmjs.com/package/selenium-standalone |

# Qiita 記事

* [全国のSeleniumer必読](https://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* [Chromeでunknown error: call function result missing 'value' となった場合、WebDriverを更新すると解決するかもしれない](https://qiita.com/tamanobi/items/60e4f427f7651f275567)
* [Selenium IDE コマンドリファレンス](https://qiita.com/oh_rusty_nail/items/77782973b4152992017b)

# その他

メモなど

#### Selenium IDE における alert, prompt, confirmation の扱い

`xxxx xx on next xxxxxx` を使用する

挿入位置はアラートが表示されるタイミングより前

#### WebDriver における alert, prompt, confirmation の扱い

`WebDriver xxxx xx on visible xxxxx` を使用する

挿入位置はアラートが表示されているタイミング

#### Selenium IDE で配列の値の取得に変数を使う場合

参考：https://github.com/SeleniumHQ/selenium-ide/issues/562

| Command | Target | Value |
|---------|--------|-------|
| execute script | return ["a", "b", "c"] | arr |
| store | 1 | i |
| execute script | return `${arr}[${i}]` | item |
私的なtips

# リモートワーク（テレワーク）

* 歩く
    * 腰痛対策。歩数は本当に減るので、少しは歩いた方が健康に良い
    * 買い物はまとめ買いせず、こまめに行くようにして歩数を稼ぐ
    * 朝、昼、夜などのまとまった時間を作って散歩する
    * 一つ遠いコンビニに行く

---

* ストレッチする
    * お尻のストレッチは腰痛に効いた。本当におすすめ
    * [参考: Youtube - ASICS Japan お尻の下部ストレッチ](https://www.youtube.com/watch?v=QQxVPlO6d1U)

---


* 換気する
    * 眠気、頭痛がするようになった人は、原因は二酸化炭素濃度が高いのかもしれない
    * 二酸化炭素濃度計を使えば可視化出来て、対策の要不要やbefore/afterで調子がどうなったかを判断しやすい。安く手に入る
    * 800ppm以下になるように換気を調整する。個人差があるかもしれないので目安で

---

* ノーパソは会議中に電源を繋ぎっぱなしにする
    * バッテリーの残量が少なくなるとCPU使用率を抑えるケースがある
    * テレビ会議はかなりCPUを使うので、抑えられてしまうと遅延が起きたりするので良くない

---

* ポモドーロメソッドの導入
    * 自宅だとついつい他の誘惑に負けてしまう人は試してみる価値がある
    * 物理タイマーでも良いし、アプリでも良い
    * 残り時間が常に見えるようにしておくと、誘惑に負けそうになった時に「まだ時間残ってるな」と元の作業に集中力が戻りやすくなる
    * 休憩毎に水分補給する習慣が付けやすい
    * 姿勢を変えるチャンスが増えるので腰痛対策になる

---

* 内蔵マイクは良くない
    * 内蔵マイクは周囲の音声を拾ってしまう。生活音やタイプ音は他のメンバーの生産性を下げる可能性がある
    * イヤホンマイク、ヘッドセットを使うのが良い
    * ミュートも大事


# プログラミング
* 最も大切なのは「わかりやすいかどうか」
    * 新規参加者が読んですぐにわかるか、3ヶ月後の自分が読んですぐにわかるか、他人に説明する時にすぐに伝わるか
    * 書く時間よりも読んでいる時間の方が長いとされているので、多少コードが長くなったとしても理解するのに掛かる時間を減らす方が全体の作業時間を減らせる可能性が高い
    * 目指すべきは「短いコード」でも「テクいコード」でもなく「平易なコード」。全体の時間を短くすること
    * 処理時間を短くしたいなどで複雑さもやむなしな場合はある。その代わりコメントやドキュメントでちゃんと残しておく

---

* 「create」はDBへの登録、「make」はオブジェクトやファイルの生成に使用するように使い方を統一する（createの意味を「DBへの登録」だけに一本化する）

---

* 略語は世間、もしくはプログラミングの世界、もしくはその業界（ドメイン）で一般的なものだけ許容する（例： str,int,mtg）
    * 一般的かどうかで迷ったら略さない
    * あまりにも長すぎるとかで略したくなったらメンバー、関係者から同意を取ってドメインの言葉として定義しプロジェクト内で普及させる事をセットで行う



---
* 共通化する際は3の法則（[Wikipedia: Rule Of Three](https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)) )に従う

---
* 難しい命名ほど案を沢山出してその中から選ぶようにする。相談も有効

---
* 二重管理は良くない。システム構成も、ドキュメントも
    * 正と副がハッキリしたバックアップのようなものなら一方通行で上書きするだけなので問題は無い
    * それぞれ別の場所で使われて最終的にマージする必要がある、みたいな双方向なものは悪（gitってまさにそれじゃ。。）

---
* KISS原則は概ね全般的に有効。ただし複雑な処理をしたい要件も当然ある。それを如何に平易な設計/コードで実現するかを考える

---
* DRY原則は要注意。やりすぎると破綻する 

---
* 「暗黙的」はその事について知っている必要があるのであまり良くない
    * 一般的でなければないほどその事柄について知ってる人は少なくなる
一般的な事柄でないなら明示的な方が良い

---
* 驚き最小の原則は全般的に有効。平易である事を心掛ければ自然と実現できる気がする


---
* 変数名はわかりやすい命名を心がける
    * `file`みたいな命名は何のファイルかわからないのでコードを追うことになる
    * 実装者が5秒かけて命名し2秒でタイピングすれば合計7秒で済んだものを、今後全員が15秒かけて読むことになると15秒*n回に膨れる
    * 他人の時間を盗りたければ積極的に使うのが良い

---

* YAGNIは概ね全般的に有効
    * 「必要（must）でないならやらない」ではなく、「不要になる可能性があるならそれがハッキリするまでやらない」と考えるのが良い
    * 「無くても動くが（mustではないが）、一部のユーザーにとってはあった方が便利」という機能を実装することはYAGNIではない
    * 「必要かもしれない」とか「あった方が便利かもしれない」機能を実装することはYAGNI。明確にするのが良い

---
* 単一責任の原則は概ね全般的に有効
    * 一つのメソッドは一つのことをやる
    * 与えられた責務と実際の実装が一致していることが重要


# （仮）
* お金を出してくれるところに身を移す事が大切
    * 同じスキルでも会社によって待遇が全然違うというのはよくある
    * [参考: Qiita - kazukichi - ウェブカツ運営者が語る！エンジニアで稼ぐために大切な２０のコト
](https://qiita.com/kazukichi/items/7379b75fba2f90d3cf45#%EF%BC%96%E7%A8%BC%E3%81%92%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AF%E5%8A%AA%E5%8A%9B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AA%E3%81%8F%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%82%E3%82%88%E3%82%8B%E4%BA%8B%E3%82%92%E7%90%86%E8%A7%A3%E3%81%97%E7%A8%BC%E3%81%92%E3%82%8B%E7%92%B0%E5%A2%83%E3%81%B8%E8%BA%AB%E3%82%92%E7%BD%AE%E3%81%8F%E3%81%93%E3%81%A8)
Athlon 200GE(AMD)でDebian(Linux) & LXQtを動かす

#はじめに
Athlon 200GEでPCを組み、Debianをインストールしてみるとデスクトップ環境が起動しませんでした。
色々調べて動かすことができたので、その方法を書いておきます。

#環境
CPU: AMD Athlon 200GE
GPU: Raedon Vega 3(CPU内蔵)
マザーボード: ASUS PRIME B450M-A
OS: Debian 10.3
デスクトップ環境: LXQt

#準備
- DebianをインストールするためのUSBメモリを用意します。
- [Radeon™ Software for Linux® 19.50 Release Notes - AMD](https://www.amd.com/ja/support/kb/release-notes/rn-amdgpu-unified-linux)の「Radeon™ Software for Linux® version 19.50 for Ubuntu 18.04.3」からドライバ「amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz」をダウンロードし、USBメモリに入れておきます。

#作業
- 先ずは普通にDebianをインストールします。
  - インストールが終わって再起動すると、デスクトップ環境が起動せず、黒い背景に白い文字のコンソール画面が表示されます。
  - コンソール画面が表示されない場合は、Ctrl+Alt+F2などで表示されるはずです。
- ログインして、ドライバの入ったUSBメモリを挿します。
- スーパーユーザに切り替えて(sudoでも良し)、/mntにマウントします。
- ホームディレクトリにでも中身をコピーしておきます。
- 「amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz」を解凍します。

```
username@debian:~$ tar -xf amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz
```

- 生成されたディレクトリに入り、スーパーユーザ(sudoでもOK)で次のコマンドを実行し、インストールします。

```
root@debian:/home/username# cd amdgpu-pro-19.50-967956-ubuntu-18.04
root@debian:/home/username/amdgpu-pro-19.50-967956-ubuntu-18.04# apt install ./amdgpu-core_19.50-967956_all.deb ./amdgpu-dkms_19.50-967956_all.deb
```

- 結構時間がかかりますが、インストールが終われば完了です。/mntをアンマウントして再起動します。

#おわり
以上の方法でデスクトップ環境が起動できるようになりました。
この解決法に辿り着くのに時間がかかってしまいましたが、わかってしまえば面倒くさいだけで簡単な作業でした。

#参考文献
[How to install official AMDGPU linux driver with kernel 4.19.x on Stretch and Buster](https://wiki.debian.org/AMDGPUDriverOnStretchAndBuster2)
Vueでできそうでできないこと(1) あるケースでのv-model

# はじめに

入力パーツがたくさんある場合、templateにバラで書くと長くなるのでv-forで回して生成したくなりますが、そこでv-modelをループ変数に基づいて動的に作ろうとすると、やりたいようにできないことがあります。

**できる方法があればぜひ教えて下さい！**

# うまくいくケース

このようにv-modelの参照先が階層化されていてトップが固定のliteralで書ける場合は特に問題がありません。

```vue
<template>
    <div>
        <div v-for="key1 in level1" :id="key1">
            <span>{{ key1 }}</span>
            <div v-for="key2 in level2" :id="key2">
                <input v-model="form[key1][key2]">
            </div>
        </div>
    </div>
</template>
<script>
export default {
    data () {
        return {
            form: {
                tokyo: {
                    prop1: 0,
                    prop2: 0,
                },
                osaka: {
                    prop1: 0,
                    prop2: 0,
                },
            },
            level1: ["tokyo", "osaka"],
            level2: ["prop1", "prop2"],
        };
    },
};
</script>
```

# うまく行かないケース

では上記のformの内容を1段上げてみるとどうでしょう。

```vue
<template>
    <div>
        <div v-for="key1 in level1" :id="key1">
            <span>{{ key1 }}</span>
            <div v-for="key2 in level2" :id="key2">
                <!-- this[key1][key2]に行ってほしい -->
                <input v-model="[key1][key2]">
            </div>
        </div>
    </div>
</template>
<script>
export default {
    data () {
        return {
            tokyo: {
                prop1: 0,
                prop2: 0,
            },
            osaka: {
                prop1: 0,
                prop2: 0,
            },
            level1: ["tokyo", "osaka"],
            level2: ["prop1", "prop2"],
        };
    },
};
</script>
```

エラーは出ませんが、値も変わりません。
内部的にどういう解釈になっているのか追っかけていないのでわかりませんが、とりあえず動作しません。

# まとめ

上記のように、dataのトップレベルのプロパティ名を動的に指定する方法が見つかりませんでした。

通常はとりあえず1段下げれば回避できるのですが、
例えばvuexのストアの中にある値をv-modelで使いたい場合get/set形式のcomputed propertyにするのがよくありますが、computedは階層化できないので、1段下げることができません。

実は回避方法はひとつ見つけていて、このように遠回りにthisを置き換えると動きます。

```vue
<input v-model="$vnode.componentInstance[key1][key2]">
```

ただちょっと変化球ですしずっと使えるかどうかもわからないので、ストレートなやり方があったら教えて下さいませ。
Railsで作ったアプリをAWSでデプロイ①　〜アカウント作成編〜

こんにちは
AWSをつかってRailsアプリをデプロイしたいと思います

まず、AWSアカウントを作成します
<img width="1440" alt="スクリーンショット 2020-03-09 14.16.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/ac8c388e-e6d6-244f-e23a-eeceed0b3141.png">


注意点として一度使ったメールアドレスは、削除すると二度と使えなくなるそうです。

次の画面、僕はパーソナルです。

<img width="1440" alt="スクリーンショット 2020-03-09 14.20.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/b9f73803-b09c-3280-1697-61cede96dd8e.png">

この後、クレジットカード→本人認証画面なので割愛します
プランはベーシックです。

晴れてAWSアカウント作成完了！
早速EC2インスタンスを作りたかったのですが、どうやらアカウント作成直後はできないみたいです。
少し待ちます。
転職日記１１日

こんにちは

最近は企業の面接や応募を積極的に行いながら、

ネットに転がっていたチームラボのスキルアップをやっています

こんなにしっかり就職活動したのは人生において初めてなので

しんどい部分もありますが、東京に来たいい面といいのもあり、楽しさもあります。

会社は１つ内定が出たのですが、そこは自分の希望と少し違うところのためまだ迷っており

保留して転職活動を続けています。

ここまで来たのですから、未経験ですが自分が納得して入れるところに入ろうと思います。

もう少し頑張ります。