OmniAICreator/Qiita-1.07M huggingface dataset:
SES面談で聞かれたことまとめ

初めまして。ぴーやまと申します。
普段はSESで現場に常駐し、作業しています。
本記事では現場に配属される前の面談で聞かれたことや感じたことを紹介したいと思います。
あくまでも私の主観なのでそこを考慮していただければと思います。

#SES面談とは
SESはシステムエンジニアリングサービスの略で、客先に技術者を派遣するサービスを表します。
客先に技術者を派遣する前にスキルマッチしているかを判断する面談をSES面談と言います。
面談は派遣予定の技術者、技術者側の営業、客先のプロジェクト管理者（以下管理者）で行われることが多いかと思います。（営業はいたり、いなかったりですが）

#面談の流れ
基本的には以下の流れです。
　①配属予定のプロジェクトの説明
　②経歴書（スキルシート）を元に面談
　③質疑応答
　④技術者退室後、営業にて面談結果の確認、単価交渉

###①配属予定のプロジェクトの説明
配属予定のプロジェクトについての全体像や、使用している技術についての説明を受けます。

###②経歴書（スキルシート）を元に面談
経歴書を元に管理者から質問が来るので回答します。
聞かれる内容は下記へ記載します。

###③質疑応答
いわゆる逆質問というやつです。
技術者側からの質問タイムです。

###④技術者退室後、営業にて面談結果の確認、単価交渉
技術者退室後に行います。
技術者は外で待ちぼうけです。


#面談で聞かれたこと
基本的には過去に従事していたプロジェクトでの経験を聞かれます。
私の場合、COBOL、java、SQL、shellの経験があったため、以下のことを聞かれました。
　・COBOLの経験はオープンCOBOLか、汎用COBOLか
　・javaはクライアント、サーバ両方の開発経験があるか
　・新規の開発（ゼロからプログラム作成）は可能か
　・使用していたフレームワークは何か
　・どのような環境だったか
　（オンラインがjavaでバッチがCOBOL、サーバはUNIX系など）
　・shellは何を使っていたか（cshやbashなど）
　・どのSQLを使っていたか（oracle,MySqlなど）

現場での環境を理解しておけば答えられる質問が多いですが、中には採用面接のような質問をされる方もいます。
　・仕事をする上で大事だと思うことは何か
　・仕事で苦労したことは何か
　・喫煙はするか（昼休みしか喫煙できないので問題ないか確認したかったそうです）

どこの面談でも必ず聞かれる質問もあります。
　・残業はできるか
　・通勤時間はどのぐらいか

何かあったときに残業して対応できるか確認しておきたいのかと思います。残業については、私はできますと回答しています。（したくないと言いたいけど笑）

#質疑応答について
面談の最後に技術者側からの質問タイムがあります。
プロジェクト説明の中で疑問に思ったことや、不安点があれば確認します。
とは言っても必ずしも疑問点があるかと言われるとないこともあるので私はどこの現場でも使いまわせる質問を用意しています。
　・プロジェクト配属までに勉強しておくことはあるか
　・プロジェクトの期間（最初の説明で意外と期間の説明がなかったりする）

ただ、本当に知りたいのはその現場がブラックか否かですよね笑
ブラックかを見極めるための指標の一つとしてあげられるのは平均稼働時間だと思っています。
でもやる気ないとか思われそうでそんなこと質問できないですよね。

**はい、そう言った聞きづらい質問は営業にしてもらいましょう!**

営業であれば稼働を気にすることは当然ですし、変な風に捉えられることはないでしょう。
もし、面談に営業がいなかった場合は後日確認してもらいましょう。

以上、私の経験を踏まえて記載させていただきました。
tempfile

```py:1
import tempfile

with tempfile.TemporaryFile(mode='w+') as t:
    t.write('Hello')
    t.seek(0)
    print(t.read())

with tempfile.NamedTemporaryFile(delete=False) as t:
    print(t.name)
    with open(t.name, 'w+') as f:
        f.write('test\n')
        f.seek(0)
        print(f.read())
```

```:1の実行結果
Hello
/tmp/tmpahd0kr2●●●
test
```
print(t.read())で書き込んだHelloが出力される。
これは一時ファイルなので削除される。

NamedTemporaryFile(delete=False)とする事で、
削除されずファイルを残す事ができる。



次に一時ファイルではなく、
一時的なディレクトリをつくる。

```py:2
with tempfile.TemporaryDirectory() as td:
    print(td)

temp_dir = tempfile.mkdtemp()
print(temp_dir)
```

```:2の実行結果
/tmp/tmp9bq6_n●●
/tmp/tmpiybl8b●●
```

tdは一時的なディレクトリ。
temp_dirはtempfile.mkdtemp()とする事で、
削除されずディレクトリを残す事ができる。
ActiveDirectory証明機関（ADCS）から中間CAを生成する

# はじめに
squidのSSLインターセプト用に中間CAを準備しなきゃいけないけど、上位のCAがWindowsServerの証明機関（ADCS）だったので、LinuxでCSRを発行してADCSに投げて証明書をつくってもらいました。
ただそれだけなのですが、後日参照できるように手順を記載しておきます。

# 修正
タイトルにSSLインターセプトという言葉が入っていましたが、よくよく考えたら関係ないので外しました。

# 作業内容
秘密鍵(非暗号化RSA2048bit)とCSRを同時に作成

```
# openssl req -new -newkey rsa:2048 -nodes -keyout icaprivkey.pem \
>    -out csr.pem -subj "/C=JP/ST=Tokyo/O=EXAMPLE/CN=EXAMPLE Inter CA"
Generating a 2048 bit RSA private key
...........................................................................................................+++
................................................................+++
writing new private key to 'icaprivkey.pem'
-----
```

証明書の文字列をコピーする。

```:csr.pem
-----BEGIN CERTIFICATE REQUEST-----
MIIClDCCAXwCAQAwTzELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMREwDwYD
（～省略～）
F/P8c98kLuUEOxXaYFNRTiyrpxWpbY9qKIpCzi85hnXW9DXUBQTZ2w==
-----END CERTIFICATE REQUEST-----
```

ADCSにアクセスし、「証明書の要求」をクリック
[![Screenshot from Gyazo](https://gyazo.com/d34429ba661de4bf57796cdbf6547b09/raw)](https://gyazo.com/d34429ba661de4bf57796cdbf6547b09)

「証明書の要求の詳細設定」をクリック
[![Screenshot from Gyazo](https://gyazo.com/7e99e82e4cae538ae36d7bff3e997597/raw)](https://gyazo.com/7e99e82e4cae538ae36d7bff3e997597)

「Base 64 エンコード～～～」をクリック
[![Screenshot from Gyazo](https://gyazo.com/4b1feef91e9ea033d88d3ecc3f2433e4/raw)](https://gyazo.com/4b1feef91e9ea033d88d3ecc3f2433e4)

さっきコピーしたCSRの中身をペースト
証明書テンプレートは「下位の証明機関」を選択して、「送信」をクリック
[![Screenshot from Gyazo](https://gyazo.com/df58065a43c648944f890250fae125e5/raw)](https://gyazo.com/df58065a43c648944f890250fae125e5)

Base64エンコードの証明書をダウンロード
[![Screenshot from Gyazo](https://gyazo.com/ef6776da90f5e2b317dfcee959eb01ee/raw)](https://gyazo.com/ef6776da90f5e2b317dfcee959eb01ee)

すべてのアプリケーションポリシーになっていることを確認（認証局としての機能）
[![Screenshot from Gyazo](https://gyazo.com/1de71f6d082dd47146a879a9693d5d9f/raw)](https://gyazo.com/1de71f6d082dd47146a879a9693d5d9f)

あとはProxyに証明書を秘密鍵をもっていけばOK

# SSLをインターセプトするとこうなる
SSLをいちどProxyで終端するので、httpsでアクセスした先のサイトの証明書は、今回発行した認証局から発行されているようにみえる。
[![Screenshot from Gyazo](https://gyazo.com/51b08c75d6837675ec0ccecee958f74b/raw)](https://gyazo.com/51b08c75d6837675ec0ccecee958f74b)

あのgoogleでさえ我が軍門に。。。
いえ、なんでもないです。
Android Studio で 〇〇_activity.xml が Rename できない時にやること

# エラー詳細

`Read-only 〇〇_activity:int of class 〇〇.R.layout` が発生し、
Rename を行うことができません。

# 解決方法

build フォルダを全て削除！！！
その後に Rename をしてみると解決している☺️

![Screen_Shot_2020-02-23_at_17_49_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/3345dced-8e34-a438-65cb-8b3416987a2b.png)
Maya python で, 特定の mesh 頂点の 特定の joint の skin weight の値を取得, 設定する

## 背景

* 特定の joint の skin weight の値を全部ゼロにしたりとか, 特定の頂点の weight の値をプログラマブルに設定したい(距離に応じて weight を設定など)
* Maya 上で UI Paint とか component editor とかで処理するにはめんどい
  * hair とか細かい形状とか, 頂点数が多いとか

`.ma` をいじるとか, 一旦 weight を xml or texture に出して処理する手もありますが, ここでは Maya Python で処理するのを考えてみます.

## 方法

https://www.charactersetup.com/tutorial_skinWeights.html

http://ueta.hateblo.jp/entry/2015/08/24/102937

http://discourse.techart.online/t/maya-python-findrelatedskincluster/2673/4

http://flame-blaze.net/question/pymel%E3%81%A7weight%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

http://codingdict.com/sources/py/maya.cmds/20400.html

### 手っ取り早く取得, 設定する.

http://me.autodesk.jp/wam/maya/docs/Maya2010/CommandsPython/skinPercent.html

skinPercent コマンドで, joint 名と mesh 名, vtx を指定する.

```

# vtx[100] の joint1 の weight を取得
cmds.skinPercent( 'skinCluster1', 'pPlane1.vtx[100]', t='joint1', query=True, value=True)

# vtx[100] の weight を. joint を指定して設定
cmds.skinPercent( 'skinCluster1', 'pPlane1.vtx[100]', transformValue=[('joint1', 0.2), ('joint3', 0.8)])
```

簡単ですが, 頂点数多いと時間かかります(i9 9900K で, 5 万頂点で 4 joint 処理して 4~5 分くらい. また, シングルコア実行なので多コア CPU は役に立たない).

### その他(より効率的と思われる方法)

#### mesh についている skinCluster を取得(mel)

mel で

```
findRelatedSkincluster <objname> ;
```

#### getInfluences などして iterate

```
import pymel.core as pm

skin = pm.PyNode(SKIN_CLUSTER_NODE)

# joint のリストを返す
skin.getInfluences()

# 実際に weight が設定されている joint を返す
skin.getWeightedInfluence()

# mesh, skinCluster の対応付けが一意とする(たぶん一意のはず)
# weightList は mesh の頂点ぶんある
vtx_id = 3
skin.weightList[vtx_id]

# ただ, weightList[0].w で取得できるウェイトの並びは, joint の順にはなっていない模様...?
```




http://www.marcuskrautwurst.com/2012/12/skinweights-savingloading-in-pymel.html

```
skin.getPointsAffectedByInfluence(JOINT_NAME)
```

で, selectionSet(特定の vtx 範囲)として weight を取得できる. これをうまく処理するのは上記 URL を参考にしてやればいけるはず...?

T.B.W.


## TODO

* [ ] より効率的な設定/取得方法を調べる続き
* [ ] Maya のなにかメニューとか mel で一括で設定する方法があるか調べる(`skinPercent` は頂点指定が必須っぽい)
[ancestry]多重構造のカテゴリ 導入

ECサイトのカテゴリ実装におきまして多重構造での実装が必要となったため
こちらの記事を残させていただきます。
多重構造とはなんぞやとの説明は参照記事をご覧ください。

## 関連リンク
[jqueryで横開きのリストを作りたい](https://qiita.com/i-to-to-to-mi/items/94cb9069df12a66bb48d)

## ancestry導入後起きやすいエラー（解消方）
migrationがうまく動かなくなることがあるので手順を下記に表示いたします

・`rake:db:migrate`または`rake:db:migrate:reset`でなぜかエラーが出ませんか？
まず、`rake db:reset`を打ちます
`rake db:migrate`を打ちます
`rake db:seed'でいけないでしょうか？
時々、途中でエラー分が出ます。
エラー文のなかには　”これを打ち込んで”　という一文がわかりやすく記載されているので
そのコマンドを打ち込みます。
さらに'rake db:migrate'これで行けるとはおもうのですが…

もちろん***resetをかけることでDBに入っていたデータが全て消えてしまうリスク***もございますので
それを念頭に入れて上で、消えても仕方ないといった場合はお試しください。

## 実装手順
1,Gemのインストール
2,モデルにアソシエーション定義
3,カテゴリの追加

4,ビューへの表示方法（こちらは別記事で書きます）



##1,Gemインストール
[ancestryのgithub](https://github.com/stefankroes/ancestry)
この手順通り記述します。

```ruby:Gemfile
gem 'ancestry'
```
ターミナルで`bundle`の実行
### `bundle`実行後、導入方法は２通りあります。（私の知る限りでは）


##### もしも、最初からテーブルを作成する場合は以下

```ruby:ターミナル
$ rails g controller category
$ rails g model category
　　　　　　　　　#ここのcategory部分は作成したいモデル名
```
今作成されたmigration fileを下記のように記述

```ruby:マイグレーションファイル
class CreateCategories < ActiveRecord::Migration[5.2]
  def change
    create_table :categories do |t|
      t.string :name, null: false
      t.string :ancestry
      t.timestamps
    end
    add_index :categories, :ancestry
  end
end
```
`$ rake db:migrate`をする。

##### すでにあるテーブルに追加する場合は以下のコマンドを打ちます。

```ruby:[例]ターミナル
$ rails g migration add_ancestry_to_[table] ancestry:string:index
#ここの[table]に自分の作成したいテーブル名を記述します。
#そのまま入れてエラーになったw
#今回作りたかったのはカテゴリテーブルなのでcategoryと記述しました

$ rails g migration add_ancestry_to_category ancestry:string:index
```
`$ rake db:migrate`をする。


##2,モデルにアソシエーション定義

```ruby:models/category.rb
class Category < ApplicationRecord
  has_many :items
  has_ancestry
end
```

```ruby:models/items.rb
#このテーブルはもともと作成済みのものです。
class Item < ApplicationRecord
  belongs_to user, foreign_key: 'user_id'
  belongs_to :category
end
```

##3,カテゴリの追加

```db/seeds.rb
#親要素
lady = Category.create(:name=>"レディース")

#子要素
lady_tops = lady.children.create(:name=>"トップス")
lady_jacket = lady.children.create(:name=>"ジャケット/アウター")

#孫要素（childrenと記述することで直前の変数の子要素として扱うことができる）
lady_tops.children.create([{:name=>"Tシャツ/カットソー(半袖/袖なし)"}, {:name=>"Tシャツ/カットソー(七分/長袖)"},{:name=>"その他"}])
lady_jacket.children.create([{:name=>"テーラードジャケット"}, {:name=>"ノーカラージャケット"}, {:name=>"Gジャン/デニムジャケット"},{:name=>"その他"}])
```

```ruby:ターミナル
$ rake db:seed
```
これでancestryの**準備完了**です
残るはビューへの記述

こちらは実装途中ですので別記事にて書きます。
記載後はこちらにもリンクを貼ります。
参考記事には多重構造とは？といったし詳細の記載もございますので是非ご参考にしてください。

自身は初学者でございますので記事の内容等に不備等ございましたらご指摘いただけますと幸いです。
また、少しでもお役に立てましたら良いねいただければ喜びます。

どうぞよろしくお願い致します。

## 参考サイト
[Github](https://github.com/stefankroes/ancestry)
[ancestryによる多階層構造の実現](https://qiita.com/ATORA1992/items/03eb78e212080072ab9f)
[多階層カテゴリでancestryを使ったら便利すぎた](https://qiita.com/Sotq_17/items/120256209993fb05ebac)
[ancestryの使い方](https://qiita.com/KOKEINTER/items/f61323552b1cc793f316)
[[Rails] Ajax通信を用いたカテゴリボックス作成](https://qiita.com/mihou/items/0fbda161527fcec48e81)
[データベース論理設計のアンチパターン](https://kyabatalian.hatenablog.com/entry/2016/12/19/193430)
フォームの遷移先の指定方法

Railsでフォームの遷移先が思ったようにいかなく、つまずいたため備忘録も兼ねて書かせていただきます。

##問題点

編集データを`carts#update`に届けく、以下のようにしてみたが

```rb:carts/edit.html.erb
<%= form_with(model: @cart, local: true ) do |f| %>
  <div>
    <%= f.label :quantity, "購入数" %>
    <%= f.number_field :quantity %>
  </div>
  <%= f.submit "更新", class: "btn" %>
<% end %>
```

この遷移先が、なぜか`cart_product_path`になってしまう。
また、Did you mean? で言われている `edit_product_path`も希望する遷移先とは違う。



<img width="921" alt="スクリーンショット 2020-02-21 20.46.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292027/94c7fa11-8108-10b7-1c35-55a4bfb41a62.png">


##改善方法

`form_with`のオプションで、`url: cart_path`と指定するとうまく遷移するようになりました。

```
      carts_add   POST   /carts/add(.:format)        carts#add
      carts       GET    /carts(.:format)            carts#index
      edit_cart   GET    /carts/:id/edit(.:format)   carts#edit
      cart        PATCH  /carts/:id(.:format)        carts#update (#遷移先にしたい)
                  PUT    /carts/:id(.:format)        carts#update
                  DELETE /carts/:id(.:format)        carts#destroy
```

```rb:carts/edit.html.erb
<%= form_with(model: @cart, url: cart_path, local: true ) do |f| %>
  <div>
    <%= f.label :quantity, "購入数" %>
    <%= f.number_field :quantity %>
  </div>
  <%= f.submit "更新", class: "btn" %>
<% end %>
```
AWSでJupyter Notebookを使えるように環境構築

初心者がAWS環境で機械学習の勉強ができる環境構築をしてみました。  
参照先のメモ書きです。  

## AWSアカウントを作成してみた    
ログインで困ったのは、「ルートアカウントか否か」ということ。
ルートアカウントログインのユーザーIDは入力しないでログイン可能。

AWS公式：[AWS アカウントのルートユーザー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html)

## インスタンスを作成してみた    
マシン選定に注意。
Amazon LinuxはRedHat系だそうです。
私は会社の研修でubuntuを触っていたので、ubuntuを選択することに。 
 
AWS公式：[Amazon Linux 2](https://aws.amazon.com/jp/amazon-linux-2/)
Qiita記事：[EC2のAmazonLinux2,Centos6,Centos7違いによる初期設定](https://qiita.com/su-pleiades/items/eec200bc312f58325145)

## ssh接続をしてみた
さて、ターミナルからssh接続！
ユーザー名やIPはどこから探すの？って思ったけど、EC2→インスタンス→（「インスタンスの作成」ボタンの右にある）「接続」ボタンを押したら確認できた。
ssh接続の方法も分かりやすく記載されていました。

AWS公式：[SSH を使用した Linux インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)

しかし、ターミナルでコマンドを打つと、タイムアウトになってつながらない・・・
どうやら原因はセキュリティにあるみたいだった。（自分のIPからの接続を許可していなかった。）

AWS公式：[SSH を使用した EC2 Linux インスタンスへの接続の問題に関するトラブルシューティングはどのように行えばいいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-ssh-troubleshooting/)
Qiita記事：[AWSのEC2のセキュリティのインバウンドのルールでIPを設定する場合は/32をつける](https://qiita.com/kiimiiis/items/eecaebbbf7bd2ae0e950)
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典：[ユニキャスト (unicast)](https://wa3.i-3-i.info/word1778.html) 

## AWS CLIを設定してみた
[CUI](https://wa3.i-3-i.info/word1373.html)で操作ができるように、AWS CLIを設定してみました。
AWS公式：[AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)

## AWS S3を作ってみた

AWS公式：[Amazon Simple Storage Service の使用開始](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/gsg/GetStartedWithS3.html)

## Jupyter notebookを使えるようにしてみた

[Jupyter Notebook（IPython）サーバの起動方法](https://dev.classmethod.jp/etc/ubuntu-jupyternotebook/)
[Rust] 数値計算向け Cargo.toml の設定

Cargo のデフォルトの設定は数値計算にはあまり向いていない部分があるため, `Cargo.toml` をどう設定するのが良いかまとめます. 他におすすめがあれば教えてください.

* 参考文献: [Profiles - The Cargo Book](https://doc.rust-lang.org/cargo/reference/profiles.html)

# 最適化を強制

Rust でガリガリ数値計算しようと思うときは比較的ハードな計算で Python じゃ遅すぎるということが多いと思います. そうするとたいていはデバッグ段階でもコンパイル時間よりも計算時間の方が長いので, 常に最適化をかけるべきでしょう. 

```toml:Cargo.toml
[profile.dev]
opt-level = 3
overflow-checks = false
```

デフォルトはデバッグビルドが `opt-level=0`, リリースビルドが `opt-level=3` です. オーバーフローのチェックは取り扱う問題に応じてオン/オフを設定すればよいと思いますが, 多くの場合, チェックしたいのなら明示的に `checked_add` などの関数を使用するべきだと思います.


# LTO を有効化

LTO (link time optimizations) を有効にするとさらなる実行時速度の向上が期待できますが, デフォルトではオフになっています. 例えばリリースビルドのみ有効化する場合は次のように設定します.

```toml:Cargo.toml
[profile.release]
lto = true
```

# デバッグ情報を残す

数値計算の場合, リリースビルドであったとしても問題が発生したら積極的にパニックさせることになります (変な状態のまま実行を続けられる方が迷惑). しかしデフォルトではリリースビルドではデバッグ情報が削除されてしまうため, 情報があまり出力されず不便です. デバッグ情報を保持するように設定します.

```toml:Cargo.toml
[profile.release]
debug = true
```

# まとめ

```toml:Cargo.toml
[profile.dev]
opt-level = 3
overflow-checks = false

[profile.release]
debug = true
lto = true

[profile.test]
opt-level = 3
```
VSCodeのIntelliSenseにpthread_rwlock_tを見つけてもらう方法

## はじめに

ここでは、VSCodeのIntelliSenseに`pthread_rwlock_t`を見つけてもらう方法を自分用にメモしておきます。

## 環境

* OS: Ubuntu 18.04.02 LTS
* VSCode 1.42.1
  * C/C++ for Visual Studio Code 0.26.3
* gcc 7.4.0

## 起きた問題

VSCodeを使って、`pthread`を使ったマルチスレッドプログラミングしていましたが、
キャッシュ関連処理で`pthread_rwlock_t`を使おうとすると、IntelliSenseに

> 識別子 "pthread_rwlock_t" が定義されていません

と怒られました。

しかし、`pthread_rwlock_t`を使う簡単なサンプルプログラムを作成してコンパイルしてみたところ、問題なくコンパイルでき実行もできました。

## 解決方法

https://github.com/microsoft/vscode-cpptools/issues/3547
このissueの内容で解決できました。ありがとうございます！

issueによると、ソースコードがあるフォルダ内の`.vscode/c_cpp_properties.json`を開いて、`"defines"`の中に`"_GNU_SOURCE"`を追加することで解決できるようです。

私の場合は以下のようになりました。

```json:.vscode/c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_GNU_SOURCE"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64",
            "compilerArgs": [
                "-pthread"
            ]
        }
    ],
    "version": 4
}
```

以上により、`pthread_rwlock_t`に出ていたエラーがなくなりました！

## 原因

この問題が起こる原因は、issueを読む感じ

* gccは標準で`gcc extensions`という拡張が有効化されている。
    * `pthread_rwlock_t`を有効化させる定数がpreprocessor defineで定義される。
* しかし、vscodeのIntelliSenseではこの拡張部分が無効化されている。
    * preprocessor defineで定数が定義されていないため、`pthread_rwlock_t`の定義をvscodeは見つけられない。

といったところのようです。そこで、C/C++プラグインの設定ファイルに、preprocessor defineに定義されている定数を追加してやることで問題を解決しているみたいです。
メソッド、クラス、オブジェクトの意味を整理

1. オブジェクト
データと命令（メソッド）が一緒になっているもの。
**データ.メソッド(引数1,引数2,･･･)**の形。

2. クラス
オブジェクトの設計図。
オブジェクトがどのような設計図を持っていて、どのような振る舞いをするのかをクラスという形にまとめたもの。

3. インスタンス
クラスから作ったオブジェクトのこと。

4. アトリビュート
インスタンスが持つ変数のようなもの。
**インスタンス.アトリビュート**のような形。

5. メソッド
データに紐付いて、データに対する処理や操作をする関数のこと。
あくまでクラス内で定義された関数などを指す。
単独で呼び出しできる関数とは違う。


参考資料
[みんなのPython 第4版](https://www.amazon.co.jp/みんなのPython-第4版-柴田-淳/dp/479738946X/ref=sr_1_1?__mk_ja_JP=カタカナ&keywords=みんなのpython&qid=1582443065&sr=8-1)
[関数とメソッドの違いとは（Pythonでわかりやすく説明）](https://gammasoft.jp/blog/difference-method-vs-function/)
【メモ】Antのmdとdata.append

Antでは、テーブル設計書Excelファイルからレコードを自動挿入することができる。

【手順】
①テーブル設計書のExcelファイルを適当なフォルダに配置する。

②build.propertiesのmd.doc.dir
に上記のパスを指定し、Antのmdを実行する。

③xlsからcsvが自動生成される。

※「入力行が長すぎます。コマンドの構文が誤っています。」というエラーになった場合、
使用しているjarファイルのパスが深すぎる可能性があるため、浅いところに変更して実行。

④操作したい対象のcsv以外は削除し、data.appendを実行。
※data.replaceは書き換える場合に使用する。
Flutter、はじめの一歩過程

Flutterでなにか作ってみようということで、Flutterはじめの一歩やってみた過程をメモ。（WIP。現在進行系）


# まず環境作る
公式にそって、インストール等やる。
https://flutter.dev/docs/get-started/install
android, ios両方の環境作る必要あり。

android studioで対応。

# チュートリアルやる
上記のインストールの流れで、チュートリアルやる。
- [Write your first Flutter app, part 1](https://flutter.dev/docs/get-started/codelab)
- [Write Your First Flutter App, part 2](https://codelabs.developers.google.com/codelabs/first-flutter-app-pt2/#0)
- [Building Beautiful UIs with Flutter](https://codelabs.developers.google.com/codelabs/flutter/index.html)

# Udacity見る
雰囲気わかった。て感じかなｗ（ちゃんとやらなかった）
- [Build Native Mobile Apps with Flutter](https://www.udacity.com/course/build-native-mobile-apps-with-flutter--ud905)

# dart書き方見る
dartは別途インストール。
下記の記事がわかりやすかった。
- [Flutter入門のためのDart入門](https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd)


# 随時書き足していく

まだ現在進行系なので、随時更新していく。


# 参考
たまたま見かけたこれも参考になりました。
- [Flutter入門 - 簡単なアプリを作ってUI宣言やホットリロードなど便利機能の使い方を理解しよう](https://employment.en-japan.com/engineerhub/entry/2019/08/06/103000)

これはたまにみておきたい。
- [Flutterでの開発をスムーズに行うためのTips集](https://medium.com/flutter-jp/tips-b2487a63a8)

- https://medium.com/flutter-jp/flutter-learning-c5640c5f05b9
- https://note.com/yasukotelin/n/nd5019597cb97

android studioで、sqliteのデータとか見るのに、これ便利最高だった。
- [[Android] Android 端末内のデータベースをPCに取り出してイジる](https://qiita.com/korin0027/items/8873d2efbe5459c20694)


# ひよっこFlutter
「ひよっこFlutter」というdiscord作ってみました。（slackではなくてdiscord）
https://discord.gg/xwrxwE
もくもく作業してるだけですが、もし良かったら入ってみてください
→招待期限が切れてますね・・・入りたい人は[twitter](https://twitter.com/mazeltov7)でDMください！
隠された文字列を表示する

先日開催されたあるワークショップで出題された問題。

あるメモリ領域にある数値をXOR（アセンブリではnot ***）すると隠されていた文字列がでてくる。（画像２のobj.flagにある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/82d2c3dc-7965-11bd-d3d3-0fb8b5cbd716.png)
[画像１]

例えば0x562c76088012の「9e」について、画像２ではraxに「9e」が入っている。
レジスタrax 0x0000009e
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/84507cb7-ba27-a9c8-1ac6-0a81c8de2884.png)
[画像２]

not eaxを実行後はraxの下位８ビットに「61」が入っている。
レジスタrax 0xffffff61 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/73e38cda-0364-f1f9-18d4-63c81581b4a1.png)
[画像３]

この後raxの値をrcxにいれて、その後cl(rcxの下位８ビット)をバッファにためて文字列を生成していく。（ここでは画像２のobj.buf）
mov byte [rdx + rax], cl

asciiコードで「61」は"a"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/6013ddff-e1c8-5340-f65c-490ead12c86f.png)
[画像４]

すべて調べるためにpythonで以下のように計算してみた。

```python
>>> hex(0x9e ^ 0xff)
'0x61'
```

これを利用して画像１のメモリの数値を変換してみると以下のようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/f4934dc3-c856-343a-b25b-deb69b5fef0a.png)
[画像５]

結果隠されていた文字列は
「flag{Hidden_Message!}」
でした。radare2大好き。

＜続き＞
ghidraでデコンパイルしてみたらすごかった。アセンブリで追った内容がサクッと数行のコードになって表示されている。

Deep ghidra decompiler integration for radare2 
https://github.com/radareorg/r2ghidra-dec

Cutter: Presenting r2ghidra Decompiler | r2con 2019
https://youtu.be/eHtMiezr7l8?t=948

インストールと使い方のデモ
https://youtu.be/eHtMiezr7l8?t=1945
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/1475c880-da63-b1ba-9b58-0e1148e2c64c.png)

追記：2021/09/28
asmの処理をpythonで記述しました。

```python3:python3
import math
sbuf = '99939e9884b7969b9b9a91a0b29a8c8c9e989ade82'
num = math.floor(len(sbuf)/2)
sret = ""
for i in range(num):
    sret += chr(~int(sbuf[i*2:(i*2+2)],16)&0xFF)
print(sret)
```
```out:out
flag{Hidden_Message!}
```
Laravelのslot機能を使ってボタンの文言を変えて使い回す！

こんにちは、フロントエンドエンジニアの[てりー](https://twitter.com/teriteri_code)です。
僕の詳しいプロフィールは[こちら](https://terrblog.com/about/)

# はじめに
 Laravelのbladeでhtmlのコーディングを行っていると、「Vueのコンポーネントの様に中身だけ変えて使い回したい！って場面が多々出てくると思います。

そんな時にLaravelに元々あったsectionとは別にslotという機能がめちゃくちゃ感覚的に使えて良かったので説明していきます。

# slot機能とは
まず、プロダクトの中で使い回すパーツをコンポーネントと呼びます。
例えば、こんな感じのボタンですかね。

![スクリーンショット 2020-02-23 16.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397606/de629d8b-7fe5-9f64-261a-88cf88483042.png)


これをslot機能を使う事で、中の文言だけ変えて色々なところで使い回していきます。

# slotの使い方

##コンポーネント作成
まずコンポーネントを作っていきます。

変えていきたい部分を ``{{$slot}}`` としておきます。


```php:views/button.blade.php

<button class="Button -fill -blue" type="button">
    <span class="Button__inner">
        <span class="Button__text">
            {{$slot}}
        </span>
    </span>
</button>
```

ちなみにボタンのscssはこんな感じですでに定義しています。

```scss:views/button.scss

.Button {
    @at-root {
        & {
            display: inline-flex;
            border: 0;
            border-radius: 3px;
            background-color:#ffffff;
            color: black;
            font-size: 14px;
            text-decoration: none;
            vertical-align: middle;
      
            &:hover {
                opacity: 0.8;
            }

            &.-fill {
                background: linear-gradient(to bottom, #fefefe 0%, #f3f5f7 100%);

                &.-blue {
                    background: linear-gradient(180deg, #1E4A91 0%, #193E79 100%);
                    color: $white;
                }

                &.-red {
                    background: linear-gradient(180deg, #F85359 0%, #DC151D 100%);
                    color: $white;
                }
            }

        .Button__inner {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 100%;
            min-height: 32px;
            padding: 4px 15px;
            border: 1px solid $border-color;
            border-radius: 3px;
        }

        .Button__text {
            flex: 0 1 auto;
        }
    }
}
```
これにてボタンのコンポーネントはできました。

## コンポーネントを呼び出す
先ほど作ったコンポーネントを呼び出していきます。

```php:top.blade.php
@component('button')
    確認画面
@endcomponent
```

この様に``('button')``の部分にコンポーネント名。
 ``@component``と``@endconponent``の間に``{{$slot}}``に入れたい文言を書きます。

# ボタンを使い回す！
今後ボタンを使うときは、先ほどやった様に文言を指定して呼び出してあげるだけで簡単にできます。
``top.blade.php``のみをいじる事で様々な文言のボタンを出してみましょう。

![スクリーンショット 2020-02-23 16.51.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397606/79800363-7f38-7ef1-858a-02150bd1b48e.png)

```php:top.blade.php
<div class="Button_group">
  @component('button')
    下書きを削除
  @endcomponent
  @component('button')
    下書きの保存して一覧の戻る
  @endcomponent
  @component('button')
    確認画面
  @endcomponent
</div>

<style>
.Button_group{
display:flex;
}
</style>
```

こんな感じで簡単に文言違いのボタンを複製できますね。
slotを使う事で、``@include``だけでは実践できなかった、ちょっとした変更ができる様になります。
imutilsの使い方

## imutilsとは？

## どんな人向けか
face detectionを行う人とか。ハードコーディングっぽく見えなくなるのが良い。
例えば、imutilsを使わなければ、

```python:
point_idxs = [
     1,  # right ear 
     3,  # right cheak1 
     4,  # right cheak2 
     33,  # nose top 
     12,  # left cheak1
     13,  # left cheak2 
     15,  # left ear 
     28,  # nose line 
 ] 
warp_points = [0, 2, 4, 6] 
```

としていたものを、

```python:
from imutil import face_util
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
```
とできるし、

```python:
shape = predictor(gray, rects[0])
shape = face_utils.shape_to_np(shape)
```
とできてしまう。

```python:
frame = imutils.resize(frame, width=450)
```

ただ、余計なライブラリが増えるというデメリットがある。
Sonic Pi コードの鳴らし方

注意：この記事は書きかけです。

## コードを鳴らす
### リスト型

和音を鳴らす方法として、リスト型を使う方法がある。
`[]`で音を複数指定して、`play`で同時に鳴らす。

```ruby
play [52,56,59] # Eメジャー
```

### chord関数
リスト型で全ての音を指定するのは大変なので、`chord()`を使うと楽に和音を鳴らせる。

```ruby
play chord(:E3, :maj) # Eメジャー
```

これは`play [52,56,59]`と同じ

## アルペジオ play_pattern_timed

play_pattern_timed を使うとコードをアルペジオ演奏できる。

使い方は、play_pattern_timed コード, 長さ

```ruby
# Cメジャーを0.25の長さで３音までアルペジオ再生
play_pattern_timed chord(:C4, :major), 0.25
```

長さをリスト型で渡すこともできる

```ruby
play_pattern_timed chord(:C4, :major), [0.25, 1]
play_pattern_timed chord(:C4, :major), [0.25, 0.5, 0.25]
```

## scale

scaleとは音階のこと


```ruby
play_pattern_timed scale(:C4, :major), 0.5
```


https://www.rubydoc.info/github/samaaron/sonic-pi/SonicPi/Scale

## 感想
Rubyの書き方も知っておかないとSonic Piを使いこなすのは難しい

## 備考

https://sonic-pi.mehackit.org/exercises/ja/09-keys-chords-and-scales/01-piano.html
JavaScriptでブレークポイントを張る方法【Chrome】

#debuggerを埋める
以下のような感じ

```js
    const sampleFnc = () => {
      const a = "a";
      debugger;
    };
```

Chromeの開発者コンソールを開いてプログラムを実行すると、勝手にdebuggerの部分で止まってくれます
aliasを使う

jupyter labの設定などを、generate configしてやってもよいのだが、docker コンテナなどでは立てる度に行う必要がありめんどくさい。
よってエイリアスに設定したほうが良い。

```bash:.bashrc
alias jl='Jupiter lab --port=8999 --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token=""'
```

その後、`source ~/.bashrc`で再読み込みしたら終わり。
SQL:文字列操作


LEFT(date, 10)  左から10文字とる

```sql
SELECT incidnt_num,
       date,
       LEFT(date, 10) AS cleaned_date,
       RIGHT(date, LENGTH(date) - 11) AS cleaned_time
  FROM tutorial.sf_crime_incidents_2014_01
```


TRIM(both '()' FROM date) 両側からカッコを取る

```sql
SELECT location,
       TRIM(both '()' FROM location)
  FROM tutorial.sf_crime_incidents_2014_01
```

STRPOS(descript, 'A') Aの位置を知る

```sql
SELECT incidnt_num,
       descript,
       STRPOS(descript, 'A') AS a_position
  FROM tutorial.sf_crime_incidents_2014_01
```


SUBSTR(date, 4, 2) 4文字目から2文字を取る

```sql
SELECT incidnt_num,
       date,
       SUBSTR(date, 4, 2) AS day
  FROM tutorial.sf_crime_incidents_2014_01
```


CONCAT (L_NAME, ' ', F_NAME) 何かで挟んでくっつける

```sql
SELECT incidnt_num,
       day_of_week,
       LEFT(date, 10) AS cleaned_date,
       CONCAT(day_of_week, ', ', LEFT(date, 10)) AS day_and_date
  FROM tutorial.sf_crime_incidents_2014_01
```
matplotlibマスター


### 参考資料
https://matplotlib.org/3.1.0/users/dflt_style_changes.html

### GridSpecを使って大きさの違う図を１つの図に入れる
```python

import numpy as np

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec

figure = plt.figure(dpi=200)#figsize=(10,48))
gs_master = GridSpec(nrows=3, ncols=2, height_ratios=[1, 1, 1],
                     width_ratios=[1,1],  hspace=0.3)

gs_1 = GridSpecFromSubplotSpec(nrows=2, ncols=1, subplot_spec=gs_master[:2,  0])
axes_1 = figure.add_subplot(gs_1[:, :])
axes_1.plot(range(100), range(100), color='red')

gs_1 = GridSpecFromSubplotSpec(nrows=1, ncols=1, subplot_spec=gs_master[0, 1])
axes_1 = figure.add_subplot(gs_1[:, :])
axes_1.plot(range(100), range(100), color='blue')

gs_1 = GridSpecFromSubplotSpec(nrows=1, ncols=1, subplot_spec=gs_master[1, 1])
axes_1 = figure.add_subplot(gs_1[:, :])
axes_1.plot(range(100), range(100), color='yellow')

gs_1 = GridSpecFromSubplotSpec(nrows=1, ncols=2, subplot_spec=gs_master[2, :])
axes_1 = figure.add_subplot(gs_1[:, :])
axes_1.plot(range(100), range(100), color='green')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295781/21af34dc-d9a6-2ae4-4eba-b2ce0ce9e753.png)

### 全体のタイトル
plt.suptitle()で付けられます。

### 一部に色を塗りたい
```
plt.axvspan(30, 45, color = "coral", zorder=-1, alpha=0.5)
```
など。

### 色について
https://matplotlib.org/examples/color/colormaps_reference.html

### 順番に重ねたい
引数にzorderを加えます。これが大きいほど後から上にプロットされます。

### 垂直・水平線を書く
```
plt.axvline()
plt.axhline()
```

### 色を指定する。

![named_colors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295781/fd0e9ab3-dba0-28a0-3cff-c321a3fb74f6.png)
[公式](https://matplotlib.org/examples/color/named_colors.html)サイトより。

```python:
color = 'black'
```
として指定することで使うことが出来ます。

また、以下の主要な色は一文字で指定できます。

| b | 青 (Blue) |
|:--|:--|
| g | 緑 (Green) |
| r | 赤 (Red) |
| c | シアン (Cyan) |
| m | マゼンタ (Magenta) |
| y | 黄 (Yellow) |
| k | 黒 (Black) |
| w | 白 (White) |

### エラーバー付きでプロット
```python:
y = data.mean(axis= ? )
y_err = data.std(axis= ? )

plt.fill_between(x, y - y_err, y + y_err, facecolor='lightblue', alpha=0.5,
plt.plot(x, y, color='b')
```

<img width="859" alt="スクリーンショット 2019-10-11 17.10.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295781/d88c5c77-bdd1-6ba0-197c-34fa4498487d.png">


色合いは、

| color | ecolor |
|:--|:--|
| g | mediumseagreen |
| r | lightcoral |
| b | lightblue |

などの組み合わせが良さそうです。

### 軸を消す

#### 消したい軸目盛りラベルの位置=Falseで消える。
```python:
plt.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False)
```

#### 消したい軸目盛り線の位置=Falseで消える。
```python:
plt.tick_params(bottom=False,
                left=False,
                right=False,
                top=False)
```


参考文献
[matplotlib で指定可能な色の名前と一覧](https://pythondatascience.plavox.info/matplotlib/色の名前)
GitHub Packagesに公開したDockerイメージをpullする

GitHub ActionsとGitHub PackagesでDockerのイメージを作ってpushしたので、いざpullして使おうとしたら以下のようなエラーが…

```bash
Error response from daemon: Get https://docker.pkg.github.com/v2/freeesia/vivideo/server/manifests/latest: no basic auth credentials
```

publicリポジトリなのに認証が必要…？と思って調べたら、どうも今はpublicリポジトリのイメージであれ認証が必要なようです。
https://github.community/t5/GitHub-Actions/docker-pull-from-public-GitHub-Package-Registry-fail-with-quot/td-p/32782

認証のためにはまず[Personal access tokens](https://github.com/settings/tokens)からトークンを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141849/f585a6dc-eca1-c190-ca5b-a7621be08477.png)
必要な権限はパッケージを取得するだけなので、`read:packages`にチェックを入れて生成します。


あとはイメージを起動するマシンで`docker login`します

```bash
docker login -u <GitHubのユーザー名> -p <上記で生成したトークン> docker.pkg.github.com
```

以上で無事pullできるようになりました。
RANGE関数をさらに拡張し組込む


[RANGE関数を拡張する。](https://qiita.com/matumoto_onga/items/80268c4f67d29e14d3c3)の構文を拡張して、
[Excelで関数型プログラミングに目覚めたかもしれない。(M言語編)](https://qiita.com/matumoto_onga/items/5a3df8d306fe7393ebb7)のM言語関数
- Table.SelectColumns
- Table.Combine
の機能を QL_INITに組込みました。


```vb
Function QL_INIT(M, Optional N = 1, Optional L1 = 1, Optional L2 = 1, Optional MODE = 0, Optional S = "")
    On Error Resume Next
    If TR_(M) Then
        S = M
        S = QL_INIT(S, N, L1, L2)

    ElseIf TV_(M) Then
        S = QL_INIT(UBound(M, 1), N, L1, L2)

        For I = 1 To UBound(M, 1)
            For J = 1 To UBound(M, 2)
                If MODE = 1 And IsNumeric(M(I, J)) Then M(I, J) = Val(M(I, J))
                S(I, J) = M(I, J)
            Next J
        Next I

    ElseIf TS_(M) Then
        If InStr(M, "[") > 0 And InStr(M, "]") = Len(M) Then
            A = A_(Left(M, Len(M) - 1), "[")
            B = A_(A(1), ",")
            A = A_(A(0), "+")

            N1 = UBound(B) + 1
            M1 = 0

            ReDim K(UBound(A))

            For L = 0 To UBound(A)
                K(L) = Range(A(L)).Rows.Count
                M1 = M1 + K(L)
            Next L

            ReDim S(0 To M1, 1 To N1)

            For J = 1 To N1
                S(0, J) = B(J - 1)
                D = 0
                For L = O To UBound(A)
                    R = ""
                    Set R = Range(CC(A(L), "[", B(J - 1), "]"))
                    For I = 1 To K(L)
                        S(D + I, J) = DI(R, I)
                    Next I
                    D = D + K(L)
                Next L
            Next J

        ElseIf InStr(M, ",") = 0 Then
            S = QL_INIT(AT_(M), N, L1, L2, MODE)
        
        Else
            T = A_(M, ","): N1 = UBound(T) + 1
            U = A_(T(0), " "): M1 = UBound(U) + 1
            S = QL_INIT(M1, N1)

            For J = 0 To N1
                U = A_(T(J), " ")
                For I = 0 To M1
                    S(I + 1, J + 1) = U(I)
                Next I
            Next J
            S = QL_INIT(S, N, L1, 1, MODE)
            
        End If
    ElseIf TS_(N) Then
        T = A_(N, ","): N = UBound(T) + 1
        S = QL_INIT(M, N, 0, 1)
        For J = 1 To N: S(0, J) = T(J - 1): Next J    ' タイトル

    Else
        ReDim S(L1 To M, L2 To N)
        For J = L2 To N: For I = L1 To M: S(I, J) = "": Next I: Next J ' 初期化
    End If

    QL_INIT = S
End Function

Function A_(V, Optional D = " ")
    A_ = Split(TRIM_(V), D)
End Function

Function AT_(V, Optional D = "　")
    AT_ = WorksheetFunction.Transpose(A_(V,D))
End Function
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184069/f948971a-f554-2f6b-6bac-d1847ca7357a.png)
XcodeGenでSwift Package Managerの依存関係を設定する


下記のドキュメントを参考にしました。
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#swift-package

# 環境
Xcode: 11.3
XcodeGen: 2.13.1

# XcodeGenとは
Xcodeでのプロジェクトファイルをyamlファイルから生成するものです。
githubリポジトリはこちら
https://github.com/yonaskolb/XcodeGen

# サンプルコード
```project.yml
name: TestApp
packages:
  HogePackage:
    url: https://github.com/~~~
    version: x.x.x

targets:
  TestApp:
    dependencies:
      - package: HogePackage
```

依存パッケージをpackagesで宣言して、利用するtargetで依存関係を定義するということですね。
AWS RDS Auroraのデータを復元する方法

#なぜこの記事を書いているのか？

- データベースのメンテナンスをしていたら、データベースの復元手順をメモったりしていないことに気づく。
- データをすっ飛ばしたりした場合に、これではまずいなと思い整理してみることに。
- 万一の時にササッと対応できるよう、簡潔にメモしておきたい。
- 備えあれば憂いなし。

# 前提条件（環境）
下記の環境で作業を行うことを前提とした場合の手順です。

- 対象DBサーバ
 - AWS RDS `MySQL Aurora 5.7.mysql_aurora.2.07.1`

```
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.12    |
+-----------+
``` 

- 作業クライアント
  - `macOS Catalina 10.15.3`
  - 対象DBサーバにアクセスできるクライアントであることが前提です。
  - AWSのセキュリティグループのインバウンドルールで自分のIPアドレスを許可してアクセスできる状態にしておいてください。

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.3
BuildVersion:   19D76
```

# 想定シナリオ
  - mysqldumpを取得していない。（バックアップ運用計画をたてておきましょう）
  - なのにSQLのクエリをミスって必要なデータを削除してしまった。
  - わかっている人が一人しかいない。
  - その人がコロナウィルスに感染し、対応不能。
↑こういうことにならないように備えましょう。

# データが消えました！
まずは落ち着こう。
## ユーザ名とパスワードを確認
- DBサーバにアクセスするにあたって必要です。
- 1-PasswordやPassword Gorilla、社内ドキュメントを探しましょう。
- 見つからない場合は、唯一の担当者に連絡するなどして確認しましょう。
↑こういうことにならないように備えましょう。

## AWSコンソール上での作業
- AWSコンソールからRDS -> スナップショット -> システムの順に進み、お目当てのスナップショットを選択
- 右上の「アクション」プルダウンから「スナップショットの復元」を選択
- DBエンジン: `Aurora MySQL`
- DBエンジンのバージョン: `Aurora(MySQL 5.7)2.07.1(default)`
- DBインスタンスのクラス: 復元作業が目的なので、お安い`db.t3.small - 2 vVPU, 2GiB RAM`
- DBインスタンス識別子: 何でも良いです。ただし本番稼働しているホストと似たような名前は避ける。**作業対象を間違えないように。**
- Virtual Private Cloud (VPC): 確実にアクセスできるネットワーク環境を選択。わからなければ本番環境を参考に。
- サブネットグループ：確実にアクセスできるネットワーク環境を選択。わからなければ本番環境を参考に。
- パブリックアクセシビリティ: はい
- アベイラビリティーゾーン: 確実にアクセスできるAZを選択。わからなければ本番環境を参考に。
- データベースのポート：3306
- DBパラメータグループ:わからなければ本番環境を参考に。
- DBクラスタのパラメータグループ: わからなければ本番環境を参考に。
- タグをスナップショットへコピー: チェックなし
- バックトラックを無効にする
- マスターキー: わからなければ本番環境を参考に。
- ログのエクスポート：復元作業が目的なので不要
- マイナーバージョン自動アップグレード: いいえ
-「DBインスタンスの復元」ボタンをクリック
- AWSコンソール左側のメニューから「データベース」をクリック
- スナップショットから復元したインスタンスのステータスが「利用可能」になるのを待つ
- 利用可能になったら、`復元したインスタンス`のDB識別子をクリック
- 「エンドポイント」の**ホスト名を控える**
- `データを復元したいインスタンス(データを削除してしまったインスタンス)`のDB識別子をクリック
- 「エンドポイント」の**ホスト名を控える**

## ターミナル上での作業
- `スナップショットから復元したインスタンス`上に残っているデータを下記のコマンドでdumpします
- この記事では作業用クライアントがmacOSという想定ですので、「ターミナル」を起動し下記のコマンドを入力してください。
  - `hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com` は先程のステップで控えた`スナップショットから復元したインスタンスのホスト名`に置き換えてください。
  - `admin`の部分は最初に確認したユーザ名に置き換えてください。
  - `database_name` は`復元したいデータベース名`に置き換えてください。

```
$ mysqldump --skip-column-statistics --set-gtid-purged=OFF -h hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com -u admin -p database_name > ./dump.sql
Enter password:
```
- 上記のコマンドを実行し、パスワードを入力するとカレントディレクトリにdump.sqlが出力されます。
- このダンプファイルを`データを復元したいインスタンス(データを削除してしまったインスタンス)`にインポートするために下記のコマンドを実行します。
  - `hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com` は先程のステップで控えた`スナップショットから復元したインスタンスのホスト名`に置き換えてください。
  - `admin`の部分は最初に確認したユーザ名に置き換えてください。
  - `database_name` は`復元したいデータベース名`に置き換えてください。

```
$ mysql -h hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com -u admin -p database_name < ./dump.sql
Enter password: 
```

# データが復元したことを確認
- あくまでスナップショットの時点のデータです。
- 復元できていないのは、どのデータなのかを把握する。
- 復元できないことによって、誰にどのような影響が出ているのかを整理する。
- 然るべき人に報告を入れる。

# 後片付け
- スナップショットから復元したインスタンスは削除しましょう。忘れるとどんどん課金されます。
- 何がまずかったのかをしっかり振り返り、必要な情報を整理し、今回のトラブルを次に活かしましょう。
Github投稿 Push

#1. git init 取り消し
```
$ rm -rf .git
```
#2. Gitリポジトリの作成

```
$ git init
```
#3. リポジトリへの登録

```
$ git add .
```
#4. コミット

```
 $ git commit -m "first commit"
```
#5. リモートリポジトリの登録

```
 $ git remote add origin <URLアドレス>
```
#5. リモートリポジトリの確認

```
 $ git remote -v
```
#6. リモートリポジトリに反映

```
 $ git push origin master
```
git lfsを含んだリポジトリを移行する

git lfsで管理されたファイルがある場合、以下のように普通にリモートを足してpushするだけではgit lfs管理下のファイルは移行先にpushされません。

```bash
git remote add new https://hogehoge/path/to/repo
git push -uf new master
```

移行元のサーバーからすべてのファイルを取得して、移行先のサーバーへpushする必要もあります。

```bash
git lfs fetch origin --all
git lfs push new --all
```

### 参考リンク
* https://help.github.com/ja/enterprise/2.19/admin/installation/migrating-to-a-different-git-large-file-storage-server
CSSでマウスポインタ（カーソル）の形を変えてみる

# はじめに
Webアプリケーションでは、clickなどのユーザーのアクションを要求する事が多くなります。
その際に時々見かけるのが、どこをclickすれば良いのか分からない画面です。

考えられる対応策はいろいろありますが、個人的に簡単で効果が高いものは、*アイコン*と*マウスポインタの形状変更*だとおもっています。

そして、マウスポインタの形状はcssで変更が可能です。
ここではマウスポインタの形状変更の方法をまとめます。

＊なお、アイコンはこちらなどを使用すれば良いかと思います。
https://fontawesome.com/

# 方法
CSSの`cursor`を使用します。

## cursorとは
マウスポインタが要素の上にある時に表示されるカーソルの形状を設定するstyleプロパティです。

## どんな形があるの？
こちらを参照してください。
https://developer.mozilla.org/ja/docs/Web/CSS/cursor#Syntax

個人的に良く使用しているものはこちらです。

| 値 | 内容 |
|:------|:----|
| pointer | リンクの時に表示される矢印です。<br>私はA要素以外でclickで実行になる箇所に設置します。 |
| help | ヘルプが使える事を示します。<br>私はヘルプ表示の箇所に設置します。 |
| not-allowed | 操作できない事を示すカーソルになります。<br>私は未入力で実行できない時に、`disabled`と併用する事があります。 |


## コード例

```css
.sum {
  cursor: pointer
}
```
```HTML
<p class="sum">合計値を出す</p>
```

＊ class意外にも`disabled`などをセレクタにすると、UIフレームワークで扱いやすいと思います。

## サンプル
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="H_Naito" data-slug-hash="LYVbMeL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Cursor sample">
  <span>See the Pen <a href="https://codepen.io/H_Naito/pen/LYVbMeL">
  Cursor sample</a> by H.N (<a href="https://codepen.io/H_Naito">@H_Naito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 注意すること
使い方自体はかんたんですが、使う場所とタイミングが大事かと思います。
例えばですが、helpでもない部分に`help`があったり、clickできる状態なのに`not-allowed`のままだと、エンドユーザーが混乱します。
うまく使い分けることで、使いやすい画面を作る事が出来ると思います。

# 参考資料
CSS cursor プロパティ
https://developer.mozilla.org/ja/docs/Web/CSS/cursor
「ヤジが飛んでくるマインクラフト」DeepLearningで適当テキスト生成 ~全体の流れ~

DeepLearningの力を借りて、マイクラのプレイ中、ゲームに関係のある文章を読み上げてくれるソフトを作った話。

↓こんなやつ
![でもミニ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358231/9fa597d6-abc1-58df-4007-82037b68318d.gif)

[実際に遊んでいる動画](https://youtu.be/xseWajIDe4M?t=55)

1つの記事にまとめるのが困難なため、いくつかの記事に分けます。
具体的な内容について書いた記事は待ってください。

この記事では、<font color=red>**全体の流れ**</font>を説明します。

## 動機
1人でマインクラフトをしていたある日......
「自然言語処理 × DeepLearning で面白いものはないか」
「1人でゲームするのも飽きてきたな」
「**そうだ、ゲーム中AIが話せば、ボッチマイクラも寂しくないぞ！！**」

# やったこと
マイクラなら、ゲーム内の情報が取れる。
ゲーム内にいるモンスター等に関連した文章を持ってくれば良さそう。

### [データを集める](https://qiita.com/eteeeeeerminal/items/0c7d737da264bd61d0ff)
1. とりあえず、スクレイピング　←　微妙な結果に
1. [ニコニココメントデータセット](https://nico-opendata.jp/ja/index.html)　←　量十分、目的にも合ってる

### [DeepLearningする](https://qiita.com/eteeeeeerminal/items/3c3ea279999724aa37d3)
1. 脳死でBERTをぶん回す([素晴らしいライブラリ](https://github.com/huggingface/transformers))。
1. いい感じに、文章のベクトル表現が得られる。
1. ゲーム内オブジェクトの名前のベクトルと、集めたテキストデータのベクトルでcos類似度を計算。
1. ゲーム内オブジェクトに関連してそうな文を取り出す。
1. おまけにテキスト生成も試す。

### [マイクラmodで動かす](https://qiita.com/eteeeeeerminal/items/7ac8a15bba73383783ce)
1. マイクラmodで近くにいるオブジェクトの名前を取得。
1. 取得した名前を、テキストを検索・生成するクラスに渡す。
1. 生成にはdeep learning を使いたい。socket 通信で python に情報を渡す。([mcpiを改造](https://github.com/eteeeeeerminal/mcpi))

# 分かったこと
文脈なんてなくても割と面白い。
頓珍漢な文章も、ツッコミしたくなるので面白い。
**面白いかどうかに、文章や文脈の正しさは、必須ではない。**

# さいごに
ヤジが飛んでくるマインクラフトでは、極力人力でデータをいじらないようにしました。
これは、対応してほしいオブジェクトを後から増やしやすいようにするためです。
もっというと、ネット上のテキストが豊富で、modが作成できるゲームであれば、マイクラでなくても出来ます。

ヤジが飛んでくるマインクラフトが、自然言語処理の気軽な応用例の1つになれば良いなと思います。

**みんなも、自然言語処理で面白いソフト作ろうぜ！！**
atcorder 緑を目指す

#◉ ABC148 E - Double Factorial(数学の問題)
**むやみに全探索しないで、因数から答えを導き出す！**
https://atcoder.jp/contests/abc148/tasks/abc148_e
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b540d1d8-589d-1970-145d-37a10b289452.png)

```ABC148E.py
N=int(input())

#Nが奇数の時は末尾に０はない（因数に２をもたないから）
if N%2!=0:
    print(0)
    exit()
    

#Nまでの数を書き出して、いつ5の因数を持つか実験して法則性をつかめばいい
#この時i=5にしないこと！（Nから2つとびで減ってるため！）
ans=0
i=10
while(i<=N):
    ans+=N//i
    i*=5
print(ans)
```

#◉ ABC151 D - Maze Master（幅優先探索の問題）
https://atcoder.jp/contests/abc151/tasks/abc151_d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/0a69c991-5db4-03d1-4c53-23989616f362.png)

```ABC151D.c++
#include<bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
typedef long long ll;
const int dx[4] = { 0, -1, 1, 0 };
const int dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
using namespace std;
using pii = pair<int, int>;

int main() {
	int h, w; cin >> h >> w;//縦ｈマス、横ｗマス
	int d[21][21];//INF用配列
	char s[21][21];//入力用配列（ex #,・）
	REP(i, h) REP(j, w) cin >> s[i][j];
	
	int ans = 0;
	REP(i, h) {
		REP(j, w) {
			if (s[i][j] == '#')continue;
			REP(k, 21) REP(l, 21) d[k][l] = INF;//INF用配列を初期化！
			queue<pii>Q;
			Q.push({ i,j });//全探索開始！
			d[i][j] = 0;//スタート地点を必ず０にする！
			while (!Q.empty()) {
				int y = Q.front().first;
				int x = Q.front().second;
				Q.pop();
				for (int k = 0; k < 4; ++k) {
					int ny = y + dy[k];//const int dy[4] = { -1, 0, 0, 1 };
					int nx = x + dx[k];//const int dx[4] = { 0, -1, 1, 0 };
					if (0 <= ny && ny < h && 0 <= nx && nx < w && s[ny][nx] == '.' && d[ny][nx] == INF) {
						Q.push({ ny,nx });
						d[ny][nx] = d[y][x] + 1;
					}
				}
			}
			REP(k, h) {
				REP(l, w) {
					if (d[k][l] == INF)continue;
					if (s[k][l] == '#')continue;
					ans = max(ans, d[k][l]);
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}
```

#◉ ABC156 D - Bouquet(数学の問題)
https://atcoder.jp/contests/abc156/tasks/abc156_d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/1ad555b0-fb35-10be-14d5-44bc8fb45b7f.png)

```ABC156D.py
def modinv(a, mod=10**9+7):
    return pow(a, mod-2, mod)
def combination(n, r, mod=10**9+7):
    r = min(r, n-r)
    res = 1
    for i in range(r):
        res = res * (n - i) * modinv(i+1, mod) % mod
    return res
 
N,A,B = map(int,input().split())
if (N == 2):
    print(0)
else:
    print((2**N - 1 - combination(N, A) - combination(N, B)) % (10**9+7))
```
基本情報技術者試験を受けた感想

#試験結果
令和元年秋期の基本情報技術者試験を受けて合格しました
得点は午前・午後試験ともに**80～90%**くらいの得点率だったと思います
試験を受けた感想や、やってよかったことをメモしておきます
*(この記事は、Qiitaに投稿する経験を積むために書いているので、乱文・雑文かつ適当です、ご了承ください)*

#試験を受けた感想
正直、あまり勉強せずに受けたので合格したらラッキーだと考えていました
ですが、試験を受けてみると、意外と合格しやすい試験なんだなと感じました

試験を受けるにあたって購入した参考書が辞書のような分厚さをしていましたので、これは厳しい試験になるなと感じていました
しかし、午前試験は消去法を使えば中途半端な知識でも正解できますし、午後試験は日本語さえ分かれば解ける問題が結構あります

#おすすめの勉強法
①参考書を買ってただただ読む
②過去問をたくさん解く

これを①→②の順番で行い。ある程度知識がついてからは、平行してやる。という感じがいいと思いますし、この方法で自分は合格しました

##コツ
①の勉強法では
　・最初は自分の興味のない部分やめんどくさい部分は読み飛ばす
　・一つの参考書だけでなく、いくつかの参考書で同じ内容を勉強すると、より頭に入ってくる
　・すべて覚えたり理解しなくても合格できるので、あんまり重要そうでない部分は鼻から捨てる
②の勉強法では
　・[基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)がスーパー便利
　・古い問題はやる必要0
　・午前問題はとにかく数をこなす(できるだけね、そんなに頑張らなくても合格できます)
　・午後問題は、本番で文章の量に圧倒されないように耐性をつけておく(午前の知識と、あとは日本語力と若干の数学的な知識があれば解けますので、最悪問題解かなくてもいいと思います)

#おわりに
Qiitaに投稿したかっただけなので適当な文章でごめんなさい
基本情報は絶対、思ったよりも簡単な試験なので、とりあえず勉強してなくても受けに行くのが、合格するために一番重要なことかと思われます
ありがとうございました
Go ログ出力&ローテーション


Go言語のログ用パッケージ__[logrus](https://github.com/sirupsen/logrus)__と__[lumberjack]([lumberjack](https://github.com/natefinch/lumberjack))__の利用方法についてまとめる。(N番煎じ記事)

## インストール

```shell
$ go get github.com/sirupsen/logrus	// logrus
$ go get gopkg.in/natefinch/lumberjack.v2 // lumberjack
```

## インポート

```go
import (
  log "github.com/sirupsen/logrus"
  "gopkg.in/natefinch/lumberjack.v2"
)
```



## ログ出力フォーマットの指定

#### JSON

```go
log.SetFormatter(&log.JSONFormatter{})
```

#### 標準TXT

```go
log.SetFormatter(&log.TextFormatter{}) 
```

## ログレベル指定

セットしたレベル以上のログを出力する。

```go
// Warningレベル以上
log.SetLevel(log.WarnLevel)
```

### ログレベル別出力

```go
log.Trace("Something very low level.")
log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
log.Fatal("Bye.")
log.Panic("I'm bailing.")
```

## 出力情報
* 呼び出し元情報

  ```go
  log.SetReportCaller(true)
  ```

* 変数の埋め込み

  ```go
  log.WithFields(log.Fields{
      "animal": "walrus",
      "size":   10,
    }).Info("A group of walrus emerges from the ocean")
  ```
  
* 共通的に使用する変数の埋め込み

    ```go
    contextLogger := log.WithFields(log.Fields{
        "common": "this is a common field",
        "other": "I also should be logged always",
    })
    
    contextLogger.Info("I'll be logged with common and other field")
    contextLogger.Info("Me too")
    ```
## 出力先の指定
### 標準出力
```go
 log.Out = os.Stdout
```
### ファイル出力
```go
import (
        "os"
        log "github.com/sirupsen/logrus"
)
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
        log.Out = file
} else {
        log.Info("Failed to log to file, using default stderr")
}
```
## ログローテーション

```go
log.SetOutput(&lumberjack.Logger{
          Filename:  "log/app.log",	// ファイル名
          MaxSize:    500, 			// ローテーションするファイルサイズ(megabytes)
    	  MaxBackups: 3,			// 保持する古いログの最大ファイル数
          MaxAge:    365,		    // 古いログを保持する日数
          LocalTime: true,			// バックアップファイルの時刻フォーマットをサーバローカル時間指定
          Compress:  true,		    // ローテーションされたファイルのgzip圧縮
})
```
Vue.jsのリアクティブシステムについて

##Vueインスタンス
- 二つ作れる
- けど、なるべく引く数のインスタンスは使わない方がいい(分かりにくくなるから）


##### 後から追加したプロパティはリアクティブにはならない

```index.html
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>

<div id="app1">
<p>{{message}}</p>
<p>{{name}}</p>
<button @click="message = 'ボタンから変更'">ボタン</button>
</div>

```

```main.js
var vm = new Vue({
	el:'#app1',
  data:{
		message:'メッセージ1'
	}
})

vm.message = '変えました'
// これはリアクティブにはならない(かけなくはないが)
vm.name= '名前'
```
そもそもインスタンスにmessageはあるので

```
@click="message"
```
は変わるけど、インスタンス内になく、外から追加した
```name
```
は変わらない、ということです


リアクティブにしたいものはインスタンスのdata内に置いておきましょう、ということです


##### なぜかというと、
- インスタンスないでリアクティブシステムが実行されてる
- Vue.jsは、インスタンスが作成された瞬間に全てのプロパティそれぞれに、getterとsetterを用意します。(watcher)


###### getter
 その変数が参照された時に実行される

###### setter
messageが書き換わった時に関数を実行

###### watcher
- setterをトリガーに何かの関数を実行したい
- データを再描画させるとか
javascript(node.js)のクエリーストリング(qs)を解説

#querystringとは
javascript(node.js)では、フォーム等から受け取ったデータは実はそのままでは使えません。クライアントからは、クエリーテキストと呼ばれる形式で送られてくるので、それをエンコードしておかないといけないのです。

それを行っているのが、qsオブジェクトの「parse」です。qs.parse(string）により、受け取ったデータ(string)をエンコードし、それぞれのパラメーターの値を整理したオブジェクトに変換してくれます。後は、このオブジェクトから必須な値を取り出して利用するだけです。
【AWS SAA試験】S3ストレージクラスの選定が難しいので纏めてみた



|ストレージクラス|即時性|頻度|コスト|冗長|備考|
|---         |---  |---|---|---|---|
|Standard    |即時  |高 |高  |3AZ以上|
|Standard IA |即時  |低 ||3AZ以上|IA=Infrequent Access(アクセス頻度が低い)
|One Zone IA |即時  |低 |    |1AZ以上|One Zone = AZが１つのみ
|Glacier(迅速取り出し)|1~5分  |低 |    |3AZ以上|迅速とは言っても５分
|Glacier(標準)|3~4時間|低 |    |3AZ以上|
|Glacier Deep Archive|12時間|低 |安|3AZ以上|



参考サイト
https://techblog.forgevision.com/entry/2019/02/27/094449