OmniAICreator/Qiita-1.07M huggingface dataset:
Git覚え書き

# Gitチュートリアル

# 準備

```bash
apt-get update
apt-get install -y git
apt-get install -y vim
```

# 設定

```bash
git config --global user.name "Shoichiro Kanno"       # 名前(必須)
git config --global user.email "s-kanno@example.com"  # メールアドレス(必須)
git config --global color.ui true                     # カラー表示(任意)
git config --global core.editor vim                   # デフォルトで使用するエディタをVIMに設定
git config -l                                         # 設定内容確認
git config --global --unset {key}                     # 設定項目の削除
git config --global credential.helper 'store --file ~/.git_credentials' # 認証情報を記憶

# 2021年8月13日以降、GitHubのリポジトリにアクセスするには、ユーザ名とパスワードではなくアクセストークンが必要になった。
git clone https://{アクセストークン}@github.com/{ユーザ名}/{リポジトリ名}.git
```

# 基本的な使い方

```bash
git init             # 初期化
git add hogehoge.txt # 特定のファイル・変更を追加
git add .            # すべてのファイル・変更を追加
git rm hogehoge.txt  # ファイル削除
git mv hogehoge.txt foofoo.txt # ファイル移動
git commit           # コミット
git commit --amend   # 直前のコミットの変更を変更する
git log              # 履歴表示
git log --oneline    # 履歴表示(1行表示)
git log -p           # 履歴表示(変更箇所付き)
git log --stat       # 変更履歴(変更ファイル名付き)
git status           # 状態を表示
git checkout -- hogehoge.txt # commitされている状態に戻す
git diff             # 変更箇所を表示
git diff --cached    # ステージングエリア(コミット前)の変更箇所

vi .gitignore        # 無視するファイルを設定

git reset --hard HEAD       # コミットされている状態に戻す(ファイルの変更、追加も打ち消す)
git reset --hard HEAD^      # HEADから1つ前のコミットに戻す(すべて打ち消す)
git reset --soft HEAD^      # HEADから1つ前のコミットに戻す(ワーキングツリー・インデックスはそのまま)
git reset --mixed HEAD^     # HEADから1つ前のコミットに戻す(ワーキングツリーはそのまま)
git reset --hard {id}       # 特定のコミットに戻る
git reset --hard ORIG_HEAD  # 持っどったのを戻る

git reflog                  # HEADが辿ってきた履歴

git branch                    # ブランチの一覧
git branch {branch_name}      # ブランチの作成
git branch -d {branch_name}   # ブランチの削除
git checkout {branch_name}    # ブランチの切り替え
git checkout -b {branch_name} # ブランチを作成、同時に切り替え
git merge {branch_name}       # ブランチのマージ
git merge --squash {branch_name} # マージするブランチのコミットを1コミットにまとめる ※別途コミットすること

git tag {tag_name}      # 直近のコミットにタグを付ける
git tag {tag_name} {id} # 特定のコミットにタグを付ける
git tag -d {tag_name}   # タグの削除
git show {tag_name}     # タグのコミットを表示

git clone {url} {dir_name} # クローン
git push                   # プッシュ
git pull                   # プル
git push --set-upstream origin {branch_name} # ブランチを作って初回のプッシュ

git stash -u                      # 変更内容を退避(-uを付けるとaddをしていないファイルも退避する)
git stash -u save "stash message" # メッセージを付けて変更内容を退避
git stash list                    # stashの一覧を表示
git stash apply stash@{0} --index # stashした状態に戻す(--indexを付けないとaddを行った情報がなくなる)
git stash drop stash@{0}          # stashを削除

# branch1へbranch2を取り込む。その歳、branch1の最新のコミットからbranch2のコミットを追加する。
git rebase {branch1_name} {branch2_name}
 
git cherry-pick {id} # 特定のコミットを取り込む

git revert [id] # 特定のコミットを消す
```

# 小ネタ

```bash
# git logで文字化けする場合の対応
vim ~/.bashrc
export LESSCHARSET=utf-8
source ~/.bashrc
```
[うまくいかなかった]Listの中身が表示されない問題

## 状況
1.top.jsp
2.TestServlet
3.test.jsp　←イマココ
4.TestResultServlet
5.testResult.jsp
6.top.jsp

配列を用意してsetAttributeでServletで渡ってるはずなのに、リストデータを取得した以下の文の中身がJSPに表示されない。

```
//test.jsp

//リストデータをリクエストから取得
List<QuestionsBean> qlist = (List<QuestionsBean>)request.getAttribute("qlist");

	//questionのデータが空でない場合
	if(qlist != null){

		//qestionのデータの数分、繰り返し処理
		for(int i=0;i<qlist.size();i++){
%>

<div class="inputQuestion">
	<p>
		<!-- 問題番号 -->
		<input readonly type="text" name="questionId" value="<%= qlist.get(i).getId() %>">
	</p>
	<p>
		<!-- 問題 -->
		<textarea readonly name="question"><%= qlist.get(i).getQuestion() %></textarea>
	</p>
</div>

<!-- 回答 -->
<div class="input-answer">
<p> 回答：
	<!-- 答え -->
		<input type="text" name="answer" id="answer">
</p>
</div>
<%
	}
}
%
```

## 原因
#### ①サーブレットの遷移先が間違っていた:baby_tone1:

```
//TestServlet.java

RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
			rd.forward(request, response);
```
コピペマンのあるある。
そのせいでサーブレットからデータが渡ってきてなかった

#### ②postに渡したいのにaタグで書いてた
```
//top.jsp
誤 <a href="TestServlet">テストをする</a>
```
```
//top.jsp
正	<form action="TestServlet" method="post">
		<input type="submit" value="テストをする">
	</form>
```

## まとめ
遷移先のミスは想定外でした。。
2回目のミスなので備忘録:boy_tone1:
[AWS] [tomcat]インスタンスタイプによってsetenv.shを置き換える

AWSのEC2のインスタンスタイプによって　CATALINA_OPTSに記載されているヒープサイズを変えたいということはよくあることだと思います。

ここではお手軽に、インスタンスタイプごとのsetenv.shをS3に用意しておいて、それを起動時シェルで置き換えるという方法を紹介します。


## 複数のsetenv.shを用意する

まず、利用する可能性があるインスタンスタイプごとのsenenv.shを用意します。
今回はt3.mediumとt5.largeの2パターンを用意します。
ファイル名は**{インスタンスタイプ}.setenv.sh**とつけて下さい。

今回ですと、t3.medium.setenv.shとr5.large.setenv.shとなります。

### t3.medium.setenv.sh
t3.mediumはメモリ4GBなので、以下のように2048MBをtomcatに割り当ててみました。

```bash:t3.medium.setenv.sh
export CATALINA_OPTS="\
 ${CATALINA_OPTS} \
 -Xms2048m \
 -Xmx2048m \
 ...
"
```

### r5.large.setenv.sh
r5.largeはメモリ16GBなので、以下のように8192MBをtomcatに割り当ててみました。

```bash:r5.large.setenv.sh
export CATALINA_OPTS="\
 ${CATALINA_OPTS} \
 -Xms8192m \
 -Xmx8192m \
 ...
"
```

### S3にアップロード
以下のように、上記で作成したファイルをS3の任意のバケットに保存します。

![Screen Shot 2021-03-03 at 13.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/ecdcb196-bb6a-97de-7ffd-83bcc9401872.png)

## setenv.shを置き換える
それでは、EC2のユーザーデータなどの起動時スクリプトに以下を記述しておきます。

### S3からsetenv.shをダウンロード
S3から用意したインスタンスタイプのsetenv.shを全部落としてきます。IAMロールなどのパーミッションをセットするのを忘れずに。配置場所はtomcatディレクトリのbinフォルダの中です。

```bash
$ aws s3 sync s3://your-bucket/middleware/tomcat/setenv/ /path-to-tomcat/bin/
```

### インスタンスタイプに合わせて置き換える
以下のコマンドで自身のインスタンスタイプを取得して、**{インスタンスタイプ}.setenv.sh**を**setenv.sh**に置き換えます（コピーします）。

```bash
$ ec2-metadata -t | cut -d":" -f2 | xargs echo | xargs -I{} ls {}.setenv.sh | xargs -I{} cp {} setenv.sh
```

以上になります。
このやり方なら、インスタンスタイプに合わせて自由にsetenv.shを用意することができ、利用するインスタンスタイプが増えたとしてもS3上のファイルを増やせば対応できますので、ソースコードの修正は不要になります。
setenv.shたちをGit管理しておくのもおすすめです。

オートスケーリングで複数のインスタンスタイプを利用しながら、スケールアウトしていく場合などに利用する想定で作成しました。

以上ご参考になればと。
【CSS】オシャレな縁取り文字を簡単に作る方法

# 初めに
https://qiita.com/ynkn0829/items/d329e092daba523667dd

　この記事は、上記記事で紹介したポートフォリオで使用した技術を切り出した記事になります。もし宜しかったらこちらもご覧ください。

## イメージ図
[![Image from Gyazo](https://i.gyazo.com/d0059324561d3e8c1bb5ae37d0f09beb.jpg)](https://gyazo.com/d0059324561d3e8c1bb5ae37d0f09beb)
　今回紹介する縁取り文字を使用すると、上記の「Typing for Programer with Typie」の部分のように、「文字の外側を縁取る」ことが簡単に出来るようになります。

## どんな場面で有効か  
　上記画像はポートフォリオのランディングページなのですが、ご覧の通り画像を画面一杯に使用しております。この場合、画像の上に文字を表示することになるのですが、背景に明るい場所や暗い場所があるので、**どんな色を採用しても読みづらい部分が必ず出てきます**。かといって、文字を表示する部分を塗りつぶしてしまうと、**画像を使っている意味が半減してしまう**と考えました。
　そこでたどり着いた結論がこの**「縁取り文字」**でした。
　これならば背景色が何色だろうと文字を把握することが出来る上、画像を隠す範囲を最小限にすることが出来ます。人間の脳って、こういう「縁があるもの」を１つのカタマリとして認識しやすい構造になってるんでしょうね。

## 縁取り文字の作り方
https://webparts.cman.jp/string/outline/

　上記URLの「CMAN」というサイトを活用させて頂きました。
[![Image from Gyazo](https://i.gyazo.com/325f3f77a877fbdccecb4adc861ae774.png)](https://gyazo.com/325f3f77a877fbdccecb4adc861ae774)

#### 手順
1. 文字の色を決める
2. 縁取りの色を決める
3. 縁取りの太さやぼかし加減を決める
4. 実際にどう表示されるのか確認しながら微調整していく
5. 出来上がったCSSを自分のアプリにコピペし、この内容を反映させたい要素のクラスに"outline"を書き足す

　以上です！！！
　文字色や縁取りの太さの変更はリアルタイムで下の見本に表示されるので、これだ！と思うデザインになるまでいくらでも自由に編集可能ですし、完成したらそのCSSをコピペするだけで自分のアプリへ反映することが出来ます。
　本当に便利ですので、もし宜しかったら一度試してみてはいかがでしょうか？

　また、この「CMAN」というサイトは「縁取り文字」だけでなく色んなWEBパーツを同様の方法で作成することが出来ます。作れるデザインの幅が格段に広がるかと思いますので、是非アクセスしてみてください！！
ActiveRecord::PendingMigrationErrorの対処法

# ActiveRecord::PendingMigrationErrorの対処法

マイグレーションファイルを編集し、rails db:migrateでマイグレーションを実行したときに、このようなエラーが出た場合の対処法について記載します。

## エラーメッセージ
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170783/3e65d507-7e24-6b73-6226-a0f95d507de8.png)

## 開発環境
・データベース：MYSQL
・railsのバージョン：6.0.0
・使用PC：macbook pro

## エラーの原因
[![Image from Gyazo](https://i.gyazo.com/6ade0048262c6f571365c59203fc6ef6.png)](https://gyazo.com/6ade0048262c6f571365c59203fc6ef6)
このように、usersテーブルが既に作ってあるにも関わらず、また作ろうとしてエラーになったようです。

## エラーの解決方法
```
rails db:reset
```
このコマンドをターミナルに打つと、
①すでにあるテーブルを削除、
②再度マイグレーション実行
というタスクを一度に行ってくれます。

これを実行したあと、rails db:migrate:statusコマンドにてマイグレーションの状況を確認してみると、
[![Image from Gyazo](https://i.gyazo.com/c020f782cd840913170e14009b962266.png)](https://gyazo.com/c020f782cd840913170e14009b962266)

ちゃんとupの状態になっていました。


## 最後に
今回のエラーに直面し最初は困っていましたが、以下の記事を参考にして解決することができました。
同様のエラーに直面した方にはきっと参考になる記事ですので、ご一読下さい。
https://qiita.com/KONTA2019/items/0444ae3b8c8936a56ee0
https://qiita.com/ryota_ueda/items/fcf111ed0b56822408ed
https://qiita.com/ARTS_papa/items/64416fd4e05250941fb4
CakePHP2.x フォームに配列になるようなhiddenを出力するとSecurityComponentでBlackhole送りになる


どんなのがダメかというと下記の様に末尾が数字だけの配列になるようなhiddenがダメ。

```php
echo $this->Form->hidden('foo.0', ['value' => 'foo zero']);
echo $this->Form->hidden('foo.1', ['value' => 'foo one']);
```

このフォームをPOSTすると下記の様なエラーでSecurityComponentでひっかかります。

```
Tampered field 'foo' in POST data (expected value 'foo one' but found ‘’)
```

原因はFormHelperの下記の箇所

https://github.com/cakephp/cakephp/blob/2.x/lib/Cake/View/Helper/FormHelper.php#L704-L709

```
// ここで末尾の数値なしのフィールド名を取得 foo.0, foo.1 がどちらも foo と判定されちゃう。
$field = preg_replace('/(\.\d+)+$/', '', $field);

if ($lock) {
	if (!in_array($field, $this->fields)) {
		if ($value !== null) {
			// ここでfooの期待値をvalueとして変更不可対象にしてしまう…
			return $this->fields[$field] = $value;
```

というわけでSecurityComponentを使うなら`foo.0`みたいに末尾が ".数値" になるフィールド名は避けるのが無難そうです。
【Rails】ログイン画面にエラーメッセージを表示させる（devise使用）

# 環境
macOS: Big Sur Ver11.2.2
Rails: 6.0.0
Ruby: 2.6.5

# やりたいこと
Railsアプリケーションでdeviseを使ってユーザー登録やらを実装している。
新規登録やパスワードリセット画面ではモデルに紐づくエラーメッセージが表示されるが、なぜかログイン画面では表示されない仕様になっている。
ログイン画面でもエラーメッセージを表示させてユーザーにわかりやすい仕様にしたい。

# 試したこと
新規登録のビューと同じパーシャルをログインのビューファイルにも記載した。
**【結論】**
表示されない…

```erb:app:views:devise:sessions/new.html.erb
<h2>ログイン</h2>

<%= form_with model: @user, url: new_user_session_path, local: true do |f| %>

<%# 以下にエラーメッセージのパーシャルを記載 %>
<%= render "devise/shared/error_messages", resource: resource %>

<div class="field">
  <%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

<div class="field">
  <%= f.label :password %><br />
  <%= f.password_field :password, autocomplete: "current-password" %>
</div>

<% if devise_mapping.rememberable? %>
<div class="field">
  <%= f.check_box :remember_me %>
  <%= f.label :remember_me %>
</div>
<% end %>

<div class="actions">
  <%= f.submit "ログインする" %>
</div>
<% end %>

<%= render "devise/shared/links" %>
```

# 解決方法
% rails g devise:install した時にターミナルの完了画面にそもそも指示が書いてありました！
指示に従って、以下のファイルを編集したら無事にエラーメッセージが表示されました（厳密に言うと、エラー用のフラッシュメッセージ）。

```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>

<head>
  <title>TakeOutApp</title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>

  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>

<body>

  <%# deivseのフラッシュメッセージを表示 %>
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>

  <%= yield %>

</body>

</html>

</html>
```

ちなみに、上記の記述でログインしてルートページにリダイレクトしたときにも「ログインに成功しました！」というフラッシュメッセージが表示されるようになります。
Wordpress REST APIでユーザーのプロフ画像を取得するには

# 結論
Wordpress REST APIでユーザーのプロフ画像を取得するには、プラグインの「Advance Custom Field」を用いてユーザー情報の登録項目をカスタマイズ可能にした上で、ユーザーの画像を登録するフィールドを作成することで実現される。

## そもそもいかにしてREST APIでユーザー情報を取得するか

```
https://your-site-url/wp-json/wp/v2/users?_embed
```
このURLを叩けば、あなたは当該サイトのWordpressユーザーの情報を取得することができます。

## デフォルトで取得できる情報は
しかし、デフォルトの状態で、ユーザー情報を取得することができる情報には限りがあります。
id,name,slug,などは取得できるものの、ユーザーのプロフ画像などは取得できません。

## Advance Custom Fieldとは
通称、[ACF](https://ja.wordpress.org/plugins/advanced-custom-fields/)と呼ばれる当該プラグインは、特定の投稿タイプなどにデフォルトでは登録できない情報を紐付けて登録できるようになるものです。

## ACFを用いて、ユーザー情報に画像を登録できるようにする
ACFを有効化し、フィールドグループの新規追加を行ってください。
その後、フィールドグループ名を決定し、以下のように設定しましょう。
![](https://storage.googleapis.com/zenn-user-upload/8rdsy2pz5yf58ndo9conh20wzhnw)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/b3091fd8-5555-0a06-c3eb-9b5b5fa95abd.png)


そして、「位置」の設定項目において、
![](https://storage.googleapis.com/zenn-user-upload/nhu1x8i957qtcmc2gkepgzot3dg1)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/c0223d95-730c-82aa-cf4d-8a09d7ca13cc.png)

現在のユーザー / 等しい / ログイン済
と登録すればOKです！

この作業を行っていただければ、

```
https://your-site-url/wp-json/wp/v2/users?_embed
```
にて、acfの項目でユーザー画像の取得ができるようになっていると思います！
不具合などあれば、[twitter](https://twitter.com/candle_hub)までお気軽にお願いします！
[github](https://github.com/kazuhitonakayama)
Eclipseのgitconfigのパスが変更できない

# 問題

Eclipseのgitconfigのパスが変更できない

[設定]-[チーム]-[Git]-[構成]-[レポジトリ設定]　
[設定]-[チーム]-[Git]-[構成]-[ユーザー設定]


にあるロケーションに設定されているパスが以下の値から変更できない

```
W:¥.gitcofig (non-writable)
```

# 解決策

コマンドプロンプトで

```
setx HOME %userprofile%
```
Java   Excel ピボットテーブルを作成

<p><strong>ピボットテーブルは表計算ソフトまたはビジネスインテリジェンスソフトウェアにて利用されるデータ可視化要約機能である。今日は Spire.XLS for Javaを使ってExcelでピボットテーブルを作成する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210303/20210303151514.png" alt="f:id:lendoris:20210303151514p:plain" title="" class="hatena-fotolife" itemprop="image" /><strong> </strong></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210303/20210303151547.png" alt="f:id:lendoris:20210303151547p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA


import com.spire.xls.*;

public class CreatePivotTable {
    public static void main(String[] args)  {

        
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        Worksheet sheet = workbook.getWorksheets().get(0);

        //キャッシュを作成します。
　　　　　
        CellRange dataRange = sheet.getCellRange("A1:C19");
        PivotCache cache = workbook.getPivotCaches().add(dataRange);

        //キャッシュを使ってピボットテーブルして、テーブルの名前と位置を指定します。
        PivotTable pt = sheet.getPivotTables().add("Pivot Table", sheet.getCellRange("E10"), cache);

        // Rowを追加します。
        PivotField pf=null;
        if (pt.getPivotFields().get("Name") instanceof PivotField){
            pf= (PivotField) pt.getPivotFields().get("Name");
        }
        pf.setAxis(AxisTypes.Row);

        PivotField pf2 =null;
        if (pt.getPivotFields().get("Area") instanceof PivotField){
            pf2= (PivotField) pt.getPivotFields().get("Area");
        }
        pf2.setAxis(AxisTypes.Row);

        //值を追加します。
        pt.getDataFields().add(pt.getPivotFields().get("Population"), "SUM of Count", SubtotalTypes.Sum);

        //ピボットテーブルを書式設定します。
        pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium12);

        //保存します。
        workbook.saveToFile("output/CreatePivotTable.xlsx", ExcelVersion.Version2013);
    }
```

<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210303/20210303151624.png" alt="f:id:lendoris:20210303151624p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
VSCodeでbeegoをデバッグする

# はじめに
beegoの学習中に、ブレークしようとしてVSCodeの←をぽちっとしてもぜんぜん止まらなかったのでメモ的に投稿。

# 前提
- windows環境
- beegoインストール済み
- vscodeインストール済み
- vscodeにgoの拡張機能インストール済み

# delveをインストール
beegoプロジェクトのルートフォルダで下記実行。

```
$ go get -u github.com/derekparker/delve/cmd/dlv
```

一応動作確認。下記がでればOK。

```
$ dlv version
Delve Debugger
Version: 1.5.1
Build: $Id: bca418ea7ae2a4dcda985e623625da727d4525b5 $
```

# launch.jsonを作成
VsCode上で実行タブを押下。
初回は実行ファイルを作成～がでるので押下して作成する。
すると以下のような感じになるはず。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/21272bbb-5a53-3f1f-6bd6-a6c64a7e64c1.jpeg)

このlaunch.jsonを下記のように変更する。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            // "type": "godlvdap",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/main.go",
            "env": {},
            "args": []
        }
    ]
}

```

programがポイントです。
beegoはmain.goを動作させたいので現在フォルダ以下のmain.goを指定。
他の詳細は以下を参考にしてください。

[Visual Studio CodeでGo言語のデバッグ環境を整える](https://qiita.com/momotaro98/items/7fbcad57a9d8488fe999)

# ブレークポイントを追加&実行
後は他と同じようにブレークポイントを追加して、VSCode左上のlaunchの▷押下で実行。
処理を通れば無事デバッグできるはず。

![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/f54a802c-f5cf-3cc1-5e6c-960874bae231.jpeg)

# おわりに
新しい言語とかやると環境回りで時間とられるなー
3/3はひなまつりなのでCSSだけでひし餅（菱餅）作ってみた

# どうも7noteです。~餅シリーズ第二弾~ひし餅をCSSだけで作ってみた

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/f486789f-fa1f-877f-9edd-03d69e204b08.png)


CSSだけで作るシリーズ、ひなまつりに合わせてひし餅でも作りましょう。
前回作成した[CSSでの立方体の作り方（サイコロも作れるよ）](https://qiita.com/7note/items/4beb0dd3ba4bdde82609)のときに作成した紙を応用して作っていきます

## 作り方

```index.html
<div class="mochi">
  <div class="item top"></div>
  <div class="item item01-L"></div>
  <div class="item item01-R"></div>
  <div class="item item02-L"></div>
  <div class="item item02-R"></div>
  <div class="item item03-L"></div>
  <div class="item item03-R"></div>
</div>
```

```style.css
.mochi {
  display:block;
  position:relative;
  width:100px;
  height:100px;
  transform-style:preserve-3d;
  transform:rotateX(-25deg) rotateY(-45deg); /* ここで四角の角度を調整できる */
}

.mochi .item {
  width: 100%;
  height: 10px;
  position:absolute;
  left:0;
  right:0;
  box-sizing:border-box;
}

/* 上 */
.mochi .item.top{
  transform:translate3d(0, -50px, 0) rotateX(-90deg);
  height:100%;
  background: #EFCBD7;
}

/* 1段目左 */
.mochi .item01-L {
  transform:translate3d(0, 0, 50px);
  background: #ECB0BB;
}

/* 1段目右 */
.mochi .item01-R {
  transform:translate3d(50px, 0, 0) rotateY(90deg);
  background: #ECB0BB;
}


/* 2段目左 */
.mochi .item02-L {
  transform:translate3d(0, 10px, 50px);
  background: #F7F7F7;
}

/* 2段目右 */
.mochi .item02-R {
  transform:translate3d(50px, 10px, 0) rotateY(90deg);
  background: #F7F7F7;
}

/* 3段目左 */
.mochi .item03-L {
  transform:translate3d(0, 20px, 50px);
  background: #8ABF47;
}

/* 3段目右 */
.mochi .item03-R {
  transform:translate3d(50px, 20px, 0) rotateY(90deg);
  background: #8ABF47;
}
```

**完成**

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/576e0f69-363f-b07c-6bb7-29ba1894eb15.png)



## おまけ

小学生のとき、まだ肌寒い中給食で三色ゼリーが出たのが特別感あって嬉しい日でした。
寒いのに冷たいゼリーって思っていてもやっぱり嬉しかったですね。



第一弾もよければ参考に：[「迎春なので鏡餅をCSSで作った」](https://qiita.com/7note/items/34217d2b926efa32bf40#comments)

![no01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/eaa90435-a94a-ae40-4bf6-51f42c1d6271.png)

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
UITableViewCellに追加したSwiftUIのボタンが反応しない

iOS14の端末でUITableViewの中身のみをSwiftUIでビューを作成した際にボタンが反応しない問題がありました。（iOS13ではボタンの反応がありましたのでOSのバージョンによって挙動が異なるようです。）

以下の様にボタンのみが配置されているシンプルな画面を作成します。

![スクリーンショット 2021-03-03 14.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/d1676b32-2dfe-8035-8730-21055371288b.png)


```swift
import UIKit
import SwiftUI

class ViewController: UIViewController {

    @IBOutlet private weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
        let view = ButtonView()
        let hostingController = UIHostingController(rootView: view)
        cell.addSubview(hostingController.view)
        
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        hostingController.view.heightAnchor.constraint(equalToConstant: 320).isActive = true
        hostingController.view.bottomAnchor.constraint(equalTo: cell.bottomAnchor, constant: 16).isActive = true
        hostingController.view.topAnchor.constraint(equalTo: cell.topAnchor, constant: 16).isActive = true
        hostingController.view.leftAnchor.constraint(equalTo: cell.leftAnchor, constant: 16).isActive = true
        hostingController.view.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -16).isActive = true
        hostingController.view.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
        cell.selectionStyle = .none
        return cell
    }
    
    
}

```

●ButtonView

```swift

struct ButtonView: View {
    var body: some View {
        HStack {
            Spacer()
            VStack(alignment: .leading) {
                Spacer()
                Button(action: {
                    print("タップ")
                }) {
                    Text("ボタン")
                        .foregroundColor(Color(.blue))
                        .font(.system(size: 14))
                        .padding([.leading, .trailing], 20)
                        .overlay(
                            RoundedRectangle(cornerRadius: 14)
                                .strokeBorder(Color(.blue), lineWidth: 1)
                        )
                }
                Spacer()
            }
            Spacer()
        }
    }
}
```

「Debug View Hierarchy」で階層を見てみると以下の様になっていました。

![スクリーンショット 2021-03-03 15.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/c59fef39-ff8d-1226-d87b-2c0d69ae1b97.png)


ボタンの上にcontentViewが乗っかってしまっています。
これはcell.addSubviewとしているのが問題で、正しくはcell.contentView.addSubviewとしなければなりませんでした。

OSによって挙動が異なるようですが、パッと見では分かりづらいため備忘録として残しておきます。
Railsで jQueryが動かない場合の対処法

##目的
RailsでjQueryが動作するようにする。

##記述
```javascript
  $('button').on('click',function(){
    $('.popup').addClass('show').fadeIn();
  });

  $('#close').on('click',function(){
    $('.popup').fadeOut();
  });
```

##なぜ動かなかったのか
Railsに標準でインストールされているturbolinksが原因でした。
以前JavaScriptでも同じ原因で動作しなかったことがありました。よく考えれば当然ですがjQueryにも影響があるようです。
JavaScriptと同様に'turbolinks:load'が必要なので下記の通り変更しました。


##変更後の記述
```javascript
$(document).on('turbolinks:load', function() {
  $('button').on('click',function(){
    $('.popup').addClass('show').fadeIn();
  });

  $('#close').on('click',function(){
    $('.popup').fadeOut();
  });
});
```

無事動作させることができました。
Android StudioでリリースAPK（署名付き）を作成してみた。

# Android StudioでリリースAPK（署名付き）を作成してみた。
###最初に
Build Variantをrelease設定してBuild APK(s)を実行して署名付きリリースAPKを作成する時の手順の記事となります。
また今回の記事はリリースAPKを作成して端末にインストールしてみたので自分の覚書用に
作成した物なので、参考になるかどうかは保証しかねるのでご了承の上お読みください。
＊画面スクショは気が向いたら後日追加するかも？
### 1.KeyStoreを作成
Build -> Generate Signed Bundle or apk　をクリック
*もしかしたら...で省略されてるかも
↓
開いたウィンドウでapk を選んで次へ
↓
「key store path」の編集ボックスの下のボタンをクリック(Create New ...)
↓
keyStoreの作成画面が開くので以下の項目を入力してOKをクリック
・Key Store path :KeyStoreの保存場所(path/xxx.jks)
　　＊pathだけでなくkeyStore名もここで記述する必要あり
　　＊gradleにstorePasswordの変数名？で記述する
・Password :キーストアのパスワード。署名設定時に必要。6文字以上必要。
・Alias : キーを識別する任意の名前。
　　＊gradleにkeyAliasの変数名？で記述する
・PassWord(key) : キーのパスワード。
　　＊gradleにkeyPasswordの変数名？で記述する
・Validity(Yeas) : 有効年数
・Certificate :証明書の所有者に関する情報。どれか一つに入力が必要。今回は「First and ...」に入力した
*他にも入力項目はあるが上記の物を入力したらとりあえずは作成できた
↓
とりあえずエラーが出るが、無視して入力したpathにkeyStoreが作成されている事が確認できたら
ウィンドウを閉じてしまってOK（APKはgradle設定後にBuild Apkで作成するから）

###2.Build.gradle(app)に追記

    android{
        (略）
        　・
        　・
        signingConfigs {
            release {
                storeFile file(“xxx/xxx.jks”)
                // KeyStore作成時に設定した値を覚えておく必要有り
                storePassword ‘XXXXX’
                keyAlias ‘XXXX’
                keyPassword ‘XXXX’
            }
        }

        buildTypes {
           release {
                 (略）
        　         ・
        　         ・
              signingConfig signingConfigs.release
           }
        }
        // 署名付きAPKを作ろうとするとLintエラーが出るのでその対策
        lintOptions {
            checkReleaseBuilds false
            abortOnError false
        }

    }

上記の物を追加したらSyncを実行する

###3.署名付きリリースAPKを作成
Build Variant を　releaseに設定
Build-> Build Bundle(s)/APK(s)->Build APK(s)をクリックして
署名付きリリースAPKを作成
作成が終了したらAndroid studioの何処かにBuild APK(s)の通知が出る。
成功時にはlocate（ハイパーリンク）が通知の中にあるのでそれをクリックするとAPKが作られたディレクトリが開く。


---
### 参考・引用元
Qita記事
・[Android studioにおけるbuild.gradleの設定について](https://qiita.com/kazuhiro1128/items/9279ca432e7a900acdcc)
・[Android Studioで署名付きAPK作成時にLintエラーが出た場合の対処法](https://qiita.com/takahamarn/items/dfc9f44c9591fd3780c7)
外部サイト
・[なんちゃって情シス/【Android Studio】Key store pathを初めて作成する](https://joh-sys.com/blog/2020/05/20/%E3%80%90android-studio%E3%80%91key-store-path%E3%82%92%E5%88%9D%E3%82%81%E3%81%A6%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/)
ORANGE-4を利用して機械語を学習

#ORANGE-4とは
機械語プログラミングを学習できる「教育用４ビットマイコンボード」です。
本体のみを利用して２進数の仕組み、コンピューターの構成や原理、機械語を学習する事ができます。
「教育用」という事でScratchのような立ち位置ではないかと考えています。
<img width="300" alt="IMG_0025.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/76662b36-2274-0c6c-d953-c966343de696.png">

#機械語とは
コンピュータのプロセッサが実行可能な命令のデータです。
簡単に表現すると、コンピュータが解読できる言語です。
マシン語とも呼ばれていて、２進数の並びで表されています。
![スクリーンショット 2021-03-03 13.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/8b1071af-4513-25a4-1fe4-c4c17099db2b.png)



#アセンブリ言語とは
機械語を理解しやすくしたものです。
人間にとって機械語を理解するのは大変なので、分かりやすい文字や数字でソフトウェアを記述できるようにプログラミング言語が工夫されてきました。
![スクリーンショット 2021-03-03 14.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/c14f0a1f-a123-3220-8c30-ae50aa716d6f.png)



#ORANGE-4の仕組み
![スクリーンショット 2021-03-03 14.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064503/7b235bdb-63e1-f0a0-8d3c-9cb058adb283.png)

#参考資料
学習時に参考にした資料はこちらです。
[参必ずわかるORANGE-4機械語プログラミング](http://www.picosoft.co.jp/ORANGE-4/download/ORANGE-4-manual.pdf)

#まとめ
書籍を読むだけでなく、実際に手を動かし課題に取り組んだことによって理解が深まりました。
本体のみで学習が可能、かつシンプルな作りとなっているので、コンピュータの仕組みを理解したい人やプログラマーを目指したい人には是非活用して頂きたいです。
Python3 で Synology の WebDAV にアクセスする

こちらと同じことを Python3 で行いました。
[cadaver で Synology の WebDAV にアクセスする](https://qiita.com/ekzemplaro/items/6d7deb3ff16f2cd348ca)
[https://qiita.com/ekzemplaro/items/493faac63ba863892f6f](https://qiita.com/ekzemplaro/items/493faac63ba863892f6f)
[Httpie で Synology の WebDAV にアクセスする](https://qiita.com/ekzemplaro/items/18809daa4fe2336bae6b)

Ubuntu でライブラリーのインストール

```bash
sudo apt install python3-easywebdav
```

ファイルのアップロード

```py:webdav_put.py
#! /usr/bin/python
#
#	webdav_put.py
#
#						Mar/03/2021
# ------------------------------------------------------------------
import easywebdav

webdav = easywebdav.connect(
	'example.synology.me',
	username='scott',
	password='secret',
	protocol   = 'https',
	port=5006)

webdav.upload('./tmp01.txt', '/homes/scott/tmp/tmp01.txt')
#
# ------------------------------------------------------------------
```

ファイルのダウンロード

```py:webdav_get.py
#! /usr/bin/python
#
#	webdav_get.py
#
#						Mar/03/2021
# ------------------------------------------------------------------
import easywebdav

webdav = easywebdav.connect(
	'example.synology.me',
	username='scott',
	password='secret',
	protocol   = 'https',
	port=5006)

webdav.download('/homes/scott/tmp/tmp02.txt','./tmp02.txt')
#
# ------------------------------------------------------------------
```
pandasのplotを用いたカテゴリカル値と連続値の分布の可視化

# pandasのplotを用いたカテゴリカル値と連続値の分布の可視化
kaggleとかでcsvファイルのデータ分析をする際に，keyごとの特徴量の分布を可視化して比較したくなる．
カテゴリカル値の場合はバーの上に数を表示．

## Content

1. カテゴリカル値の可視化
2. 連続値の可視化
3. 2DataFrame 間のカテゴリカル値の比較
4. 2DataFrame 間の連続値の比較

## 必要なライブラリのimport

```py3:python3
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
np.random.seed(seed=0)
```
jupyter notebookなら以下も追加

```py3:python3
%matplotlib inline
```
## DataFrameの準備

```py3:python3
length=500
train_df = pd.DataFrame(np.random.normal(loc=0, scale=1, size=(length)),columns=["cont"])
eval_df = pd.DataFrame(np.random.normal(loc=1, scale=0.5, size=(length)),columns=["cont"])
train_df = train_df.assign(cat=np.random.randint(0,5,length)) 
eval_df = eval_df.assign(cat=np.random.randint(0,6,length)) 
```
## カテゴリカル値の可視化

```py3:python3
def categorical_plot(df, key):
    data = df[key].value_counts(sort=False)
    ax = df[key].value_counts(sort=False).plot(kind="bar", title=key)
    for i, d in enumerate(data):
        ax.text(i, d, d, horizontalalignment="center",
                verticalalignment="bottom")
    return ax
```

```py3:python3
categorical_plot(train_df, "cat")
```
![cat1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1149858/1f5b85cc-412e-4ead-9b42-1a013b8a1551.png)


## 連続値の可視化

```py3:python3
def continuous_plot(df, key):
    ax = df[key].plot(kind="density", title=key)
    return ax
```

```py3:python3
continuous_plot(train_df, "cont")
```
![cont1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1149858/112ab466-7194-de3c-50fe-68468e8a1fc1.png)

## 2DataFrame間のカテゴリカル値の比較

```py3:python3
def compare_cat(trdf, evdf, key):
    tr_df = trdf.rename(columns={key: "train"})
    ev_df = evdf.rename(columns={key: "eval"})
    tr_df = tr_df["train"].value_counts(sort=False)
    ev_df = ev_df["eval"].value_counts(sort=False)
    plot_df = pd.concat([tr_df, ev_df], axis=1)
    ax = plot_df.plot(kind="bar", title=key)

    for i, d in enumerate(tr_df):
        ax.text(i, d, d, horizontalalignment="right",
                verticalalignment="bottom")
    for i, d in enumerate(ev_df):
        ax.text(i, d, d, horizontalalignment="left",
                verticalalignment="bottom")
    return ax
```

```py3:python3
compare_cat(train_df, eval_df, "cat")
```

![compare_cat1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1149858/5346c580-b288-417e-8e0a-d0e4bec8a776.png)
## 2DataFrame間の連続値の比較


```py3:python3
def compare_cont(trdf, evdf, key):
    tr_df = trdf.rename(columns={key: "train"})["train"]
    ev_df = evdf.rename(columns={key: "eval"})["eval"]
    plot_df = pd.concat([tr_df, ev_df], axis=1)
    ax = plot_df.plot(kind="density", title=key).legend(loc="upper left")
    return ax
```

```py3:python3
compare_cont(train_df, eval_df, "cont")
```
![compare_cont1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1149858/ffc81f32-b58a-574c-61e9-bd550ca15b11.png)
Power Automate Desktop for Windowsの無料インストール方法

# Power Automate Desktop for Windows　10の無料インストール方法
Microsoftが3月2日（現地時間）に開始しました、
Power Automate Desktop for Windows 10のインストール方法について解説します。

https://forest.watch.impress.co.jp/docs/news/1309591.html

## ダウンロード



下記サイト(Microsoft社内ページ)にアクセスし、
「無料でダウンロードする」をクリック

https://flow.microsoft.com/ja-jp/desktop/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520671/e3d5a841-e1cf-3f3b-50df-b6cac48e41c2.png)


##インストール

Setup.Microsoft.PowerAutomateDesktop.exeを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520671/d6346736-958c-803f-a5ce-7ce566121194.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520671/d121b6a2-72f6-9714-54fa-4b4b5c5f06e7.png)

##拡張機能について
IE以外のブラウザ(ChromeやEdge,FireFoxなどは拡張機能をインストールしないと操作できません。）
Chromeなどを操作する場合には、拡張機能をインストールしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520671/03da57e2-f3d0-2d74-db30-71320a8b43c0.png)

##起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520671/bb61994e-dbbe-84b6-ffb5-6e9cd9e538c8.png)
スクール生のAWSクラウドプラクティショナー(CLF)合格体験記

##私は、
・プログラミング未経験
・プログラミングスクール生
・AWSの知識（VPC、EC2、RDSハンズオン経験のみ）

です。

毎日勉強3~4時間を1週間続けて、無事合格できました。
具体的に勉強に使ったサイトや書籍を紹介したいと思います。

##やったこと
__①まずは問題を１回分解いてみる__
とにもかくにも、どんな問題が出るか把握することが第１ステップだと思います。

__②udemyや本で、浅く全体を理解__
正直、意味不明ですが、あまり気にせずに進みました。

使った教材
 　書籍
　　・AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版
 　udemy
　　・AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得]

__③問題集をたくさん解いて、反復する__
正解率30%とかでしたが、あまり気にせずやりました。
正直回答も意味不明なものが多かったです。
意味不明にも２種類ありました。
・反復するうちに理解できたもの
・何度やっても理解不能

何度やっても理解不能は、
・Amazon Web Services Japan 公式YOUTUBEを観ました。ストレージやデータベースの説明がめちゃくちゃ分かりやすいです。
・AWS系YOUTUBER動画を観ました。再生回数が少なくても分かりやすい動画はたくさんありました。

使った問題集
　　udemy
　　この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
　　web問題集
　　・https://learn-aws.cafe/clf
　　・https://aws-exam.net/clf/clf_question.php

##試験当日の状態（※この程度でも受かりました。）
udemyの基礎問題　正解率80%（3回反復してるにも関わらず）
udemyの応用問題　正解率48%（初見）
ゴリ押しの暗記（例. ”ストリーミング”で書いてたら、脳筋で"Kinesis"を選ぶ。）


　
##さいごに
クラウドプラクティショナーに関しては、"質"より"量"が良いと思いました。
とにかく、過去問を解きまくるのが良かったのかもしれません。
ソリューションアーキテクトの合格体験記も書ければいいなと思います。

　
少しでも参考になれば幸いです。
[memo] オンラインプログラム実行環境

##paiza.io
https://paiza.io/ja

ブラウザ上でコードを書け、書いたコードをその場で実行できるオンラインのプログラム実行環境
対応言語はJava、C、C++、C#、Ruby、PHP、Python、Perl、JavaScriptと言ったメジャーな言語からGo言語やScala、Haskellなど24言語以上
https://paiza.io/help

▼用途
・あの言語を触ってみたいが環境を作るのが手間
・初心者にプログラムを教える時などに
UbuntuでRocket.Chatをsnapでインストール後にポートを変更する

忘れてしまいそうなので、メモ。

対象OS : Ubuntu 20.04 LTS

snapを用いてUbuntuのRocket.Chatをインストールした場合、デフォルトではport 3000となっている。
ググると/var/snap/rocketchat-server/current/Caddyfileを編集せよという情報もあるが、以下の手順でてっとりばやくポート変更できる。

```
sudo snap set rocketchat-server port=3030
```
xdebug3 でデバッグする

いつのまにかxdebugが更新されて古い設定のままだと動かなくなってたのでiniファイルの変更点をざっくり

# `xdebug.ini`の変更点

### 変更前(xdebug2)

確かこんな感じ

```
zend_extension=xdebug
xdebug.remote_enable =1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9000
```

### 変更後(xdebug3)

動いた設定

```
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=1
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
```

デフォルトのポート番号も9000から9003に変更になっているようです。
IDE側を直すか、xdebug側を変えるかはお好みで。

# 前提

使用している`Dockerfile`です。

```
FROM php:8.0-fpm

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

COPY docker-php-ext-xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

```

# 参考

- https://xdebug.org/docs/upgrade_guide/ja
- https://xdebug.org/docs/all_settings
Power Automate Desktop 無償化にあたっての検証


## はじめに
参考：

* [Automate tasks with Power Automate Desktop for Windows 10—no additional cost | Power Automate Blog](https://flow.microsoft.com/en-us/blog/automate-tasks-with-power-automate-desktop-for-windows-10-no-additional-cost/)

Windows 10 ユーザーは追加料金なしで Power Automate Desktop を利用できるようになった。これだけ聞くと他RPA製品を駆逐する勢いを感じるが、実際はどうなのか、試しに触れてみた。

前提条件：

* 職場の組織アカウントから利用
* Power Automate の有料プランの契約無し

## インストール
[公式サイト](https://flow.microsoft.com/ja-jp/desktop/) でアプリケーションをダウンロードしてインストールする。

インストールの途中、「インストールの詳細」でオプションを選ぶことになるが、「無人モード」で実行するか否かは、おそらく Power Automate の非アテンド型RPAアドオン(有償) を利用していないと意味がない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/835e1e29-37fb-74db-d3bb-20d442048217.png)
インストールが完了すればアプリケーションが利用可能になる。

## フローはどう管理されるか
Power Automate では、自動化の作業の単位を「フロー」という。Power Automate Desktop でフローを作成すると、フロー一覧画面 ([ドキュメント](https://docs.microsoft.com/en-us/power-automate/desktop-flows/console)ではコンソールと呼んでいる) に表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/0aeea05a-e3c6-9564-7938-9c8214d12dd6.png)
フローはクラウド上へ保管されているが、ではブラウザ版の Power Automate のページから同じ一覧が見えるかというと、そうなっていない。デスクトップフローのページを見ると、アプリケーションの起動を促される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/c1a41063-ec7f-fa2c-9274-b53f2a1e90cc.png)
デスクトップフローは、Power Automate Desktop をインストールした PC と該当アカウントからしか確認できない。つまり作った人しかフローを使えない。

フローを複製して他人に渡す機能も、今のところ見当たらない。クラウドフローはインポート＆エクスポートができるが、デスクトップフローにはない。

## フローの実行方法
手動で Power Automate Desktop を起動し、フローの実行ボタンを押す必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/cea3418c-6176-f436-b811-397a6368d1ac.png)
クラウド上で動作する「クラウドフロー」からデスクトップフローを実行するには、有償版が必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/58e6e984-a2bb-ca78-16d4-822ab35be274.png)

## 他製品を駆逐するか？
Power Automate Desktop は、個人が自分の作業を自動化するだけなら無償で行えるようになった。対して、組織でRPA推進プロジェクトを立ち上げて組織内の作業を自動化しようとする場合は、やはり有償プランの契約が必要だろう。
元々 WinActor や UiPath などは組織をターゲットにしているため、これらの製品がすぐさま駆逐されるとは考えづらいかもしれない。
しかし、Power Automate の価格は [価格](https://flow.microsoft.com/ja-jp/pricing/) のページを見る限り他製品より安いので、比較検討するなら対象に含めた方がいいと思う。特に、組織で Microsoft 365 を利用している場合の魅力度は高い。

まぁ、大規模にRPAを導入・運用することに労力を割くくらいなら、システム化など別の方法を検討したほうがいい気もするが…。
パスとアウトラインがsvgの容量にどう関係するか調べてみた

私は普段、デザインデータをイラレやxdから受け取った後、画像をweb用に使う際に、少しでも画像を軽く、使い勝手の良いように多少手を加えている（※デザインそのものをイジるという意味ではない）。

##修正のポイント・イラレなどのパスを持ってるデータ

- 余分なマスクを取り除く
- パスをアウトライン化する
- 合体を駆使するなどしてパスポインタの数を減らす　など。

## 検証
まず、線幅30pxで端の丸いデータをイラレで作成し、書き出してsvg化する
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/fce7d30f-fde3-3b1b-3b8e-8dd9cef753b5.png)

素のソース

```
<svg id="レイヤー_1" data-name="レイヤー 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 218.7 182.5"><line x1="15" y1="167.5" x2="203.7" y2="15" style="fill:#fff;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:30px"/></svg>
```

この時点で254バイト。

次に、アウトライン化する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/4fec0b4d-a69f-7dc4-f0c6-fecd1e8f5c5d.png)

このままだと、余分な線が残ってるので手作業で削除。
この時点でポイントの数７。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/fd45cb0e-5363-d775-4d5b-5170c29a1eee.png)

```
<svg id="レイヤー_1" data-name="レイヤー 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 218.7 182.5"><path d="M15,182.5a15,15,0,0,1-9.4-26.7L194.3,3.3a15,15,0,1,1,18.8,23.4L24.4,179.2A15,15,0,0,1,15,182.5Z"/></svg>
```

この時点で226バイト。

結果、パスデータを保持するより、アウトライン化する方が軽くなった。印刷物と同じなのかな。
あとは、テキストエディタで、余分なソースコードを削除して、さらに軽量化。
画像が複雑になればなるほど、効果はありそう。

普段こういうデータで作成をしないので、たまにやる合体など、こまかくちょこちょこするの好き。
昔取ったきねなんちゃら、ってことでデザインに関してこういう知識が少しでもあってよかった。
画像書き出しの際には、こういう細かな事も気を付けていかないとね！
[ImageMagick] Exifのうち回転情報だけを削除する

# 方法

photo.jpg というファイルに、Exifで回転（Orientation）の情報が書き込まれているときに、その情報だけを削除した（**他のExif情報は維持した**）画像ファイル photo_new.jpg を生成したい場合、以下のコマンドを使えばよい。

```sh
# 古い環境
convert photo.jpg -orient undefined photo_new.jpg
# 新しい環境
magick photo.jpg -orient undefined photo_new.jpg
```

なお、**Exifの回転結果を画像に適用してはいない**（Exifの回転情報が0度でない限りは、変換前と変換後で画像の回転方向が変わる）。適用したい場合は自前で処理する必要がある（例えば [PHPでEXIFのOrientationを元に画像を回転 - Qiita](https://qiita.com/yoshu/items/c83c239eb32ed295fca8) のような方法が利用できるらしいです。私のほうでは試せていません）。

# 経緯

Exifのうち回転の情報のみ削除する方法をぐぐっていたら、最初に[Windowsのエクスプローラの機能だけで行う方法](https://reblo.jp/blog/management48/)を見つけたのだが、これは自分の持っていたファイルでは機能しなかった。

その後もう少し調べていると、[ImageMagickでExifの回転の情報を書き換える方法](http://kuteken.hatenablog.com/entry/2013/11/10/180802)[^1]に行きついたので、ってことは回転の情報の無効化もできるのでは？って[公式のドキュメントを読んでみたら](https://imagemagick.org/script/command-line-options.php#orient)できるとわかったのであった。

# 参考にさせていただいたページ

[Image Magickのconvertコマンドでexif削除や回転情報を保持する（GitHub: webgyo氏）](https://gist.github.com/webgyo/df216c90fadce267ed43d761aa75728b)

[^1]: 当初は回転の情報を「追加」と書いていましたが、実際には（リンク先の記事のほうにもある通り）可能なのは回転の情報の書き換えであり、回転の情報がそもそも存在しないファイルに対してはできないとのことです。（[コメントをいただいたため](https://twitter.com/yoya/status/1367454573024088064)微修正）
【ただのアイデア書留】Pintarestで競合分析やるの自動化できないかな〜

https://yolo.love/api/pinterest/pinterest-api-start/

GoFullPageで毎回スクショ撮って、それピンタレストに上げて、URLはっつけてっていう作業を全部自動化できるシステム作れないかな~PintarestのAPI使えばできるのかな。。

いつかAPI使って開発できたらな〜技術力が足りないな〜
【GCP】ログダッシュボードで No data is available for the selected time frame が出た時

## 現象

`No data is available for the selected time frame` が出て、ログビューアのログが収集できていない

## 原因

クラスタとノードのサービス アカウントに Monitoring と Logging へのデータ書き込み権限が付与されていなかった

- `roles/logging.logWriter`
- `roles/monitoring.metricWriter`
- `roles/stackdriver.resourceMetadata.writer`

## 対応

`terraform` での対応例を示す。

```terraform
resource "google_project_iam_member" "logging_log_writer" {
  role   = "roles/logging.logWriter"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "monitoring_metric_writer" {
  role   = "roles/monitoring.metricWriter"
  member = "serviceAccount:${google_service_account.service_account.email}"
}

resource "google_project_iam_member" "stackdriver_resource_metadata_writer" {
  role   = "roles/stackdriver.resourceMetadata.writer"
  member = "serviceAccount:${google_service_account.service_account.email}"
}
```

## 参考文献

- [クラスタとノードのサービス アカウントに Monitoring と Logging へのデータ書き込み権限があるかどうか。](https://cloud.google.com/stackdriver/docs/solutions/gke/troubleshooting#write_permissions)
- [google_project_iam | Resources | hashicorp/google | Terraform Registry](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam)
Let's Encriptを使ってEC2にデプロイしたアプリを無料でSSL化する方法

# 前提
・AWSのEC2(Ubuntu20.04LTS)を使用
・Django, Nginx, Gunicornを用いてEC2にデプロイされており、httpでアクセスできる状態
## 前提から外れている方へ
・[Cirtbotの公式ドキュメント](https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx)を参考にして、自らの環境に合わせれば自動で必要なコマンドを教えてくれます。

# 全体の流れ
1. EC2にSSH接続
2. snapdをインストール
3. snapdをアップデート
4. Certbotを削除
5. Certbotのインストール
6. シンボリックリンクを作成してcerbotコマンドを使えるようにする
7. CertbotでSSL証明書を発行
8. 証明書の自動更新を設定
9. 自身のドメインに`https://`で始まるURLで接続確認

## 2. snapdをインストールする必要があればインストール
インストールの必要があるかは[ここで確認](https://snapcraft.io/docs/installing-snapd)
(Ubuntu20.04LTSはデフォルトでインストールされているため必要なし)

```
$sudo snap install core
```

## 3.最新のsnapdにアップデート

```
$sudo snap refresh core
```

## 4.Certbotを削除

```
sudo apt-get remove certbot
```

`apt-get`を使うか`dnf`を使うか`yum`を使うかは使っているEC2のOSに合わせる
(Ubuntuの場合はapt-get)

## 6. Certbotのインストール

```
$ sudo snap install --classic certbot
```

## 7. シンボリックリンクを作成してcerbotコマンドを使えるようにする

```
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
```
反応は無いですが大丈夫です。これを実行することで以降のコマンドで`certbot`から始まるコマンドを認識してくれるようになります。

## 8. CertbotでSSL証明書を発行

```
$ sudo certbot --nginx
```
このコマンドを実行してから以下の手順に従う
1. メールアドレスを聞かれる(障害発生の際に通知されるため必要)⇒入力
2. ポリシーに同意するか？⇒Y(Yes)
3. 問題発生時にメールアドレスのシェアを許可するか？⇒N(No)
4. どのドメインに対してSSL証明書を発行するか？⇒設定したいでメインを番号で選択

## 9. 証明書の自動更新を設定

```
$ sudo certbot renew --dry-run
```

これをすることで自動で証明書を更新してくれるようになります。

## 10. 自身のドメインに`https://`で始まるURLで接続
URLが以下のように表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450257/926a6b1b-128e-79da-eec0-e3c757027852.png)

簡単にできました！公式ドキュメントに感謝です！

# 参考サイト
[certbot公式サイト](https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx)
github action で shellから環境変数を動的に定義する

# 背景
github_action で 環境変数に動的に値を定義したい場合。例えば、github-actionが起動した日時を `ACTIVATED_TIME` として設定したい場合を想定する。

# やり方
- shell で `echo "ACTIVATED_TIME=some_value" >> $GITHUB_ENV` とするとshell経由で環境変数を定義できることを利用する。

shellを用意

```sh:./hoge.sh
target=`date +%Y-%m-%dT00:00:00`
echo "ACTIVATED_TIME=${target}" >> $GITHUB_ENV
```

github_actionから `hoge.sh` を呼び出して、環境変数に定義されたかを確認する

```yaml
name: sample
jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - name: set activated_time
        run: ./hoge.sh
        shell: bash
    - name: Test
      run: echo $ACTIVATED_TIME
```

# 参照
https://stackoverflow.com/questions/57968497/how-do-i-set-an-env-var-with-a-bash-expression-in-github-actions
Unreal Engine 4メモ：ビルドコンフィギュレーションごとにコンパイルスイッチを書きたい

#ビルドコンフィギュレーションに紐づくdefine定義
それぞれ下記の定義が存在する。ビルドコンフィギュレーションと一致する。

~~~
UE_BUILD_DEBUG
UE_BUILD_DEBUGGAME
UE_BUILD_DEVELOPMENT
UE_BUILD_SHIPPING
UE_BUILD_TEST
~~~

コンソールコマンド、デバッグ機能を入れた時のコンパイルスイッチは下記のようにすると良い。
また、`defined`を使ってはいけない。常に定義は存在し、内部で`0`と`1`を切り替えているので。

~~~
#if !UE_BUILD_SHIPPING
#endif
~~~

#参照
[ビルド コンフィギュレーションのリファレンス](https://docs.unrealengine.com/ja/ProductionPipelines/DevelopmentSetup/BuildConfigurations/index.html)
[Forums:How can I exclude debug code in shipped build ?](https://forums.unrealengine.com/development-discussion/c-gameplay-programming/13197-how-can-i-exclude-debug-code-in-shipped-build)
以上、以下、未満、超過のネーミング

メディアクエリの変数を作るときなど、
以上、以下、未満、超過のネーミングについていつも悩むので今後はこれで。

||ネーミング|意味|
|:--|:--|:--|
|超過|gt|greater than|
|以上|gte|greater than or equal to|
|以下|lte|less than or equal to|
|未満|lt|less than|

[@sdkei](https://qiita.com/sdkei)さんにコメントいただきました。

> 以上・以下も2文字で ge・le と書くことが多いようです。

ありがとうございます。



>参考 :
[Comparison Query Operators — MongoDB Manual](https://docs.mongodb.com/manual/reference/operator/query-comparison/)
[Bash Conditional Expressions (Bash Reference Manual)](https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html)
[関係演算子 - Wikipedia](https://ja.wikipedia.org/wiki/関係演算子)
SQL ~データベースの操作3~

初学者です。SQLの理解が浅いため纏めていきます。

- MySQL
- Ruby on Rails 6.0.0

# はじめに
ここではSQLというDBを操作する言語について記述します。

※この記事は、続きの記事です。
第一回目はこちらになります。よろしかったらどうぞ！

https://qiita.com/yumi1003/items/8dc8083884ebd6b9775e

今回はSQLのデータベースやテーブルに対して行う命令の中でも、**DMLについて**まとめていきます！

- [データ定義　「DDL（Data Definition Language）」](https://qiita.com/yumi1003/items/8dc8083884ebd6b9775e)

**↓今ここ**

- データ操作　「DML（Data Manipulation Language）」
- データ制御　「DCL (Data Control Language)」


# DML
データを操作するSQLです。**登録、更新、削除、検索**などの命令文が該当します。

|命令|機能|
|---|---|
|INSERT|データの登録　　|
|UPDATE|データの更新　　|
|DELETE|データの削除　　|
|SELECT|データの検索　　|

# データの登録

まずログインしていることが前提です。
また、使いたいデータベースの指定をしましょう。

```
% mysql -u root

mysql> USE データベース名;
```

## SELECT
**SELECT**は、データを取得する際に使用するSQLの句です。

- **取得するカラムを指定する際**は、以下のようにカラム名を指定します。

```
mysql> SELECT カラム名 FROM テーブル名
```

- テーブルに登録されている**全てのカラムのデータを取得する**場合は、下記のように書きます！

```
mysql> SELECT * FROM 《テーブル名》
```

ここで気になる「 * 」これはなんでしょう..?

## ワイルドカード
「 * 」は、**ワイルドカード**と言います。
意味は、**全てのパターンにマッチするもの**です。
文字の代わりに使うことができる特殊記号の一つになります。

SELECT句において、アスタリスク*が「全てのカラム」という意味のワイルドカードと定義されています。
そのため、全てのデータが取得できるということになります！

これを踏まえて、データの登録について学びましょ！

## INSERT
**INSERT**はテーブルにデータを登録するためのSQL文です。
**INTO**と言う句と合わせて、**INSERT INTO**として使います。
また、実際に設定する値に関しては、**VALUES**という句の後に入力します。

### 注意！
INSERT文は、全てのカラムに値を入れるか否かで文法が変わります！！

*全てのカラムに値を入れる場合*

```
mysql> INSERT INTO テーブル名 VALUES(値1, 値2, 値3);
```

*特定のカラムのみに値を入れる場合*

```
mysql> INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```

# データの更新

## UPDATE
**UPDATE**は、データを更新するためのSQL文です。
使用する際は、以下のように、①まずテーブル名を指定します。
そして、②**SET**という句の後に変更内容、③**WHERE**という句の後に条件を指定します！

```
mysql> UPDATE テーブル名 SET 変更内容 WHERE 条件;
```

以下のように表示されれば、正常に実行されています！(例)

```
mysql> update foods set price = 200 where id = 4;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql>
```

念の為、データが更新されているか確認しましょう！

```
mysql> SELECT * FROM テーブル名;
```

# データの削除

最後にデータの削除についてです。

## DELETE
**DELETE**は、データを削除するためのSQL文です。
実際は、テーブル名を指定するために、**FROM**句を、条件を指定するために**WHERE**句を合わせて使います。
記述は以下の通りです。

```
mysql> DELETE FROM テーブル名 WHERE 条件;
```

例として、ここでは「idの2」を消したいとします。

```
mysql> DELETE FROM テーブル名 WHERE id = 2;
```

以下のように表示されれば実行できています！

```
mysql> delete from テーブル名 where id = 2;
Query OK, 1 row affected (0.01 sec)

mysql> 
```

削除されているか確認しましょう。

```
mysql> SELECT * FROM テーブル名;
```

# 最後に
ここまでで基本的なデータベースやテーブルの基本操作は抑えました。
しかし、実際のアプリケーション実装においては、rails db:createなどのコマンドで置き換えられているため、あまり使いません。。。
より実践的な操作に関しては次回からです。

しかし、アプリの裏で動いているこれらの文や句について知ることは大切です。(何が起こってるか分からずに使ってるのとは違うと思います。)

それではお疲れ様でした！
Alfredのworkflowで、サクッと翻訳する

## はじめに

変数名を考えるときなど、英語→日本語や、日本語→英語を素早くほしいことがある。サクッと翻訳できるととても助かる。ブラウザでGoogle翻訳を開いていたが、頻度も多いし、Alfredのワークフローでやると便利だろうなとおもった。


## 環境

ここで書いていることは、下記のバージョンで実施しました。

- Alfred 4.3.2
- macOS BigSur 11.1


## つかったもの

Alfred のGoogle翻訳ワークフローを作りました。
https://qiita.com/nkmr_jp/items/ee47d0ef7f39816062a8

を使用。

> [DeepL翻訳をAlfred上で完結させるAlfred Workflow「DeepL-Translate」](https://webrandum.net/alfred-workflow-deepl/)もとてもいいと思うが、DeepLを使っているわけではないので（DeepLへの登録が必要みたい）

## 問題点

上記「Quick Translate」は控えめに申し上げてとても良いのだけれど、自分の使いかたでは２つの問題が発生。

- ホットキーではなくて、キーワードで開始してほしい
- 翻訳結果が返ってこないことがある


## 対策したこと

### キーワードで開始したい

Quick Translateの旧バージョン使用。[リリースページ](https://github.com/nkmr-jp/alfred-quick-translate/releases)の`13 Mar 2017`版。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/a65ce29d-57f9-16f4-a99f-1bad57d4cd60.png" width=50%>

`Script Filter`のところに`ge`と`gj`と指定。

> ge -> [g]oogle translate to [e]nglish or [g]o [e]nglish
> gj -> [g]oogle translate to [j]apanese or [g]o [j]apanese

ちなみに新バージョンは素敵な機能がいろいろついているが、`Script Filter`を使うのが難しくなっている。


### 検索結果が返ってこない

再現画像がないが、検索結果が返ってこなくなることがある。どうも`translate-shell`のほうで発生しているようなので

```sh
$ trans -D 'hello world' 1> stdout.log 2> stderr.log
```

で調べてみると、Google APIが`HTTP/1.1 429 Too Many Requests`と言っている。１文字入力するごとにAPIを呼び出しているので怒られているっぽい。

そこで

- `Script Filter` > `Language: ... Run Behavior`の`Queue Delay`を`Automatic delay after last character typed`に変更
- `Always run immediately for first typed arg character`のチェックボックスをオフ

![SS 2021-03-03 13.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/bd3a1d39-9723-a17f-2828-759fe05d37bd.png)

これで、APIを叩きに行く回数を減らす。

ただし、いちど`429 Too Many Requests`がでると、しばらく復活しない。そのときは、回避策として、`Script Filter` > `Script`の

```sh
TRANS=`trans -e "{query}"`
```

というところを、下記に変更（googleじゃなくてbingの翻訳を利用）。

```sh
TRANS=`trans -e bing -b "{query}"`
```

## ひとこと

いやあ、しあわせです。作者のみなさん、ほんとうにありがとうございます。
あまりきれいではない（genericでない）使いかたをして申し訳ないです。