OmniAICreator/Qiita-1.07M huggingface dataset:
javaのラムダ式について理解する[入門]


普段から何気なくラムダ 式記法を使って実装をしていますが、ラムダとはそもそも、どういう仕組みになっているのか改めて調べてみました〜。

## Javaのラムダ式とは


Javaのラムダ式とは、ざっくり言ってしまうと、`メソッドが１つしかないインターフェイスを簡単に実装するための記法`です。


色々記述を省略した結果として、ラムダ記法が生まれているので、
本来、ラムダ式を使わずに書くとしたらどうなるのか？というところから説明を始めます。

## サンプル1

```java:CalculatorInterface.java
public interface CalculatorInterface {
    public int calculate(int a, int b);
}
```

```java:MultiplyCalculator.java
public class MultiplyCalculator implements CalculatorInterface {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}
```

```java:Main.java
public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = new MultiplyCalculator();

        int result = multiplyCalculator.calculate(2, 5);

        System.out.println(result); // 10が表示
    }
}
```

掛け算を行うメソッドを持つ`MultiplyCalculator`クラスが`CalculatorInterface`を実装する形です。これは基本的な形ですね!!

ただ、実はわざわざ`MultiplyCalculator`クラスを作らずに実装する方法があります。

それが次のサンプル2です。

## サンプル2
```java:CalculatorInterface.java
package sample2;

public interface CalculatorInterface {
    public int calculate(int a, int b);
}
```


```java:Main.java
package sample2;

public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = new CalculatorInterface() {
            @Override
            public int calculate(int a, int b) {
                return a * b;
            }
        };

        int result = multiplyCalculator.calculate(2, 5);

        System.out.println(result); // 10が表示
    }
}
```

`MultiplyCalculator`クラスを作らず、mainメソッド内で上記のように書くことで実装できます。

```java
CalculatorInterface multiplyCalculator = new CalculatorInterface() {
     @Override
     public int calculate(int a, int b) {
         return a * b;
     }
};
```

この部分ですが、これは`CalculatorInterface`をimplementsする無名クラス(名前を持たないクラス)を生成し、その場でメソッドの実装を行っている形となります。

でも、実はもっと簡単に書けるんです、、！それが次のサンプル3になります。

## サンプル3

```java:CalculatorInterface.java
package sample3;

public interface CalculatorInterface {
    public int calculate(int a, int b);
}
```
```java:Main.java
package sample3;


public class Main {
    public static void main(String[] args) {
        CalculatorInterface multiplyCalculator = (a, b) -> {return a * b;};

        int result = multiplyCalculator.calculate(2, 5);

        // returnだけなら、{}も省略できます
        CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;

        int result2 = multiplyCalculator2.calculate(3, 4);

        System.out.println(result); // 10が表示
        System.out.println(result2); // 12が表示
    }
}
```

もっとすっきりしましたね!`CalculatorInterface`はメソッドが１つしかないので、どのメソッドをオーバーライドするのかが明白です。そんな場合、下記のような形で簡単にメソッドの実装内容を記述することができます。

```java
CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;
```
これがいわゆるラムダ式というやつです。こんな感じで、記法の省略を重ねるとラムダ式に達するんですね〜！

説明はこれで終わりです。
分かりにくいところあればコメントください〜
WindowsのPHPからSQL Serverに接続する方法

# 目的
普段LAMP環境でDBはMySQLばかり使っていたのですが、とある案件でDBにSQL Serverを選択することに。
Windows（XAMPP）上のPHP（Laravel）からSQL Severに接続するにあたり、必要なドライバー等を調べたので手順をまとめます。
# 手順
手順は以下の通りです。
## 環境調査
まずは自分のPHP環境を``phpinfo()``で下調べします。

確認するのは以下の3つ。

- PHP Version
- Architecture
- Thred Safety

![phpinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604718/52c81904-5ce6-06d2-d9dd-f1f952552e01.png)

上のスクリーンショット例では下記の情報をメモしておきます。
PHP Version : 7.3
Architecture : x64
Thred Safety : enabled

## ドライバーダウンロード
Microsftの公式サイトから``Microsoft SQL Server 用 Drivers for PHP``をダウンロードします。

### SQL server 2019用
https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver15

### SQL server 2017用
https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-2017

### SQL server 2016用
https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-2016


## ドライバーの配置
ダウンロードしたexeファイルを実行します。
実行するとファイルが展開されるので、そのファイルの中から環境にあったdllファイルをPHPインストール先の``php\ext\``にコピーします。
【例】XAMPPの場合は、``c:\xampp\php\ext``等

dllファイルは以下のようなファイル名になっているため、最初に調べた環境に合わせたものを選んでください。
``php_pdo_sqlsrv_[PHP Version]_[Thred Safety]_[Architecture].dll``
PHP Version : PHP7.3なら``73``
Thred Safety : enabledなら``ts``、disabledなら``nts``
Architecture : ``x32``もしくは``x64``

## php.iniの修正
``php.ini``ファイルにextensionの記述を追記します。
指定するファイルは先ほど配置したdllファイルです。
以下は初めに示したスクリーンショットの環境の場合での記述例です。

```ini:php.ini
extension=php_pdo_sqlsrv_73_ts_x64.dll
```

## 確認
Apacheを再起動後、再度``phpinfo()``を表示して反映されているか確認します。
``pdo_sqlsrv``が追加されていれば設定完了。
![pdo_sqlsrv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604718/a2a3b352-03be-3898-ff35-bea9ea6ba784.png)
Mac M1(Apple Silicon)でhomebrewをインストールできるの？

## 今まで通りにインストールしようとしたら...

現状、ターミナルから今まで通りhomebrewをインストールしようとするとこのような出力が表示されます。

```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Homebrew is not (yet) supported on ARM processors!
Rerun the Homebrew installer under Rosetta 2.
If you really know what you are doing and are prepared for a very broken experience you can use another installation option for installing on ARM:
  https://docs.brew.sh/Installation
```

今まで通りではダメみたいですね。

## 対策１ ターミナルをRossetaを使用して開くようにする
- ターミナルの情報を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/079ca27a-49f2-6ecb-4148-7d0b69763598.png)

`Rosetta`を使用して開くにチェック

そうすることでhomebrewのインストールが可能になります。

```
$ brew doctor

Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: You are using macOS 11.0.
We do not provide support for this released but not yet supported version.
You will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew's GitHub,
Twitter or any other official channels. You are responsible for resolving
any issues you experience while you are running this
released but not yet supported version.
```

## 対策2 /opt/homebrewに保存するように実行する

https://docs.brew.sh/Installation では
> However do yourself a favour and install to /usr/local on macOS Intel, /opt/homebrew on macOS ARM, and /home/linuxbrew/.linuxbrew on Linux.

とあります。
macOS ARMでは`/opt/homebrew`にインストールしてねと案内されています。

### 実行コマンド
```bash
cd /opt
mkdir homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```


### まとめ
せっかくのARMなので極力Rosetta使用したくないですよね。
いずれはuniversalに移行するのに...

状況に応じてインストールしましょう！

## 追記

homebrewがApple Siliconに対応したバージョンを発表しました。
Apple Siliconの場合は`/opt/homebrew`に自動でインストールしてくれるみたいです。
※ homebrewでインストールできるパッケージが全部Apple Siliconに対応したわけではありません。

- [macOS向けパッケージ管理システム「Homebrew」がApple Silicon搭載Macに正式対応](https://gigazine.net/news/20210208-homebrew-apple-silicon/)
Gitrunner、TerraformとGCPの連携におけるエラー

```ruby
Error: Error loading zone 'asia-northeast1-b': googleapi: Error 403: Required 'compute.zones.get' permission for 'projects/nttd-platformtec/zones/asia-northeast1-b', forbidden
```
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/75d8ca84-13b6-f73f-2763-b4d9a6e183bf.png)｜
|:-:|
Service accountを作成する際、上記赤枠にて"owner"のロールを設定すると、エラーがでず、Terraformでインスタンスが出来上がりました。
Rails エラーメッセージの日本語化

#はじめに
オリジナルアプリを制作しています。完成後は知人に使ってもらい、感想をフィードバックする予定です。その知人は日本人なので、エラー文は日本語にした方がより親切だと思いました。そのため、エラーメッセージの日本語化を行いました。

#目次
1.日本語の言語設定
2.Gemfileの追加
3.日本語化ファイルの作成
4.追加で日本語翻訳文言の設定


#1.日本語の言語設定
config.i18n.default_locale = :jaを追加する。この「ja」は日本語を表す。

```ruby:config/application.rb
module Pictweet
 class Application < Rails::Application
   # Initialize configuration defaults for originally generated Rails version.
   config.load_defaults 6.0

   # 日本語の言語設定
   config.i18n.default_locale = :ja
　　# 省略
 end
end
```

2.Gemfileの追加
Gemfileに追加後、忘れずにターミナルでbundle installを実行、サーバーを再起動する。

[公式 GitHub](https://github.com/svenfuchs/rails-i18n)

```ruby:Gemfile
gem 'rails-i18n'
```

#3.日本語化ファイルの作成
様々な言語に対応する言語ファイルをlocale(ロケール)ディレクトリに作成する。ここでは日本語化ファイルを作成する。ファイルの中身は下記リンク先の内容をコピペする。これにより、コピペした内容に該当するエラー文は日本語化される。

[公式 devise-i18n](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml)

```ruby:config/locales/devise.ja.yml
ja:
  activerecord:
    attributes:
      user:
        confirmation_sent_at: パスワード確認送信時刻
        confirmation_token: パスワード確認用トークン
#------------------省略------------------------------
      not_saved:
        one: エラーが発生したため %{resource} は保存されませんでした。
        other: "%{count} 件のエラーが発生したため %{resource} は保存されませんでした。"
```

#4.追加で日本語翻訳文言の設定
最後に日本語文の追加設定を行う。同じくlocalesディレクトリにja.ymlファイルを作成する。追加したい日本語とその英語を記述することで、カスタマイズできる。

```ruby:config/locales/ja.yml
ja:
 activerecord:
   attributes:
     user:
       nickname: ニックネーム
     desk:
       title: 画像タイトル
       image: 投稿画像
     suggestion:
       place: 掃除場所
       period_cleaning: 清掃期間
       last_cleaned_date: 最後に清掃した日
```
以下参考画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703987/3cbe2bbb-147d-1a51-3c77-9564452a2e80.png)
エンジニア単語帳（随時更新）

#エンジニア単語帳とは
完全に自己満で新しく覚えたことをまとめていきます！

###MVC（モデル・ビュー・コントローラ）


###レンダリング
テンプレートに記述されている変数などを実際に使う値に置き換えて表示を完成させる処理

###render関数
レンダリングを行う関数
render(Httprequest, 使用するテンプレートファイルのパス)

###HTTPメソッド
データをインターネット上でやり取りするときに使われるプロトコル（手続き）

###マイグレーション
データベースの移行を行うための機能。

* マイグレーションファイルの作成　

```
python manage.py makemigrations アプリの名前
```

* マイグレーションの適用

```
python manage.py migrate
```

を行う
【FileMaker】FileMaker Go単体でこれだけできる、、、のは、すご。

※今回は、読み物です。

FileMaker Go縛りで何ができるかを考えてみると、とどのつまりは、

「スタンドアロンだけれども、どこへでも繋がれる」

ことかな、と思います。

FileMaker GoももちろんFileMaker Serverへ接続して同じアプリを使用している人とデータの共有ができますが、昨今、いろんなAPIやJSON形式のデータがFileMakerでも扱えるようになってきたことから、

「じつはFileMaker Goだけでも色々繋がれるんじゃね？」

と感じ始めてます。

もちろん、FileMaker Serverでデータ共有した方が幅広く様々なことができるのは重々承知ですが、今時のサービスに接続できる可能性はFileMaker Go単体でも十分享受できる、というところまできています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0c0691bf-e677-e9ab-805a-47b71077aefd.png)


# 意外とできること
最近の実装で言うと、やはりFileMaker GoからcURLを使って様々なサービスへ接続することが多くなりました。
この1年くらいで、
・GMail API
・スマレジ API
・Google Calendar API
・Yahoo API
・Rakuten API
・zipcloud(郵便番号API)
などなどをFileMakerやFileMaker Goからつなぎました。

基本的には、cURLが使えるFileMakerバージョンであれば、割とどこにでも繋がれるなぁ、と言う感触です。

# Serverlessを実現する
最近請けたFileMaker開発で、

「既存のサービスを使っているから、わざわざFileMakerに同じデータを残して管理するのはコストが高い」

ということからFileMaker Go + GMail API + スマレジ APIという組み合わせのシステムにしたお客さま事例があります。
複数店舗や拠点で使う場合は、今までは例外なくFileMaker Serverの導入を勧めていたのですが、この案件のおかげで、

「そうか、既存のサービスと共存するときに必ずしもFileMaker Serverがなくてもいいんだ！」
（Claris社は儲からないかもしれないけど。。。）

と眼から鱗が出ました。
考えてみれば、よくよくわかることで、お客さまからすると、今までの社内のビッグデータをわざわざFileMakerに移し替えたところで活用できるかどうかは未知数であったり、その分の開発コストがかかることですぐに利用したいことができないことの方が問題なんですよね。

「付け足し」

が今あるサービスと仲良く共存していけることなのかもしれません。

# FileMaker Go 縛りでシステム作りを考える
Claris社からも[Claris Connect](https://www.claris.com/ja/connect/)というコードレスなサービスが出てきました。
そのほか、フリーな環境でも[n8n](https://n8n.io/)など多彩なサービスの連携ができる時代になってきたことから、これからは既存のサービスにいかに簡単に、シームレスに接続してビジネスを止めない方法を実装していくか、というのが試されると思います。
何でもかんでも自社のシステムをServerにお任せでなく、既存のサービスは便利に使っていき、補完する分をFileMaker Goでつなげていくというので十分業務効果をあげることができてきたんだなぁ、と感じてます。
また、昨今、Work at Homeなことが増えてきましたが、PCを持っていないけれどもタブレットはある、という人の方が多いと思います。
システム開発を仕事にしていない職場では、もしかしたらPCではなくタブレットだけで十分な環境もあるのではないでしょうか？
そういったところに、FileMaker Goから仕事を遂行していくという部分に焦点を当ててシステム構築をするのも今時感が感じられます。

# 本筋も考える
とは言いながら、システムのアップグレードや改修を考えたら、複数職場の環境ではServerを立ててあとはタブレットやPCという環境の方が絶対費用対効果が高いです。
FileMaker Goだけでいける環境はFileMaker Go単体で、単体で物足りなくなったり手間がかかるようになってきたらServerを導入、という、まずは最初の一歩というところでシステムを構築してみるのも一つのやり方としていいのかもしれません。

FileMaker Go、皆さんはどう使いますか？
VC++でDLLを作ってVC++/C#から呼び出してみた

#環境
- Windows 10 Home (64bit)
- Visual Studio Community 2019

#手順

##プロジェクトの作成
プロジェクト テンプレート：空のプロジェクト [C++]
プロジェクト名：dlltest

プロジェクトのプロパティ
全般
構成の種類：ダイナミック ライブラリ (.dll)

```dlltest.cpp
extern "C" __declspec(dllexport)
int __stdcall square(int x)
{
	return x * x;
}
```

初期化・終了化が必要なら `DllMain` を用意する。

#動作確認

##VC++

###プロジェクトの作成
プロジェクト テンプレート：空のプロジェクト [C++]
プロジェクト名：test1

```test1.cpp
#pragma comment(lib, "dlltest")

#include <stdio.h>

extern "C"
int __stdcall square(int x);

int main()
{
	int x = square(3);
	printf("%d\n", x);
}
```

`dlltest.dll` `dlltest.lib` をプロジェクトのディレクトリにコピーする。
dll は実行時のカレントディレクトリなどパスの通った所に置く。

##C＃

###プロジェクトの作成
プロジェクト テンプレート：Windows フォーム アプリケーション (.NET Framework) [C#]
プロジェクト名：WindowsFormsApp1

```Form1.cs
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        //[DllImport("dlltest")]
        [DllImport(@"C:\Projects\vc++\dlltest\Release\dlltest.dll")]
        static extern int square(int x);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var x = square(9);
            MessageBox.Show($"{x}");
        }
    }
}
```

`DllImport` は相対または絶対パスで指定できる。
パーマリンクとは

####パーマリンクとは、webページ毎に設定されたURL
---
サイトマップ構成によりいろいろなページがあるが、そのページ毎のURLのこと。
 パーマリンクはサイト構築の際、最初に設定したほうがいいらしい
なぜなら、ある一定の時間が経ってから設定を行うと問題が起こる
1.他のwebページからのリンクが無効になる
2.ソーシャルカウント(SNSによるshare数)がリセットされる
3.SEO評価がリセットされる
かなりパーマリンクってかなり重要なTaskなんですね！
---
####パーマリンク変更 > URLを変更するということ
リンク数=SEO評価に直結なので損害大!
初期段階で設定するべき
####ソーシャルカウントがリセットされる!
webページがSNSでシェアされるとその回数がカウントされカウント数が多い > SEO効果に直結

####パーマリンクはカテゴリ構造と記事内容を明確にすることでSEOに強いサイト運用を行うことができる。
マルチスケールシミュレーション特論9

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# assert\_equal


## 講義ページリンク

[チャート式ruby-IV(assert\_equal)](https://qiita.com/daddygongon/items/f6cea87314ee26e130ea)


## 内容

テスト駆動開発において頻繁に使用するassert\_equalを作成する


## 課題

2つの引数が等しいかどうかを出力するメソッドassert\_equalの作成


## 解答例

\#!/usr/bin/env ruby

```ruby
require 'colorize'

def assert_equal(expected, result)
  puts "expected: #{expected}"
  puts "result: #{result}"
  if expected == result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

def assert_not_equal(expected, result)
  puts "expected: #{expected}"
  puts "result: #{result}"
  if expected != result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 1)
assert_not_equal(1, 2)
```

出力

    > ruby assert_equal.rb
    expected: 1
    result: 1
    succeeded in assert_equal.
    expected: 1
    result: 2
    failed in assert_equal.
    expected: 1
    result: 1
    failed in assert_not_equal.
    expected: 1
    result: 2
    succeeded in assert_not_equal.

successedのとこは緑で，failedのとこは赤で表示される


# NOTE

-   今回は使ってないが，小数を比較するときは `.to_d` を使う(using BigDecimal)
-   関数内から関数名を取得するには `__method__` を使う
-   テストの部分を `if $PROGRAM_NAME == __FILE__`内に入れることで，このassert\_equalを外部から利用することができる
-   前回orgmodeでincludeしたソースコードにシンタックスを適用する方法がわからなかったが，ソースコードに`#+begin_src ruby` と `#+end_src` を書けばできた
    -   あまりソースコードに書き込みたくないけど
    -   また，シェバン(#!のやつ)がソースコードの上に出てくる
        -   シェバンの上に#+を書いたらシェバンがコメント扱いされる
    -   ちょっと気持ち悪いけど妥協する



------
 - **source** ~/multiscalesim_toku/grad_members_20f/members/lynd2299/mss9.org
マルチスケールシミュレーション特論：第 9 回をまとめてみた

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# assert\_equal について

今後の授業の方針として、テスト駆動開発を行っていく。assert equal とはequal かどうかを確かめる(assert)関数であり、この関数を使って授業を進める


## colorize

-   始める時に colorize というライブラリがないと怒られたなら以下のコマンドを行う

```bash
sudo gem install colorize 
```

-   この際に関学のプロキシーでライブラリのインストールができない人は以下のコマンドを使用する
    
    ```bash
    sudo gem install colorize -r -p http://proxy.ksc.kwansei.ac.jp:8080
    ```


## gem とは？

gem は ruby の library を管理するシステムの事

-   [gemについて](https://en.wikipedia.org/wiki/RubyGems)


## richer output

assert equal という関数の出力をより rich な物にしてみた。具体的には、以下の改良を行っている。

-   どうなったかを記述
-   引数でとってきた，expected, result の値をそのまま出力

```ruby
require 'colorize'

def assert_equal(expected, result)
  if expected == result
    print "#{expected} " + "#{result} " +"succeeded in assert_equal.\n".green
  else
    print "#{expected} " + "#{result} " +"failed in assert_equal.\n".red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)
```


# 正規表現について


## 正規表現(regular expression)

正規表現は文字情報を取り出す便利ツールである。しかしいきなり使用するのはハードルが高い。[Rubular](http://rubular.com) で練習を行うのが良い。


## Rubular


### 使い方

-   Your regular expression
    -   <font color="red"> **正規表現** </font>を書く。その結果として、test string から正規表現を適応した結果が出力される

-   Your test string
    -   テスト用の文章を書く


### Regex quick reference

簡単な正規表現の使い方が示されている


# 参考文献

-   <https://en.wikipedia.org/wiki/RubyGems>
-   <http://rubular.com> (この URL に簡易的な正規表現の扱い方も記されている)



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class9.org
Chrome拡張機能をSafari拡張機能にコンバートしてみた - Big Sur

最新版のmacOS「Big Sur」がリリースされましたね。
Big Surの新機能のひとつに「Chromeの機能拡張をSafariに移植」できる機能が実装されました。

> WebExtensions APIの新しいサポートと移行ツールを使って、デベロッパはChromeの機能拡張をSafariに移植できます。お気に入りのデベロッパによる新しいSafariの機能拡張を使って、ウェブ体験をカスタマイズできます。

本記事では、早速Chrome拡張機能からコンバートしてみましたので、その手順について書きます。

【注意事項】
執筆当時のマニフェストV2までに対応していますが、それ以上のマニフェストバージョンには対応しておりませんのでご注意ください。

# コンバート手順・導入手順

以下の手順にて、コンバートから導入までを行います。

## 1 / macOSのアップデート
まずは、macOSをアップデートしてBig Surを入手してください。

## 2 / XCodeのアップデート
Safari拡張機能へコンバートするにはXCode 12の機能を使います。XCodeもApp Storeからアップデートしてください。

## 3 / コンバート

このページに記載のコマンドにてコンバートします。　
https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari

ターミナルを開いて以下のコマンドを実行してください。
※ 「/path/to/extension」はChrome拡張機能のフォルダパスに置き換えてください。
　今回は自作の拡張機能を変換します。

```bash
xcrun safari-web-extension-converter /path/to/extension
```

実行すると、Chrome拡張機能の名前がApp Nameに表示されます。

Is this correct?（変換するものは、こちらで合ってますか？）と聞かれるので「yes」を入力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/5580fbaf-55d8-177e-6934-2d8b532efb02.png" width="700">

すると、Xcodeが起動し、以下のようなプロジェクトが作成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/d71d32ec-13c0-5704-4d56-5b1bff2b0c8e.png" width="300">


XCodeで「▶️」を押下してビルドします。（以下、手順参考）
https://developer.apple.com/documentation/safariservices/safari_app_extensions/building_a_safari_app_extension#2957926

「Buid Success」と表示されればビルド成功です。

こんな画面が出ますので「Quit and Open Safari Extensions Preferences...」（終了してSafari拡張機能の設定を開く）ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/ef46349d-6432-f3ed-4861-f853e5c54f75.png" width="500">


## 4 / Safari拡張機能のインストール

Safariを起動して、「開発」 > 「未署名の機能拡張を許可」を押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/51b35962-107e-c236-c661-993ba0b2ebd5.png" width="400">


Safariのメニューから「Safari」 > 「環境設定」 > 「機能拡張」を選択すると、拡張機能の設定画面が開けます。

ビルドした拡張機能のチェックボックスをONにします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/44121456-5652-0e13-f267-8ab8ce857216.png" width="800">

## 5 / 動作確認、完了

最後にSafariで動作確認して完了です。
簡単でしたね。

# おわりに

弊社、株式会社シクミヤでは業務自動化・効率化のご依頼を承っております。
「乱数表からの自動認証ツール」もその一貫で作成した成果物で、
乱数表PDFから認証画面へとコピペする手間を軽減するための拡張機能です。
ぜひお困りごとがありましたら、お気軽にご相談ください。
Apacheでhttps(ssl)化する方法

#項目
1. Apacheのインストール
2. 起動確認
3. httpsを有効化

# 1.Apacheのインストール
```bash:bash
#まずAWSにリモートログイン
$ ssh -i ~/.ssh/FirstKey.pem ec2-user@(パブリックIP)

# 仮想マシンを最新版に
$$ sudo yum -y update

# sudoコマンドでApacheをインストール
$$ sudo yum -y install httpd

# Apacheを作動
$$ sudo service httpd start

# 動くようにする
$$ sudo chkconfig httpd on
```

# 2.起動確認
- `http://(パブリックIP)`でtestページが出れば成功

```
#/var/www/htmlの中身を確認、Apacheはここにhtmlコンテンツがあると動く
$$ ls /var/www/html

#sudoコマンドでviを起動し、前述の中に作られた"index.html"に何か書くよと言う事
$$ sudo vi /var/www/html/index.html
```

# 3.httpsを有効化
## 3-1.まず必要なモジュールを入れる
```bash:bash
$$ yum -y install mod_ssl
$$ httpd -M |grep ssl
```
##3_2.秘密鍵とサーバの証明書を作る
```bash:bash
#鍵を作る
$$ openssl genrsa > server.key

#証明書作成
$$ openssl req -new -key server.key > server.csr
#Country Name (2 letter code) [XX]:JP
#State or Province Name (full name) []:都道府県名
#Locality Name (eg, city) [Default City]:市区町村
#Organization Name (eg, company) [Default Company Ltd]:空白
#Organizational Unit Name (eg, section) []:空白
#Common Name (eg, your name or your server's hostname) []:空白
#Email Address []:空白
#A challenge password []:空白
#An optional company name []:空白

#証明書を有効化
$$ openssl x509 -req -signkey server.key < server.csr > server.crt

#証明書はもういらないので消しちゃう
$$ rm server.csr
```
## 3_3.作成した鍵とかをいい場所に保存させる
```bash:bash
#/etc/httpd/conf.d/ssl.confにいれる
$$ vi /etc/httpd/conf.d/ssl.conf

#SSLCertificateFile /etc/pki/tls/certs/localhost.crtをコメントアウト
#このスクリプトの下に`SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt`を添付
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.keyをコメントアウト
#このスクリプトの下に`SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key`を添付

#Apacheをリスタートし反映
$$ sudo service httpd restart
```
- この後、`https://(パブリックIP)`で接続制限ページかテストページが出ればOK

#4.終わりに
なんかエラーが出る可能性があるらしいので、

```bash:bash
$$ vi /etc/selinux/config
#SELINUX=をdisabledに変更
#`i`で記述モード、`esc`で記述を終了し、`:wq`で保存終了
```
これでいけるらしい。
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.となった時の対応方法


# 事象 : リポジトリ作成後に初回addを取り消そうとしたら怒られた
- 環境
    - Windows10 64bit バージョン1909
    - git version 2.25.0.windows.1


1. リポジトリを作成
1. 初回add
1. あっ・・・いらないものまでaddしちゃったから取り消そう

```bash
$ git reset HEAD .
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
```

## 原因 : HEADがないから
そりゃそうだ・・・で、どうしたらaddを取り消せるのか・・・

> HEAD
> 最新コミットのスナップショットで、次は親になる
> [Git - リセットコマンド詳説](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A9%B3%E8%AA%AC)

### 対応 : なにも指定しないで`git reset`
参考 : [初心者のGitメモ](https://qiita.com/mochizukikotaro/items/141c9d0d24e45d87c5eb#%E8%BF%BD%E8%A8%98%E6%94%B9%E3%82%81%E3%81%A6-git-reset-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

```bash
$ git reset

# おぉぉ、戻ったぁ
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        docs/

nothing added to commit but untracked files present (use "git add" to track)

```
マルチスケール特論 第9回

![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# 関数で自身の名前を取得する

    __method__

で取得できる

## example

```ruby
# frozen_string_literal: true

require 'colorize'

def assert_equal(expected, result)
  puts "expected: #{expected}"
  puts "result:   #{result}"
  if expected == result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

def assert_not_equal(expected, result)
  puts "expected: #{expected}"
  puts "result:   #{result}"
  if expected != result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

assert_equal(1, 1)
assert_not_equal(1, 2)
```

### result

```
% ruby assert_equal.rb
expected: 1
result:   1
succeeded in assert_equal.
expected: 1
result:   2
succeeded in assert_not_equal.
```

# org でコードを貼り付ける

今までは#+begin\_src と #end\_src の中身にコードを直書きしていた。が、#+include を使えば、どっかのタイミング(予想では qiita\_org で org から md を生成するとき)でファイルの中身を展開してくれるらしい。ただし、ファイルの先頭と末尾に **#+begin\_src ruby** と **#+end\_src** を記述する必要がある。

```ruby
# frozen_string_literal: true

require 'colorize'

def print_expected_and_result(expected, result)
  puts "expected: #{expected}"
  puts "result:   #{result}"
end

def assert_equal(expected, result)
  print_expected_and_result(expected, result)
  if expected == result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

def assert_not_equal(expected, result)
  print_expected_and_result(expected, result)
  if expected != result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_not_equal(1, 2)
end
```

# Rubular

<https://rubular.com/> a Ruby regular expression editor正規表現、よく使うけど毎回よくわからなくなるから、interactive に結果を返してくれるのは試行錯誤がとてもやりやすいので嬉しい。

## scan と match

ref: [【Ruby】scanとmatchの違い](https://qiita.com/masashikawafuji/items/c769714e8dc960b5ebb3id:)

------
 - **source** ~/ghq/github.com/TeamNishitani/grad_members_20f/members/syasin-5d/9th.org
[丁寧に解説]  DDLファイルを使ってMySQLデータベースを共有する方法

# チーム開発の問題
チームでアプリ開発を行っている学生です。
先日こんなことがありました。
バックエンドを担当しているメンバーが、ローカルで作成したデータベースを共有したいと。
皆さんの解決方法を是非ご教授いただきたいのですが、私達はDDLファイルを使っての共有を行いました。

#### DDLとは
> データ定義言語（Data Definition Language, DDL）は、コンピュータ利用者あるいはアプリケーションソフトウェアが、コンピュータのデータを定義するコンピュータ言語もしくはコンピュータ言語要素である。

つまり、DDLファイルとはデータベースを定義するためのコンピュータ言語を記入したファイルのことになります。

# データベースの共有
このファイルをアプリケーションのディレクトリに配置し、Gitなどで管理すればメンバーへの共有が簡単に行えます。
**ただのファイルですから、通常のコードと扱いは同じです。**

# 実行環境
####**OS**:  Windows
####**コンソール** : Git Bash
####**DB** : MySQL( Server version: 8.0.22 )
####**共有** : Git 


# 参考記事　＋　やること
#### [MySQLでファイルからSQLを実行する] (https://qiita.com/IysKG213/items/994e9f4ad12ff8aee322)
今回は、上記のQiitaの記事を参考に行わせて頂きました。

この記事では、以下の手順を解説いたします。
####1. DDLファイルの作成
####2. DDLファイルの実行
####3. コードの共有　(Gitの解説になるので、割愛)



# やりかた
###1. DDLファイルの作成

```
/* DBの作成*/
CREATE DATABASE testdb;

/* テーブルの作成 */
CREATE TABLE testdb.user(
	ID int,
	name varchar(10),
	mail varchar(20)
);

/* テーブルへのデータ追加 */
insert into testdb.user values(1, 'test1', 'test1@abc.co.jp');
insert into testdb.user values(2, 'test2', 'test2@abc.co.jp');
insert into testdb.user values(3, 'test3', 'test3@abc.co.jp');

※DDLファイルにコメントを追加する際は、//ではなく、/**/を使わないとコメントと認識しないのでご注意を！

```
####このファイルは、setup_db.ddlというファイル名で保存します。

###2.DDLファイルの実行
さぁ、作ったDDLファイルを実行してみよう！
#### 準備
- MySQLをPCにインストール 
- コンソールにパスを通す
- コンソール上で、先程作ったDDLファイルがあるディレクトリに移動する。

####実行
```
mysql -u root -p < setup_db.ddl
```
ログインする時に使ういつものコマンドに、「＜」、ファイル名を連結する。
このあとにパスワードを入力し、何のメッセージも返ってこなかったら成功！

#コードの共有
通常のファイルと同じ扱いができるので、Gitで管理しているディレクトリにファイルを追加して、PUSHすれば共有完了です。

#まとめ
今回は、間接的な意味でDBの共有の仕方について解説させていただきました。
DBの共有をする際の正しいやり方、デファクトスタンダードは存じ上げないので、もし他の方法があるなら教えて下さい。
PowerVS IBM i 日記(28): 東京 04 の PowerVS はストレージの IOPS に制限あり。今後は他の DC も ?

# 東京 04 の PowerVS はストレージの IOPS に制限あり。今後は他の DC も ?

「[PowerVS が東京 TOK04 にやってきた](https://qiita.com/6onoda/items/4
5813e33ca404236b348)」ので、東京 04 で IBM i のテストをしているのですが、他の DC のインスタンスに比べて、小さなインスタンスが妙に遅い気がしていました。

ストレージの IOPS 制限のせいだったのかもしれません。
東京 04 の PowerVS はストレージの IOPS に制限が、かかっているようです。

IOPS の制限は接続したストレージ容量に比例します。
データ量だけからストレージ容量を決定すると、十分なパフォーマンスが出ない場合があります。

IBM i は RDBMS 処理を主体としたシステムで、ストレージの I/O はパフォーマンスに直結します。
他の OS 以上に注意が必要です。

## 英文の資料には記載あり

英文の資料 (Docs) には記載がありました。

[What is a Power Systems Virtual Server? - Storage tiers]
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server&locale=en#storage-tiers

> **Storage tiers**
>
For each Power Systems Virtual Server instance, you must select a storage tier - Tier 1 or Tier 3. The storage tiers in Power Systems Virtual Server are based on I/O operations per second (IOPS). It means that the performance of your storage volumes is limited to the maximum number of IOPS based on volume size and storage tier. Although, the exact numbers might change over time, the Tier 3 storage is currently set to 3 IOPS/GB, and the Tier 1 storage is currently set to 10 IOPS/GB. For example, a 100 GB Tier 3 storage volume can receive up to 300 IOPs, and a 100 GB Tier 1 storage volume can receive up to 1000 IOPS. After the IOPS limit is reached for the storage volume, the I/O latency increases.
>
**Note**: Currently, the IOPS-based storage tiers are available only in TOK04 data center.

* Tier 1 の場合 10 IOPS/GB、Tier 3 の場合 3 IOPS/GB の制限がある
* 現在、この制限は 東京 04 のみ

起動ボリュームの 80 GBしかない場合、Tier 3 では 80 * 3 = 240 IOPS/GB ！！

オンプレからの移行時には、容量だけでなく、IOPS にも注意を払う必要があります。

東京 04 の記載があるのに「Last updated: 2020-06-10」!! になっています。

##  日本語の資料には記載なし

表示言語を日本語に切り替えました。

* [Power Systems Virtual Server とは?](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server&locale=ja#storage-tiers)

Storage tiers の項目自体がありません。

「最終更新日: 2020-06-10」で、ここは英文をと共通なのですが...

## 自己防衛のためには

ユーザーが自己防衛できるとしたら、まずは資料は英文を読むことでしょうか。
そして、不明なら問い合わせましょう。
[資料が間違っている事](https://qiita.com/6onoda/items/d9949d3154fa75042a23)もあります。

「[技術よりな人が最初に読む_IBMCloud柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)」の更新をチェックすることも有効でしょう。

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
Rubyの出力

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badg>)


# 出力しよう


### Hello world.を出力してみよう&#x2026;

```ruby

print("Hello world")

```

    $ruby HelloWorld.rb
    Hello world　$

出力はできた


### 出力メソッド&#x2026;

| メソッド | 結果                    |
|:---------|:------------------------|
| print    | 出力                    |
| puts     | 出力(自動改行)          |
| ptintf   | 出力(Cと一緒)           |
| pp       | デバッグ出力            |
| p        | デバッグ出力            |

このようにrubyの出力はいろいろあるみたい


# 入力しよう


### 入力メソッド&#x2026;

入力方法も複数あるみたい

| method     |                 |
|:-----------|:----------------|
| ARGV[引数番号]| ruby code.rb 引数|
| gets()     | キーボードから取得(文字列)|
| gets.to\_i()| キーボードから取得(整数)|
| gets.to f()| キーボードから取得(浮動小数点)|

使ってみる

ARGV[]

```ruby
puts "Hello #{ARGV[0]}"
print "#{ARGV[1]}#{ARGV[2]}\n"
```

    $ ruby ARGV.rb World 今日は 水曜日
    Hello World
    今日は水曜日 

こんな感じで出力と入力ができた



------
 - **source** ~/grad_members_20f/members/0922tooy/No5.org
Unityテクスチャアトラス


画面右が元のテクスチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/1ff8489d-e7ab-f2ac-8a6b-04c0165e6bdd.png)

# RawImage
UV Rect
左上 xy 0.0 0.5 wh 0.5 0.5
右上 xy 0.5 0.5 wh 0.5 0.5

左下 xy 0.0 0.0 wh 0.5 0.5 
右下 xy 0.5 0.0 wh 0.5 0.5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/808cfbf9-dae7-c56a-033b-5fe92c16a36b.png)

左下が原点かな。

# 8分割
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/f189239d-55c4-1dab-ffdf-ad63d8522f0f.png" width=50%>

xywh
wh = 0.25, 0.5
左上：0,0.5,
左下：0,0 
ベジータ：0.25,0.5
ブロッコリ:0.25,0
人参:0.5,0.5
紫：0.5,0
草：0.75.0.5
トマト:0.75,0
【jQuery】領域外のクリック時にメニューを閉じるようにする

jQueryでスマホ用メニューをクリックした際にメニュー以外の領域をクリックした際にメニューを閉じるようにしたい。

このサイトで✕ボタンでしかメニューが閉じないのは不便。
<a href="https://gyazo.com/7da28b6ce6f11d9368b21cf56ebd98c6"><img src="https://i.gyazo.com/7da28b6ce6f11d9368b21cf56ebd98c6.gif" alt="Image from Gyazo" width="226"/></a>

メニュー以外をクリックした際にこんな感じで閉じたい。
<a href="https://gyazo.com/e76de6d810a55276681147f821229879"><img src="https://i.gyazo.com/e76de6d810a55276681147f821229879.gif" alt="Image from Gyazo" width="226"/></a>

# 実装

今回のサイトはWordPressで作っていたため、テーマにのっとってコードを追記する必要があります。

そこで、devモードでコードを見ると、ハンバーガーメニューをクリックすると``menu-toggle``クラスにactiveクラスが付与されるようにしていて、activeクラスがある場合はメニューがひらっきぱなしになるように組まれていました。

```html
//メニューが閉じてるとき
<div class="menu-toggle">

//メニューを開いてるとき
<div class="menu-toggle active">
```

というわけで、メニュー外をクリックしたら、``menu-toggle``の部分から``active``を取り除くコードを記載すればOKです。

```javascript

  jQuery(document).ready(function($) {
    var nav = $('.menu-toggle');
    $('.main-section').click(function() {
     //ここでnavの部分がactiveクラスを持っているか確認
      if(nav.hasClass('active')) {
        $('.menu-toggle').removeClass('active');
      }
    });
  });
```

``jQuery(document).ready(function($)``としているのは、サイトのHTMLを完全に読み込んでからこのjQueryを実行させたいからです。
とりあえずContactForm7の英語スパムを無くす方法

WordPressプラグイン「ContactForm7」を使用したフォームに、スパムメールが届くようになってきたので
とりあえず英語のスパム無くす方法( ..)φメモ

```functions.php
function wpcf7_spam3( $result, $tag ) {
  $value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-name']));
  if (!empty($value)) {
    if (preg_match('/^[!-~]+$/', $value)) {
      $result['valid'] = false;
      $result['reason'] = array('your-name' => '日本語で入力してください');
    }
  }
  return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_spam3', 10, 2 );
```

日本語が入力されていなければ「日本語で入力してください」とエラー表示されます。
上記コードだと"your-name"に日本語が入っていなければ、はじかれます。

項目を変更したい場合は"your-name"の部分を変更すればOKです。

### MW WP Formの場合
標準でついている機能「フリガナの入力欄」を追加するだけで英語スパムの対策できます。
UXデザイン=DB設計【2020/11/18】

[オブジェクト指向UIデザイン](https://www.amazon.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS%E3%83%97%E3%83%A9%E3%82%B9%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511/ref=sr_1_3?dchild=1&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI&qid=1605680519&sr=8-3)を読んだ。


完全にエンジニアの視点から、デザインに取り組んだ良書だった。

今までのデザイン本だと、ラインを揃えるとか、項目ごとにまとめるとか、繰り返しを多用するとか、どちらかというと細かい話が多かったのに対して、こちらは要件定義レベルで、アプリケーション何ページ必要、とかを解説していた。

---

### UXデザイン = DB設計

DB設計の考え方が、実はそのままUIにも使えるよ、というお話。

- 動詞: やりたいこと

　　　ではなくて

- 名詞: 扱いたいもの

　　　に注目する。

おそらく、設計の手順としては、

1. DB設計
2. UX設計
3. ようやくプログラミング(オブジェクト)の設計

の順番が良い。

__ページ数が少ないのは正義__
No.9: ruby-appendix-V(rubular)



# 学習内容

-   正規表現


# 正規表現

-   正規表現オブジェクト
    -   比較
        -   正規表現と文字列を比較するときには \`=~\` がよく使われる。
            
            マッチした場合にはマッチした位置(0 以上の値)、しなかった場合は nil が返る。
        
        -   例
            
            ```ruby
            if '123-456'== /\d{3}-\d{4}\
                puts ' matched'
            else
                puts ' unmatched'
            end
            ```
            
            -   マッチしないときを真にするときは \`!~\` を用いる。
    
    -   キャプチャ
        -   match オブジェクトを利用することで一致する部分を抜き出すことができる。
        -   出力は MatchData オブジェクトが返される。これは [] を用いることで、配列と同様に扱うことができる。
        
        -   例
            
            ```ruby
            text = '本日は2020年11月18日です。'
            if m = /(\d+)年(\d+)月(\d+)日/.match(text)
                puts ' matched'
                puts m[0]
            else
                puts ' unmatched'
            end
            ```


# 参考

-   講義ページ

<https://qiita.com/daddygongon/items/5e2de543400fe56be768>

-   プロを目指す人のための Ruby 入門

<https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-ebook/dp/B077Q8BXHC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ruby&qid=1605077175&sr=8-1>



------
 - **source** ~/classes/muli_scale/grad_members_20f/members/keita_k7/memo/c9-2.org
Boto3でAWSのリソースを取得する時に作成したリソースだけ表示する

# 前提

AWSのリソースをBoto3で取得する時に、一部のリソースだと作った覚えのないリソースが含まれてしまうことがある。
これらはおそらくAWSが自動で作成したり、デフォルトで用意されているものだろう。
私の場合、スナップショット一覧を取得しようとしたら、AWSコンソール上では見たことないし、作った覚えがないリソースがあった。
以下がソースである。

```python
client = self.session.client('ec2')
snapshots = client.describe_snapshots()
```

# 対処方法

**自身が作成したものだけ**を表示するためには```OwnerIds```を指定してあげれば良い。

### 自分が作ったリソースを表示

```python
client = self.session.client('ec2')
snapshots = client.describe_snapshots(OwnerIds=['self'])
```

### ユーザIDを指定

```python
client = self.session.client('ec2')
snapshots = client.describe_snapshots(OwnerIds=['xxxxxxxxxxxx'])
```

※ xxxxxxxxxxxx にユーザIDを指定
herokuで環境変数を設定する際の注意点

#この投稿について

ポートフォリを作成の際にGoogle認証を取り入れたいと思い、ユーザー登録や、ログインを行ってくれる"Omniauth"というGemを導入しました。
ところが、環境変数に設定しようとした際に、うまく設定できなかったため、どんな理由でエラーが起きて、どのように解消できたのかを記事にしています。


## herokuに環境変数を設定するとき

##### heroku config:set
というコマンドを使用します

実際には、
#####heroku config:set GOOGLE_CLIENT_ID="~~~~~"

このようなコマンドで追加します。
このとき、 『=』と『""』の間にスペースを入れるとエラーが発生してしまいます。

##### heroku config:set GOOGLE_CLIENT_ID = "~~~"
このようにしてしまうとエラーが発生してしまうので、設定できませんでした。

なので、まとめると環境変数に設定するときは、無駄なスペース入れず、コピペして貼ってしまうことをお勧めします。
crontabでコマンドを定期実行する

## cronとは
unix系OS(CentOS、Ubuntuなど)で使えるプロセス(≒機能)。
主に決まった時間に定期実行したいプログラムを動かすために使う。

## 設定方法
```zsh
$ crontab -e
```
viエディタが立ち上がるので、以下のルールに従って記述

```zsh
分 時 日 月 曜日 ユーザー名 コマンド
*  *  *  *  * root some_command
```
|指定対象|指定範囲|
|:-:|:-:|
|分|0〜59|
|時|0〜23|
|日|1〜31|
|月|1〜12 または jan〜dec|
|曜日|0〜7 または sun〜sat|
```zsh:記述例
# 1分ごと
* * * * * root touch /home/ubuntu/test.txt

# 1:00〜1:59まで1分ずつ実行
* 1 * * * root touch /home/ubuntu/test.txt

# 毎日1:00に実行
0 1 * * * root touch /home/ubuntu/test.txt

# 毎月12日~20日00:00に実行
0 0 12-20 * * root touch /home/ubuntu/test.txt

# 毎週月曜日〜金曜日00:00に実行
0 0 * * 1-5 root touch /home/ubuntu/test.txt
```

## オプション
```zsh
# 設定されているcronを表示する
$ crontab -l 
# 全てのcronを削除、-eオプションと押し間違えないように注意
$ crontab -r
```

## 参考
- [初心者向けcronの使い方 - Qiita](https://qiita.com/tossh/items/e135bd063a50087c3d6a)
- [Cronの使い方とテクニックと詰まったところ - Qiita](https://qiita.com/UNILORN/items/a1a3f62409cdb4256219)
- [crontabコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-crontab)
GUIでWeb開発！？コード要らずの開発ツール .bubbleに入門してみた。

# はじめに
GUIでWeb開発ができるツール (NoCodeツール) が広まってきてる印象を受けたので、今回 NoCodeツールの1つである .bubble に入門してみました！ 

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/acfc59b1-a0b8-651d-e75d-1881d542486a.png' width='650'>

## そもそも、NoCodeって何？
そもそも、<b>NoCodeって何があるの？</b>というところから、簡単に調べてみました。

以下に、[No-Code - Unleashing Creativity on the Internet](https://alexandre.substack.com/p/-no-code-unleashing-creativity-on?utm_campaign=post&utm_medium=web&utm_source=copy) に記載されているカオスマップを載せておきます。

少しみていくと、Webアプリやモバイルアプリを作れるものから、社内ツールアプリ、連携アプリなど様々な種類があるのがわかります。

やっすんの本業はWeb開発メインなので、Web開発ができるサービスの中で有名どころの <b>.bubble</b> について入門してみることにしました。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/c2710ac9-171e-bd65-6fc6-c29a0a4ac81d.png' width='750'>


# YouTube動画
動画で学びたい方はこちらをどうぞ！
[【YouTube動画】 コードなしでアプリを作れるbubbleを紹介。エンジニアなしの未来は来る？](https://youtu.be/5mfMOKF0VF0)
[![コードなしでアプリを作れるbubbleを紹介。エンジニアなしの未来は来る？](https://img.youtube.com/vi/5mfMOKF0VF0/0.jpg)](https://youtu.be/5mfMOKF0VF0)

# 基本操作
プロジェクト作成時の画面はこんな感じです。

サイドバーに色んな項目があります。
Designはフロント側・UIを作るのに使い、Worfkflowはバックエンド側、DataでDBを作れるようです。
![_2020-11-05_0.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/07ea43d9-7b49-c221-c1e8-970720746bcd.png)

## UIを作る (Design)
ドラッグ & ドロップで入力フォームや送信ボタンを作れます。

配置するときもナビゲーションが出てくるので、合わせやすいです。
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/ccaa26e3-b16b-5142-7fd8-d8492dbcb941.gif)

## DBを作る (Data)
Table名、各カラム名とデータの型を決めて作ります。
DynamoDBを手動で扱うときと同じような感じです。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/c642e4b9-3fc5-e671-37c3-462e16dccfc9.gif)


## バックエンド側の処理を作る (workflow)
ここは少しややこしいです。

まず、ボタンクリック時に何をするかを選びます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/d275470a-4310-3bd6-591f-68de23ff6fd1.png' width='450'>

データを追加する場合は、何のデータを追加するか選びます。
現在のユーザー情報だったり、入力値だったり、色んなものが選べます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/21b3c5cf-a229-0df7-7953-720d50722b60.png' width='300'>

全体の流れはこんな感じです。
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/3357e220-f046-7847-0cb1-68ea6961665e.gif)


## 実際の動きをみる
右上のPreviewをクリックすると、現時点でのアプリの動きをみることができます。

ただ、テストとかは書けないようです。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/e829e920-3756-7894-310e-d4191bee177c.png' width='550'>


# おわりに
.bubbleは直感的にアプリを作れるので、少し可能性を感じますね。
Tutorialも豊富なので、興味を持たれた方は触ってみると良いかもしれません。
Unity 2019 アップデート時 Android ビルドスクリプトを修正した

# 概要

Unity で Android ビルドをしていたスクリプトが Unity 2018 から Unity 2019 にアップデートしたときに動かなくなってしまったため修正しました。

Android ビルドは一度 Gradle プロジェクトを出力するビルドパイプラインにしています。

# Unity 2018 のビルドスクリプト

Gradle プロジェクトを出力するコード部分の抜粋です。

```cs
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
        // 実行
        var buildReport = BuildPipeline.BuildPlayer(
                              sceneList,                          //!< ビルド対象シーンリスト
                              Path.Combine(Directory.GetCurrentDirectory(), AndroidBuildDirName), //!< 出力先
                              BuildTarget.Android,                    //!< ビルド対象プラットフォーム
                              BuildOptions.AcceptExternalModificationsToPlayer |
                              BuildOptions.Development            //!< ビルドオプション
                          );
```

このコードを実行すると指定の出力先に Gradle プロジェクトができていました。

# Unity 2019 のビルドスクリプト

同じスクリプトを Unity 2019 で実行したところ、`BuildPipeline.BuildPlayer` 実行時に `InvalidOperationException: The build target does not support build appending.` というエラーがでて実行できなかった。

以下のフォーラムを参考に、 

- `BuildOptions.AcceptExternalModificationsToPlayer` のオプション指定を削除
- かわりに `EditorUserBuildSettings.exportAsGoogleAndroidProject = true;` の設定を追加

しました。

フォーラム: https://forum.unity.com/threads/oculus-build-invalidoperationexception-the-build-target-does-not-support-build-appending.994930/

```cs
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
        EditorUserBuildSettings.exportAsGoogleAndroidProject = true;
        // 実行
        var buildReport = BuildPipeline.BuildPlayer(
                              sceneList,                          //!< ビルド対象シーンリスト
                              Path.Combine(Directory.GetCurrentDirectory(), AndroidBuildDirName), //!< 出力先
                              BuildTarget.Android,                    //!< ビルド対象プラットフォーム
                              
                              BuildOptions.Development            //!< ビルドオプション
                          );
```

無事に実行でき、指定の出力先に Gradle プロジェクトができていました。

また、Unity 2018 のときと出力されるGradle プロジェクトのディレクトリ構成が変わっています。これはディレクトリ構成確認して gradle 実行位置を修正をすることで解決しました。生成されている `local.properties` に UnityEditor が同梱する SDK, NDK のパスが指定されるようになって CI のメンテナンスが楽になりそうな印象。

# 参考

- フォーラム
  - https://forum.unity.com/threads/oculus-build-invalidoperationexception-the-build-target-does-not-support-build-appending.994930/
- BuildOptions.AcceptExternalModificationsToPlayer
  - https://docs.unity3d.com/ja/current/ScriptReference/BuildOptions.AcceptExternalModificationsToPlayer.html
  - Unity 2018 から変更があるように見えないため、実行時エラーになったのはなんでだろうと思っている。
- EditorUserBuildSettings.exportAsGoogleAndroidProject
  - https://docs.unity3d.com/ja/current/ScriptReference/EditorUserBuildSettings-exportAsGoogleAndroidProject.html
Traefikを使ってDockerのローカル80番ポートをいい感じに整理する

ローカル開発環境でTraefikに名前解決させることで開発環境毎のポート管理等の手間を省く。
以下のような記述をdocker-compose.ymlに追加して名前解決させたいコンテナをそのネットワークに記述する。

```yml
networks:
  docker_default:
    external:
      name: docker_default
```

## Traefikとは

Traefik はDockerにも対応している マイクロサービス向けモダンHTTPリバースプロキシ・ロードバランサ
[公式ページ](https://docs.traefik.io/v1.1/)

> Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker, Swarm, Mesos/Marathon, Consul, Etcd, Zookeeper, BoltDB, Rest API, file...) to manage its configuration automatically and dynamically.



# Traefikとportainerの導入

まずdockerなど適当な名前のディレクトを作り以下のようにdocker-compose.ymlを書く。
今回はDockerコンテナをGUIで操作し、管理・監視するためのportainerと言うツールも一緒に構築する

```yml
version: '3.8'
services:
  p-portainer:
    image: portainer/portainer
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data
  traefik:
    image: traefik
    ports:
      - "80:80"
    restart: always
    labels:
      - "traefik.http.routers.api.rule=Host(`t.localhost`)"
      - "traefik.http.routers.api.service=api@internal"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml
networks:
  docker_default:
    external:
      name: docker_default
```

Traefikの設定ファイルは、toml形式の設定ファイルを作成します。
今回は名前解決のルールをコンテナ名のハイフンより前を正規表現で切り取りネーミングさせます。
(コンテナ名が `hoge-fuga` だった場合 `hoge.localhost` とネーミングされます。

### ※windowsマシンの場合

Docker for windows で /var/run/docker.sock をマウントする必要があるので
上記のdocker-compose.ymlと同じ階層に.env作成し以下を記述する

```.env
COMPOSE_CONVERT_WINDOWS_PATHS=1
```

上記のdocker-compose.ymlを書いたディレクトリの直下にtraefik/.traefik.tomlを作成

```toml
[api]

[ping]
  entryPoint = "http"

[providers.docker]
  defaultRule = "Host(`{{ trimSuffix \"-\" (regexFind \"(.+?)-\" .Name) }}.localhost`)"
  network = "docker_default"
```

これを立ち上げれば、`p.localhost` でportainerの画面、 `t.localhost` でtraefikの管理画面にアクセスできるようになります。


# まとめ

同時に複数のDocker環境を立ち上げるとポート管理や名前解決が手間になりますが、
traefikのようなプロキシツールを使うと手間が省けて便利です。

# サンプル

このサンプルでは `test.localhost` で名前解決されます。

```yml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    tty: true
    volumes:
      - .:/code
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
  test-web:
    image: nginx:latest
    depends_on:
      - app
    networks:
      - default
      - docker_default
    volumes:
      - ./public:/code/public
      - ./docker/nginx/conf.d/local.d/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}

networks:
  docker_default:
    external:
      name: docker_default
```
Qiitaへの記事の投稿とGithubへの共有について



# Document Link

-   [マルチスケールシミュレーション特論まとめ](https://qiita.com/evendemiaire/items/25f459daa57ab8875ba6)


# Qiita


## 記事の投稿の前に

前回，環境構築を行い，ruby\_docsまでインストール済みのはず．

とりあえず，自分のPCで作業する場所を作成しよう．

ということで，

    $ mkdir my_ruby                  #ruby_docsと同階層に作成
    $ cd my_ruby
    $ git pull origin main           #おそらくgrad_members_20fというディレクトリができてる？
    $ cd grad_members_20f/members/
    $ mkdir my_directory             #自分の作業用ディレクトリを作成

自分の作業場を作ったら，今後はそのディレクトリ以下で作業すること！


## qiitaへの記事の投稿について

新規の記事が作りたかったら，

    $ qiita template                              #新規記事のテンプレートができる
    $ mv template.org name.org                    #ファイル名変更
    $ emacs -nw name.org                          #記事を編集
    $ qiita post name.org (private/public/teams)  #記事を投稿(限定/公開/QiitaTeam)

てな感じで．

ちなみに，新規記事のテンプレート作成時，

    $ qiita template
    cp /var/lib/gems/2.5.0/gems/qiita_org-0.1.16/lib/qiita_org/template.org .
    Write ruby version?(y/n)

rubyのversionを記述するか聞かれるけど，どっちでも良い．

それよりも，cp元のtemplate.orgを見てみると，

    $ cat /var/lib/gems/2.5.0/gems/qiita_org-0.1.16/lib/qiita_org/template.org
    #+OPTIONS: ^:{}
    #+STARTUP: indent nolineimages
    #+TITLE: title
    #+AUTHOR: name
    #+EMAIL:     (concat "hoge@hoge")
    #+name_list: name
    #+qiita_id: name
    #+github_id: name
    #+LANGUAGE:  jp
    # +OPTIONS:   H:4 toc:t num:2
    #+OPTIONS:   toc:nil
    #+TAG: tag1, tag2
    # +SETUPFILE: ~/.emacs.d/org-mode/theme-readtheorg.setup

テンプレートの中身を自分用に編集しておくと楽．(Sudoerじゃないと編集できないので注意)

今後はOrg-modeで編集するとのことで，マニュアルが必要かね．

-   [Org mode for Emacs](https://orgmode.org/ja/)
-   [Org Mode マニュアル](https://takaxp.github.io/org-ja.html)

まあ，自分で試してください．


# Github


## Githubへの共有について

編集したファイルなどをgithubに共有する場合

    $ git pull origin main           #リモートブランチの変更をローカルのカレントブランチへ反映
    $ git add -A                     #staging
    $ git commit -m 'message'        #stagingされた変更をcommitする
    $ git push origin main           #特定のブランチをリモートブランチへpush

要は，GithubのTeamNishitani以下に変更(新規ファイルの作成，誰かがpushしたなど)があれば，その変更を自分のPCにも反映させますよと．

stagingして，commitする

-   staging: システムを公開する手前に、実際にサービスを提供する環境とほぼ同環境にシステムを反映させ、動作や表示などの最終確認を行う段階、もしくは環境のこと

とかなんとか

最後に，"push": 自分のファイルをGithubにアップロードする．

という認識です(合ってるかはわからん)．


# おまけ

qiitaのテンプレート作成やgithubへの共有で，同じコマンドを打つのが面倒なのでシェルスクリプトを書く．

-   qiitaのテンプレート作成（拡張子は".sh"）

```sh:make_article.sh
#! /bin/sh
qiita template
mv template.org $1
```

-   githubへの共有

```sh:share_git.sh
#! /bin/sh
git pull origin main
git add -A
git commit -m $1
git push origin main
```

"$1"部分は引数を与える．

実行権限を与えて，

    $ chmod +x make_article.sh share_git.sh 

実行すると，

    $ ./make_article.sh test.org

test.orgが作成される．

    $ ./share_git.sh hogehoge

"hogehoge"とメッセージをつけて共有される．

どうせ何度も打つんだから，楽にしたいよね．


# 締め

次回からはRubyを勉強していきます．

次回，[Rubyのお勉強＿＜入出力編＞](https://qiita.com/evendemiaire/items/136726feb666d719639f)



------
 - **source** ~/school/multi/my_ruby/grad_members_20f/members/evendemiaire/post/qiita_github.org