OmniAICreator/Qiita-1.07M huggingface dataset:
スプレッド構文をJESTを書いて学習する

# はじめに

業務で React + TypeScript を触っていくことになった。

恥ずかしいことにスプレッド構文についてあまり良く知らなかったので下記の内容を[JEST](https://jestjs.io/ja/)で検証しつつ学習した。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

# JESTを書いて学習する

```typescript:spreadsyntax.spec.ts
describe('スプレッド構文', (): void => {

    describe('Array リテラルで使う', () => {

        test('Demo', () => {
            const sum = (x, y, z) => {
                return x + y + z;
            };
            const numbers = [1,2,3];
            expect(6).toBe(sum(...numbers));
            expect(6) .toBe(sum.apply(null, numbers))
        });

        test('引数の何番目でも使えるし、複数回使える', () => {
            function myFunction(v, w, x, y, z) {
                return [v, w, x, y, z];
            }
            const args = [0, 1];
            const actual = myFunction(-1, ...args, 2, ...[3]);
            expect([-1, 0, 1, 2, 3]).toEqual(actual);
        });

        test('すでにある配列を一部として新しい配列を作成', () => {
            const parts = ['shoulders', 'knees'];
            const lyrics = ['head', ...parts, 'and', 'toes'];
            expect(['head', 'shoulders', 'knees', 'and', 'toes']).toEqual(lyrics)
        });

        test('配列を複製する', () => {
            // 配列の複製
            const arr = [1, 2, 3];
            const arr2 = [...arr];
            expect([1,2,3]).toEqual(arr2)
        });

        test('Array を連結する', () => {
            const arr1 = [0, 1, 2];
            const arr2 = [3, 4, 5];
            expect([0,1,2,3,4,5]).toEqual([...arr1, ...arr2]);
        });
    });

    describe('Object リテラルで使う', () => {

        test('オブジェクトのマージ', () => {
            const obj1 = { foo: 'bar', x: 42 };
            const obj2 = { foo: 'baz', y: 13 };
            expect(obj1).toEqual({ ...obj1 });
            expect({ foo: "baz", x: 42, y: 13 })
                .toEqual({ ...obj1, ...obj2 });
        });

        test('Object.assign() 関数を置き換えたり模倣することはできない', () => {
            const obj1 = { foo: 'bar', x: 42 };
            const obj2 = { foo: 'baz', y: 13 };
            const merge = ( ...objects ) => ( { ...objects } );

            const exp1 = { 0: obj1, 1: obj2};
            expect(exp1).toEqual(merge( obj1, obj2));

            const exp2 = { 0: {}, 1: obj1, 2: obj2};
            expect(exp2).toEqual(merge({}, obj1, obj2));
        });
    });
});
```

ユニットテストを書きながら言語機能を学ぶのは理にかなっている。
フロントエンドもやっていくぞ。
Dockerコンテナ内でLarvelを起動（php artisan serve）して、ローカルのPhpStormでデバッグする

## 目標

* dockerコンテナ内でLaravelを起動する。  
※ただし、コンテナ内のLaravelソースはローカルからマウントしている状態
* Larvelを `php artisan serve --host 0.0.0.0` で起動する
* という状態で、ローカルのPhpStormでデバッグ（ブレーク）する

## 環境

* windows10
* Docker for Windows使用
* PhpStormのバージョンは 2019.2.1
* PHPのバージョンは7.3.8

## Docker側設定

php.iniを下記の通り設定。
※
* xdebugは入っている前提。
* 細かい原理はわからないが、`xdebug.remote_autostart=1` を有効にするとダメ
* `xdebug.idekey=PHPSTORM` はあってもなくても動くけど一応いれておく。。

```ini:php.ini
[xdebug]
zend_extension="xdebug.so"
xdebug.remote_enable=1
; xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
```

Laravelを `php artisan serve --host 0.0.0.0` で起動する。
※
artisan使って起動するなよっていうツッコミはスルーする。
Nginx->php-fpm->Larvel でも多分同じなはず。。（まだ、試してないので不明

## PhpStorm側設定

`File > settings > Language&Frameworks > PHP > Debug` で↓にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/2d93f432-a646-19e5-3433-e4bbaec1b611.png)
※チェックボックスの入り方も大事なので注意。

## 注意

php.ini の `xdebug.remote_port=9000` と、PhpStormの設定のポートは必ず合わせる事。

## 実行

この状態でPHPStormでブレークを張り、リクエストを投げると[^1]、PHPStorm に `Incomming...` というダイアログが表示されるので、何も変えずに`Accept`すると、ブレークする。
※リクエストを投げる際には、↓をリクエストヘッダに付与すること。

```
Cookie: XDEBUG_SESSION=PHPSTORM
```

この後、`File > settings > Language&Frameworks > PHP > Servers`を見ると、設定が追加されている。
恐らく、デバッグ情報を送ってきてる方（つまりDocker内のLaravel（つまりServer））の情報（＋ローカルファイルとのマッピング）になっている。

[^1]: DockerのLaravelのポートマッピングが、8888:8000となっているのであれば、`http://localhost:8888`へリクエストする

## 関連リンク

* [Laravel+PHPStormでデバッグ（ブレーク）する設定方法 ※Win対応、Homestead、Vagrant不要](https://qiita.com/k_hoso/items/2ab8c2ff9d498ec4d137)
CentOS環境でRails6.0をSQLite3 (>=3.8)で動かす

# はじめに
Ruby on Rails 6でSQLiteを使う場合、SQLite3.8以上が必要になります。
ただし、現時点（2019/9月）でCentOSで提供されているSQLiteのパッケージは3.7が最新であり、
普通にアプリケーションを作ると以下のようなエラーが発生します。

```
$ rake db:migrate
rake aborted!
Your version of SQLite (3.7.17) is too old. Active Record supports SQLite >= 3.8.
```

これを解消するために、ここでは

* ソースからインストール
* gemを`with-sqlite3-lib`でインストール

することで解決を目指します。

# SQLiteの最新版をインストール
```bash
# 3.29をダウンロード
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz

$ tar xzvf sqlite-autoconf-3290000.tar.gz

$ cd sqlite-autoconf-3290000

# もとから入っているsqliteと競合しないように /opt/sqlite/sqlite3 にインストールします
$ ./configure --prefix=/opt/sqlite/sqlite3

$ make

$ sudo make install

# バージョン確認
$ /opt/sqlite/sqlite3/bin/sqlite3 --version
3.29.0 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
```

# sqlite3のgemを入れ直し
```bash
$ gem uninstall sqlite3

# 上記でいれたlibとincludeのパスを指定してinstall
# --with-sqlite3-includeが必要な旨を教えていただいたので追加
$ gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
   --with-sqlite3-lib=/opt/sqlite/sqlite3/lib

# 成功！
$ rake db:migrate
== 20190905152058 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0013s
== 20190905152058 CreateUsers: migrated (0.0014s) =============================
```

※ sqlite3のパスは古いまま（/usr/bin/sqlite3）なのでターミナルから使う場合はパスの修正が必要です。


# 参考
https://qiita.com/katsuyan/items/dd812e2e8fc89d954197
Vuetify Dialog を背景固定でスクロールさせる方法（iOS Safari）

#課題
VuetifyのDialog（モーダル）を開いたとき、背景を固定させた状態でDialog内のカードをスクロールさせたい。

#環境
Nuxt: 2.9.2
@nuxtjs/vuetify: 1.6.3
body-scroll-lock: 2.6.4

#参考資料
[【iOS対応】Vue.jsで背景固定のモーダルを作る](https://qiita.com/akashixi/items/f2a3662510630dc2f358)
こちらの「Body Scroll Lockの使い方」を参考に考えました。


#解決方法
VuetifyのDialogコンポーネント内の`<v-card>`に`ovarflow-y: hidden`を追加するのがポイント。具体的なコードはvuetifyのgithubにコメントを投稿してあります。

[[Bug Report] IOS: when long dialog scroll, background should not scroll issue #3875](https://github.com/vuetifyjs/vuetify/issues/3875#issuecomment-528415808)
LaravelのFakerを使ってDBにランダムな日付のダミーデータを挿入する

seederを使ってデータベースにテスト用のデータを挿入する際、デフォルトのままだとcreated_atやupdated_atなどの日時がマイグレーション実行時の日時で一括登録されてしまうと思います。使用するのが`Carbon::now()`であれば現在日時を取得するメソッドとなるためです。
ただテストデータとしては過去の日時で何パターンかランダムに登録して、DBから抽出する際に`select`とか`order by`とか`asc/desc`とかで日付順に並べたいときってありますよね。
そういうとき、ダミーのデータを自動で生成できる Faker というPHPのライブラリが元々 Laravel に入っているので、便利だなと思い備忘録として書いておきます。

# Fakerでテスト用のデータを自動生成する

前述のように、FakerというライブラリはLaravelに最初から入っているので、Laravelで開発をしている場合はあらためてのインストールが不要です。

使用可能なプロパティ、データ型、実例などは、少し前の記事ですがこちらの方のチートシートがよくまとまっていました。
[[Laravel5.1]Fakerチートシート](https://qiita.com/tosite0345/items/1d47961947a6770053af)

こちらを参考に、日付時刻を直近１０年以内のものでランダムに生成したいなとなった場合は、`dateTimeThisDecade`のメソッドが使えそうです。データ型はDateTime型でした。

ただ`'created_at' => dateTimeThisDecade(),`のようにするだけではエラーになって使えないので、どのクラスをuseするかきちんと書いてあげる必要があります。

Fakerの日時関連の処理はどこにあるのかなと探してみたら、このサイトが詳しく書いてあったので参考にしました。
[Generate API documentation alpha | Faker, Class DateTime](http://apigen.juzna.cz/doc/fzaninotto/Faker/class-Faker.Provider.DateTime.html)

仮にusersテーブルのデータ生成日時をランダムにカラムへ挿入してみます。
コードの修正結果の例はこちら。

```php:database/seeds/UsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Faker\Provider\DateTime; // 追加

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = [
            [
                'id' => '1',
                'name'  => 'Sasaki Daisuke',
                'email'  => 'sasaki@example.com',
            ],
            [
                'id' => '2',
                'name'  => 'Takahashi Hanako',
                'email'  => 'takahashi@example.com',
            ],
            [
                'id' => '3',
                'name'  => 'Suzuki Ichiro',
                'email'  => 'suzuki@example.com',
            ],
        ];

        foreach ($users as $user) {
            DB::table('users')->insert([
                'id' => $user['id'],
                'name' => $user['name'],
                'email' => $user['email'],
                'created_at' => DateTime::dateTimeThisDecade(), // 追加
                'updated_at' => Carbon::now(),
            ]);
        }
    }
}
```

このようにseederを修正したら、テストデータ含めテーブルを再構成するのに`php artisan migrate:fresh --seed`を実行。
これでうまくランダムな過去の日付と時間がusersテーブルのcreated_atカラムに挿入されました！

参考
[[PHP] Fakerでランダムなフェイクデータを作成する](https://qiita.com/Sa2Knight/items/fb82be7551cc84764267)
[Factory, Fakerでテストデータ生成](https://www.wakuwakubank.com/posts/451-laravel-factory-faker/)
[Laravel5.7でSeedingを利用してダミーデータを挿入](https://reffect.co.jp/laravel/larave-seeding-store-data-in-database#i-3)
[【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】](https://coinbaby8.com/laravel-seeder-factory-faker.html)
経理に使うプログラミング言語

自分の本業は経理なんですが、ここ最近経理とプログラ
ミングの相性の良さを感じています。
もっと早くプログラミングの勉強始めときゃよかったなー
と思う日々です。

まだまだプログラミングの知識は浅く狭くで、くるぶし
くらいまでしかそっちの世界に浸れてないんですが、
便利だったものを書きなぐります。
会社PCのOS：Windows 10

--------------------------------------------

■VBA
効果　　　　☆☆☆☆☆
習得コスト　☆☆☆☆☆
用途：CSVやEXCELデータの編集
　　　業績分析
　　　その他
プロの方々から言わせるとプログラミング言語と言って
いいかどうかというレベルかもしれませんが、未だに
Excelが幅を効かせている会社では最高に便利です。
データを整形したり、複数のファイルを端から開いて
データ取ってきたり、仕事中に株価スクレイピングして
きてグラフ化したりなんかもワンクリックです。
VBAだけで何かやるというより、Excelのグラフとか
オートフィルタなんかの機能と組み合わせるとほんとに
いろいろなことができる。

そして何より習得コスト（金、時間）の少なさが最高です。
Excelさえあればいいので、何かをインストールしたり
パスを通すとかしなくていいのも初心者には嬉しい。
他のメンバーにも配布できます。
個人的にはコスパ最強です。

■Bash
効果　　　　☆☆☆
習得コスト　☆☆☆☆
用途：PC内のファイル整理、検索
家でUbuntuを使っているので会社のPCにもWindows
Subsystem for Linux（WSL）入れて使い始めました。

PC内の無駄なデータを消して容量を軽くするためには
find /mnt/d/ -size +50M > large.txt
とかで大きなファイルを見つけて削除してます。
※自分は基本的にデータはD:ドライブに保存してます。

何かのファイルを探すときも、エクスプローラーの
検索窓に単語入れて検索してもいいんですが、データ量が
増えるとアホみたいに時間がかかるうえにフォルダを
移動した後にもう一回検索結果を見ようとすると
再度検索が始まります。
findの方が断然早いしテキストに出力できるので個人的に好き。
find /mnt/d/ -name '\*検索文字列\*'　> find_result.txt
です。

■python
効果　　　　☆☆☆☆☆
習得コスト　☆☆
用途：大きめサイズのデータ分析
ハードル高めです。でも便利です。
Excelで100MBのCSVとかにVLOOKUPかけるとすぐに死んで
しまうので、以前は大きいサイズのデータを扱うときだけ
ACCESSを使用してました。
でもACCESSもけっこう遅いんですよね。金かかるし。クエリの
ウィザードとかもよくわかんないし。（勉強不足）
pythonのpandasなら数百MBのデータも余裕ですし、
jupyterでnotebook作っとけばプログラムの再利用もすごく
簡単です。
SQLiteから簡単にデータ取って来れるのも便利。

■awk
用途：CSVデータ編集
正確にはgawk使ってます。
今の会社で経理やってるとCSVファイルを手動でエクスポート
してきて編集する機会が多いんですが、ExcelのVBAよりawk
の方が断然高速です。
スクリプトもシンプルで好き。
.cmdファイルを作って呼び出して使ってます。

-----------------------------------------------

あと、検討はしてみたものの現在自分では使っていない言語

■java
習得コスト高い。static void mainとか出てきた時点で
諦めました。
あとpythonのpandasみたいなライブラリが見つからなかった
ので、Excelみたいな2次元データを扱う用途には向いてない
かな？と思っています。

■javascript
ブックマークレットは便利です。古くてIEでしかアクセス
できないシステムには今も使ってます。
ブラウザにパスワード覚えさせてしまえばいいという話も
ありますが。

■Google Apps Script
アイデアしだいでは便利そう。
でも使いみちが思い浮かびません。

■R
ほとんど趣味。
RSTUDIOとggplotはほんと合理的で好き。

---

以上、経理屋の視点からいろんな言語を1年半やってみての
感想でした。

あとは言語じゃないんですが、あっちこっちのシステムに
分散しているデータを手元のSQLiteにまとめて保存しとく
ようにしたら仕事が捗ってます。
プログラミング知識も有益だけど、情報の一元化とか仕組み
のシンプル化みたいな原則論も大事だなーと。
RailsからSlackに通知する

# はじめに
こちらの記事ではRailsでSlackに通知する方法をご紹介いたします^^
意外と簡単に実装できます😄

**前提：Railsの環境構築済み、Slackへ登録済み**

# WebHookURLを取得する
そもそもWebHookとは、、？
WebHookとは、『あるサービスに通知する』というとイメージしやすいかもしれません。
このあるサービスに通知するには、どこへ通知を送信すれば良いかが重要だと思います。
その時に使用されるのが、WebHookURLになります^^

例えばとある会社のWebサイトが見たい！と思った時は、「~~~.co.jp」というURLにアクセスすると思います。この場合、`URLがわかれば`Webサイトがブラウザに返ってきて見ることができますね。

WebHookの場合も同じようなもので`とあるURLにアクセスする`ことによって、Slackへ通知を行なっているのです。
厳密に言いますと、前者は`GETリクエスト`、後者は`POSTリクエスト`になります。
興味がある方は調べてみてください^^

まず、SlackのWebサイトにログインして、`アプリを検索する > カスタムインテグレーション > Incoming Webhook` と行ってみてください!!
URL : https://slack.com/signin

![スクリーンショット 2019-09-05 23.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485469/77090f2e-af5e-1e6b-7b96-be50a0b46dfd.png)

そして好きなチャンネルを指定して、`Incoming Webhook インテグレーションの追加`ボタンをクリックしてください。
するとWebhook URLが表示されると思いますので、コピーしてください！
このURLをRailsで使用していきます。

# RailsからWebHookURLを使って通知を送る
通知を送るために`slack-notifier`というGemを使用します。
こちらは問題ないかと思います。`bundle install`コマンドを忘れずに!!

```rb
# Gemfile
gem 'slack-notifier'
```

次に、コントローラーやモデルに下記を記述します。

```rb
# Slackへ通知を行う
  notice = Slack::Notifier.new('先ほどのWebHookURLを入れます')
  notice.ping("Hello World")
```

Slack::Notifierのインスタンスを作成する際にWebHookURLを指定し、pingメソッドを呼び出すとSlackに通知することができます。その引数として、Slackへ送る文章(Hello World)を指定していますね^^ 


# 終わりに
RailsからSlackへ通知する方法をご紹介しました！
想像していたよりも簡単にSlackへ通知ができたのではないでしょうか？😁
GASを使ったLINEbotで買い物リストを確認する

#概要
スプレッドシートをDB代わりにしてGASを使ったサーバーレスのLINEbotを作る

#作るきっかけ
- ~~恋人と同棲を始めたのですが、消耗品を買う際にお互いに買うものが被ったり、買い忘れが発生するのを防ぎたい~~  
↑別れました！
- ~~相手は非エンジニアだけどスプレッドシートくらい使いこなせる~~  
↑もう私しか使う人居ませんけどね
- ~~ならスプレッドシートを共有して買う予定の物を管理、買ったら消すという運用ができる~~  
↑共有する人はもう居ません
- スプレッドシート確認するのは面倒臭いから特定ワードに反応するLinebotを作ってそいつに知らせてもらおう

#完成図
![Screenshot_20190905_235559.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493116/a0bfa2fa-6d31-823c-c70b-c69f95646a38.jpeg)


#ざっくり流れ
- スブレッドシートに買う予定の商品名、個数を入力する列をそれぞれ用意する(DBのカラムみたいなもの)
- LINEでbotに対して「買い物リスト」と送信する
- スプレッドシートから商品名列、個数列を取得してくる
- いい感じの文字列に整形して返信させる

#LINEbotの作り方とかGASプロジェクトの作り方
調べればたくさん出てくるので割愛

#コード
javascriptは殆ど書いたことが無いのでこう書いた方がいいよ、というのがあれば是非コメントしてください。

```Javascript
function doPost(e) {
  var contents = e.postData.contents;
  var obj = JSON.parse(contents);
  var events = obj["events"];
  for (var i = 0; i < events.length; i++) {
    if (events[i].type == "message") {
      reply_message(events[i]);
    }
  }
}

function reply_message(e) {
  if (e.message.type == "text") {
    var input_text = e.message.text;
    if (input_text == "買い物リスト") {
      var spreadsheet = SpreadsheetApp.openById("用意したスプレッドシートのID");
      var sheet = spreadsheet.getActiveSheet();
      var name_values = sheet.getRange("A:A").getValues();
      var quantity_values = sheet.getRange("B:B").getValues();
      
      var reply_text = "買い物リストをお知らせします！\n\n";
            
      for(var j = 1; j < name_values.length; j++) {
        if(name_values[j] == ""){
          break;
        }
        reply_text += "・" + name_values[j] + " " + quantity_values[j] + "\n";
      }
      reply_text += "\n以上です！";
     
    }　else {
      reply_text = "「買い物リスト」と話しかけるとスプレッドシートに登録した買い物リストをお知らせします！";
    }
    
    
    var postData = {
      "replyToken": e.replyToken,
      "messages": [{
        "type": "text",
        "text": reply_text,
        "wrap": true
      }]
    };
  }
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + "自分のアクセストークン"
    },
    "payload": JSON.stringify(postData)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options);
}
```

ちょっと解説するとユーザーがLINEbotに向けて送信したテキストが `買い物リスト` と完全一致した場合、用意したスプレッドシートを取得します。
そのスプレッドシートのA列(商品名)とB列(商品の数)をさらに取得して入力されてる分だけループを回してます。
ちなみに1列目は所謂カラム名的な物を書いてあるのでループカウンターを1で初期化しています。

A列、B列共に全て取得しているせいで多分1000行くらい取ってきています・・・
なので商品名が空になった時ループは抜けるようにしていますが、明らかにイケてない書き方だと思っているのでマサカリ覚悟してます。

#詰まったところ
最初は`forEach`を使っていましたが、ループ内で送信文字列を足し込みしている所に改行コードである`\n`を連結したところ何故かbotがうんともすんとも言わなくなってしまいました。
普通のforループにしてみたところ動きました。何故かはわかりません。

#運用カバーで妥協した点
- LINEだけで買う物リストの追加、削除も完結させようかと思ったが、また特定ワードを送信して消す品目を送信して・・・というのは面倒臭い。というかパソコン開いてスプレッドシートを操作した方が早いのでその機能は実装しませんでした。
- 個数は入れなくても問題ないが、商品名はしっかり詰めてスプレッドシートに入力する必要がある（個数は省略することあっても商品名を省略して個数だけ入れるようなことは無いだろうという判断でコードを書きました）

#所感
もっとjs勉強します。
ブックマークレットからボタンを押すだけのjavascript

ボタンを押すだけのスクリプトでハマったことまとめ。

こんな方におすすめです。

・社内で標準化している専用ツールを使わないとだめ
・ツールの修正が自分の権限では行えない
・最後にボタンを押すだけのスクリプトがあればひと手間減る

などなどです。

```html:html

<body>
  <h1>Hello</h1>
    <form>
      <input type="submit" name="button" value="on">
      <input type="button" name="button" value="off">
      <input type="button" name="button" value="ture">
    </form>
 </body>
```
form内にある、type="submit"に対して、ボタンを押してあげるというブックマークレットがほしい想定です。
id値振ってくれていたら楽だったんですが、自分では修正しようがないので以下スクリプトで対応しました。

```javascript:javascript
javascript:(function(){ let b = document.getElementsByName("button");
b[0].click(); })();
```
例えば、何かしらtextAreaに文言を挿入するスクリプトは書いていて、あとはボタンを押すところまでのブックマークレットがあれば、この一文を最後に挿入してあげることで短縮できますね。３時間ハマってしまった・・・

例では単純なname要素ですが、幸いなことに自分の使うツールで振られているnameは一意な書き方をしてくれているので、”button”部分のみを変更するだけで使えそうです。

テスト用に以下コードを作成しました。

```html:html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>test</title>
      <script>
      function alert(){
        document.getElementById("p-test").textContent="データが飛んでるよ！submitだね！";
      }
      function off(){
        document.getElementById('p-test').textContent="";
      }
    </script>
  </head>
  <body>
    <h1>Hello</h1>
      <form>
        <input type="submit" name="button" value="on" onclick="alert()">
        <input type="button" name="button" value="off" onclick="off()">
        <p value="test" id="p-test">test</p>
    </form>
  </body>
</html>
```
value="on"が押されたとき（ブックマークレットからクリック）、pタグの文字が一瞬だけ”データが飛んでるよ！submitだね！”に切り替わると成功です。

メモ：
getElements~("XXX") →　XXX部分に該当するものをすべて取得。
取得したものは配列として格納されるので、指定するときにインデックスを間違えないように。
タグ要素 type が button であれ、submit であれ、click()でOK。
二次元の逆運動学  |  Python シミュレーション

二次元の逆運動学はPythonで実装してみました。本記事でアルゴリズムとプログラムを解説します。![inv_kin2d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493048/63d04227-cd09-0ba2-11d8-e9a123e9298f.gif)
#####依存
- Python
- Numpy
- Matplotlib

以下プログラムの流れを図で発表しています。最初は目標点(上記絵の赤い点)とジョイト角度を初期する。

```python
# 極座標で目標点を初期
pr = 1
p_th = np.pi
Dp = np.array([pr*np.cos(p_th), pr*np.sin(p_th)]) 
```
![inver.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493048/c1176661-20e4-8abc-7ed7-ff4d9914885e.png)

関節角度を順運動学関数（forw_kin）に入力すると終点の位置が出る。目標点と終点位置で絶対誤差をとってｋパラメータエラー(Perror)と定義された閾値と比べる。閾値と比べてエラーが大きい場合逆ヤコビ行列とエラーの乗算でジョイトの回転速度を与える。次は更新節角度の為前の角度と回転速度を組み合わせてまた順運動学をやってエラーを見る。

```python
# 順運動学関数：入力（節角度　th と　ジョイトの間の距離 l）　
def forw_kin(th,l):
    l1 = l[0]
    l2 = l[1]
    th1 = th[0]
    pos = np.array([l2*np.cos(th.sum())+l1*np.cos(th1),l2*np.sin(th.sum())+l1*np.sin(th1)])
    return pos

# ヤコビ行列関数：入力（節角度　th と　ジョイトイの間の距離 l）　
def Jacob(th,l):

    l1 = l[0]
    l2 = l[1]
    th1 = th[0]
    th2 = th[1]

    J = np.array([[-l1*np.sin(th1)-l2*np.sin(th1+th2), -l2*np.sin(th1+th2)],
        [l1*np.cos(th1)+l2*np.cos(th1+th2), l2*np.cos(th1+th2)]])
    
    return J
```

#####注意
時間パラメータ（dt）とエラーパラメータ（ｋ）を十分に小さい値で定義しないと逆ヤコビ行列が発散することが起きる。

全てのシミュレーションプログラムをGithubで投稿しているので興味があれば是非下のリンクを見て下さい。
--- https://github.com/mymultiverse/robot/tree/master/python
SwiftUIでInstagram/Homeのデザインを表現

# はじめに
ここ最近SwiftUIを触っており、既存のアプリのデザインを真似てみようという試みのもと
第一回としてInstagram/Homeのデザインに着手してみたって話です。

完成形はgithubに上げているので記事の内容よりコードという方は以下リンクよりご確認ください！
書き方こっちの方が良いよ！などのアドバイスいただけると嬉しいです:relaxed:
[InstagramHomeDesign_SwiftUI](https://github.com/yotsu12/InstagramHomeDesign_SwiftUI)

# InstagramのHome画面完成形
<img width="372" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/3f52eb2e-47e1-c081-4714-ccf6a2104c99.png">

# パーツに切り分ける
SwiftUIで作成するにあたりまずパーツごとに分解できそうな箇所を分けてみました。
こちらはUIKitを使用して作成する場合も同じですかね:sweat_smile:

[StoryView](https://github.com/yotsu12/InstagramHomeDesign_SwiftUI/blob/master/InstagramDesign/Views/Conponents/StoryView.swift):フォローしてるユーザのStoryを表示する
[PostView](https://github.com/yotsu12/InstagramHomeDesign_SwiftUI/blob/master/InstagramDesign/Views/Conponents/PostView.swift):フォローしてるユーザの投稿を表示する

<img width="372" alt="image3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/98a03a62-0e20-4f37-373c-1c639429cd3b.png">




# Home画面に含まれる横縦のスクロール表現方法

UIKitでこのデザインを表現する場合
ベースの縦スクロールはTableViewもしくはCollectionView
Storyの横スクロールはCellに横向のCollectionViewを用意しておくと表現できそうですが、
今回SwiftUIではどうやって表現しているかについてです。

```HomeView.swift
var body: some View {
        NavigationView {
            VStack {
                ScrollView(.vertical) {
                    ScrollView(.horizontal){
                        HStack(alignment: .center) {
                            ForEach(landmarkData) { landmark in
                                StoryView(landmark: landmark)
                            }
                        }.padding([.top, .leading, .trailing])
                    }
                    ForEach(landmarkData) { landmark in
                        PostView(landmark: landmark).padding(.top)
                    }
                }
            }
            .navigationBarTitle("Instagram", displayMode: .inline)
            .navigationBarItems(leading: self.leadingNavigationItems, trailing: self.trailingNavigationItems)
        }
    }
```



`ScrollView(.vertical) {}`でベースを縦スクロールにし、
StoryViewを表示している箇所を`ScrollView(.horizontal)`で括り横スクロール可能にしてます。

#さいごに

第二回のデザイン表現のためよく使うアプリのどのデザインを表現してみようか探し中:smile:
[漏洞预警]FastJson < 1.2.60 远程拒绝服务漏洞

### 漏洞描述
常用JSON组件FastJson存在远程拒绝服务漏洞,攻击者可通过精心构建的恶意json报文对目标服务器执行拒绝服务攻击,从而导致服务器内存增高,有一定几率宕机
### 影响范围
FastJson < 1.2.60
### 漏洞验证
使用恶意json报文发起请求，同时观察服务器运行信息、Tomcat控制台等情况

![服务器运行信息](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c74a542e-82c7-5f9e-191f-2712ce23b4f4.png)

![Tomcat控制台](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/ca02bc2e-c954-9f72-3e48-4671054f9173.png)

可见确实内存增高不少，同时JVM出现了OOM故障

Payload如下

```
POST /fastjson/ HTTP/1.1
Host: 192.168.50.129:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Content-Type:application/json
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6
Cookie: JSESSIONID=D1gPM88rMDIA-n-pCtKwlFFiNS6ewwWI5-qkkJ5NcDRbOIIZGq86!-1979873897; ADMINCONSOLESESSION=qSw5juzv7xUGgOuNnbggvJ3IJrfojbJ8OnY3UHy3Jodnrj3Sf-uV!-1384968761
Connection: close
Content-Length: 8

{"a":"\x
```
### 修复建议
FastJson版本 升级到1.2.60
### Reference
[1]. https://github.com/alibaba/fastjson/issues/2689
[2]. https://github.com/alibaba/fastjson/releases/tag/1.2.60
VSCodeをAndroidStudio風にしてみた話

#はじめに
　AndroidStudioに目が慣れたせいかVSCodeのデフォルトのデザインが**イケてないな**と感じるようになりました。そこでVSCodeをできるだけAndroidStudioっぽくして**イケイケな感じ**にしてみました。（決してVSCodeをdisってるわけじゃないです！むしろ**VSCode大好き！神！最高！**）

#手順１　テーマを選ぶ
　まずAndroidStudioっぽいテーマがないか探してみたところ[VSCodeのテーマデザインまとめページ](https://vscodethemes.com/)があったので見てみることに。
<img width="934" alt="スクリーンショット (29).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435138/1eb11733-8b87-1a12-1c72-8a43c9904509.png">
目に優しそうなホワイト系のテーマは長い間パソコンに向かって作業する人にとってうれしい…

ページを見ているとAndroidStudioっぽいテーマが！
<img width="955" alt="スクリーンショット (30).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435138/81f19594-5095-f8e7-3b82-1630b8e090bd.png">
赤い丸で囲ったところからVSCodeに飛んで適用します。
適用したらこんな感じになりました。

<img width="957" alt="スクリーンショット (31).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435138/9722eb11-41db-0e7b-f6c3-985bd1108f70.png">
一応それっぽい見た目になりましたが**文字がダサい…**
ってことでフォント周りの設定をしていきます。

#手順２　Setting.jsonをいじる

まずフォントサイズをAndroidStudioのものに合わせます。

```settings.json
"editor.fontSize": 12.5
```

次に**ボールドの主張が激しい**のでそこを抑えてみます。

```settings.json
"editor.fontWeight": "100"
```

さらにフォントが**やぼったい**のでMSゴシックに変えてみます。

```settings.json
"editor.fontFamily": "MS Gothic"
```
これらの設定を適用したらこんな感じになりました！
<img width="960" alt="スクリーンショット (33).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435138/fcb2b052-2499-33e8-7e41-bee6588ae36b.png">

実家のような安心感…

どうしてもボールド解除の仕方がわからなかったのでもし知ってる人いたら教えていただけると嬉しいです！（ボールドのサイズは100からしか選べなかったので多分そういう仕様？）

#おわりに
AndroisStudioに慣れすぎて「VSCode使えない～・・・ウズウズ・・・」っていう自分と同じ境遇の人**（多分いないけど）**を救いたいと思い記事にしました。

快適なVSCodeライフを！
WordPressインフラの効果的なセキュリティ対策は？

ブログをこれまで使ってたレンタルサーバーからVPSに移設し、WordPress のセキュリティ対策について再検討しました。

その際、本業であるITセキュリティのノウハウを駆使できました。

この記事は、WordPressについてOSやネットワークで施すべき最低限のセキュリティ対策についてご紹介します。

なお、WordPressのサーバーをVPSや専用サーバーなどで運用するケースを想定しています。そのため、それ相応にリテラシーがある方向けの記事になっている点、ご了承ください。

## WordPressセキュリティ対策 サーバー対策３つの考え方

サーバーのセキュリティ対策について、まず次の３つの要素に分けて考えることを推奨します。

![diagram-3-security-points.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182842/68ab2518-fa75-5090-fc6d-72e539d0854f.png)

それを踏まえ、以下では、それぞれの考え方と実際の対策方法について解説していますので、ご覧ください。

[WordPressで運営する個人ブログのセキュリティ対策３大要素とは？（インフラ編）](https://takulog.info/wp-secure-network-3step/)

この内容を踏まえ、WordPress/OS/ネットワークほか様々な箇所で、適切にセキュリティ対策を施して、スキルやコストが少なくて済むセキュリティ対策を考えていくべきだと考えています。
最低限やるべき WordPress セキュリティ対策とは

ブログをレンタルサーバーからVPSに移設しました。

その際、WordPress のセキュリティ対策を再検討しました。

ながらく試行錯誤した経験値と、IT技術者としてのノウハウから、最低限やるべきセキュリティ対策が見えました。

この記事は、こんな境遇の人のお役に立つはずです。

* セキュリティ対策は薦められるがままに手を出してしまう
* セキュリティ対策をどこまでやるべきか分からない
* お金がかからない最低限のセキュリティ対策を知りたい　など

## WordPressのセキュリティ対策は３要素を考慮すべき

まずは次の３つの要素に分けて考えることを推奨します。

![diagram-3-security-points.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182842/04b8bae9-a0f8-f829-2443-18440ea75457.png)

以下では、それぞれの考え方と実際の対策方法について解説していますので、ご覧ください。

**[WordPressなら考えるべき！個人ブログのセキュリティ対策の３要素とは？](https://takulog.info/wp-secure-3step/)**

なお、個人サイトならどこまで、法人サイトならどこまで、という線引きは難しいですが、放置 もしくは 通知を主体に運用できる対策を基準として、それぞれ記載しています。

金に糸目をつければキリがありませんし、個人のWebサイトでやるのは現実的ではありませんよね。

そんな最大値を見据えつつ、まずはスキルやコストが少なくて済むセキュリティ対策を考えていくのが良策だと考えています。
JavaScriptで時間の計算をして差分の時間を表示したい

javascriptで、
（ある時間A）　ー　（ある時間B）　＝　HH:MM:SS
の形式で時間の差分を表示したかったのですが、
存外面倒で困ったのでメモ。

```Javascript
//test.js

let t1 = new Date();
let t2 = new Date();

let diff = t1.getTime() - t2.getTime();

//HH部分取得
let diffHour = diff / (1000 * 60 * 60);
//MM部分取得
let diffMinute = (diffHour - Math.floor(diffHour)) * 60;
//SS部分取得
let diffSecond = (diffMinute - Math.floor(diffMinute)) * 60;

console.log(('00' + Math.floor(diffHour)).slice(-2) + ':' + ('00' + Math.floor(diffMinute)).slice(-2) + ':' + ('00' + Math.round(diffSecond)).slice(-2));
```

このまま実行するとt1とt2の時間に差が出ないので「00:00:00」と表示されてしまいますが、
あるイベントAの直後にt1.getTime()、
あるイベントBの直後にt2.getTime()を取得するようにしてあげるとうまいこと時間の差分を取得することができます。

他に上手くやる方法はないんだろうか・・・
WordPressを正しく高速化するキャッシュの活用法

WordPressやWebサイトの高速化を考えるなら、キャッシュを使うことは必要不可欠です。

でも、キャッシュというと、複雑で、副作用で、難解で、なかなか手につけにくくて、理解は後回しになりがちです。

そこで、WordPressに関連するキャッシュについて、理解した内容をまとめてみました。

## WordPress/Webサイトの「キャッシュ」とは

WordPress や Webサイトに限って言えばどういうことか？ということを端的にいうと

**サイトの表示を速くする仕組み**

もうちょい長く言うなら

**Webページの構成要素を、速くダウンロードできる場所に、あらかじめ溜めておく仕組み**

構成要素をあらかしめ溜めておく仕組み、という感じで考えても良いかもしれません。

「キャッシュ」という言葉は、最初ボヤッと理解して、それぞれの具体的なキャッシュを覚えてからイメージを湧かせた方が良いかもしれません。

ただ、キャッシュの重要なポイントがあります。

**キャッシュが溜まるまでは遅い**

つまり、初回やキャッシュの有効期限が切れたときのページ表示には、キャッシュは効果がありません。

この原則を忘れてしまうと、一生懸命に無駄なパフォーマンスチューニングをしてしまって、無駄な時間を費やすことになりますか。（経験談）

## WordPressのキャッシュの種類と効果

実際のページを表示するまでには、たくさんのステップがあります。

それぞれのステップに対してキャッシュを持つことで、高速化することができます。

そのキャッシュの種類には下記があります。

* ページ・キャッシュ
* ブラウザ・キャッシュ
* オブジェクト・キャッシュ
* データベース・キャッシュ
* Transit API 
* CDN(Contents Deilivery Network)

他にも、APC Cache や PHP Cache、コードキャッシュなどキリが無いほどありますが、基本的には上記ほど効果があるものには出会えていません。

## WordPressでキャッシュが効果を発揮する順番は？

こちらをご覧ください。

[WordPressを高速化するキャッシュを正しく理解しよう](https://takulog.info/wordpress-cache-types/)

キャッシュ利用のためのチェックシートもありますので、ぜひ活用しましょう！

皆様のサイトがいつも素早く表示されるようになりますように。
ALTキーからはじめるショートカット生活

##ALTキーって？
キーボードの左下と右下にいるALTキー
オルトキー、アルトキーなんて呼ばれています。

このALTキー使いこなしていますか？
有名なものだとALT+TABでウィンドウの切り替えがありますね。
この記事ではALTキーを使った便利なショートカットをご紹介できればと思います。

ここで小話をひとつ。某オンラインゲームをプレイしていた時の出来事。
パソコンやインターネットの知識に疎いまま、初めてのオンラインゲームで知り合ったとある友人M

**友人M**「ALTとF4を同時に押すとすごいことが起きる！」
なにも疑わずに押したところゲームは強制終了。
はい。まんまとひっかかりました。
これまで何に使うかわからなかったALTキーに関心をもったのはこの時からでした。

さて、本題へまいりましょう。

##こんなことができるぞALTキー！

|ショートカット|できること| 
|:--------------|:------------------|
| ALT＋F4 | アプリケーションの終了| 
| ALT＋CTRL＋DELETE|ロックしたりユーザ切り替えたり| 
| ALT＋D         |ブラウザのURLの位置を選択状態にする |
| ALT＋→          |              ブラウザやエクスプローラーの進む| 
| ALT＋←              |               ブラウザやエクスプローラーの戻る | 
| ALT＋↑         |             エクスプローラーの一つ上の階層を開く|

個人的にALT＋矢印は便利ですね
あとはALT＋DからのCTRL＋Cで一瞬でURLをコピーできるのが楽しいです。

##Excelでも便利なALTキー！

※[-]で区切っているキーは順番に押してください

|ショートカット|できること| 
|:--------------|:------------------|
| ALT＋数字キー | クイックアクセスツールバーにある機能を実行| 
| ALT＋；|非表示の行や列以外を選択　| 
| ALT＋SHIFT＋=|オートSUM　| 
| ALT＋ENTER|セル内で改行　|
| ALT＋H-M-M|セルの結合 　| 
| ALT＋H-H-N|塗りつぶしをクリア　 | 
| ALT＋O-H-R |シート名の変更  |
| ALT＋マウス |図形の移動・サイズ変更時にセルの枠に合わせる|

ALT＋数字キーが本領発揮するのは自作のマクロをクイックアクセスツールバーに設定しておくことが必須なんですよね。

上書き保存や元に戻す・やり直しが元から入っていますが
そこを自分の使いやすいように入れ替えて設定しましょう。

この記事を書くために調べた中でもオートSUMは知らなかったのでいい学びとなりました。
いままでは=SUMを打ちこんで範囲選択していましたからね・・・。とても楽になります！

この記事で一番紹介したかったのはExcel内でのショートカットなんですよね。
知ってると使えそうものと、こんなことできるんだ！な奴をお届けしました。
TypeScriptでのTDD/BDDで ts-jest を使用する

# Motivation

TypeScriptを使用してフロントエンドとバックエンドを開発していますが、TDD/BDDのコードを書くときに [babel-jest](https://github.com/facebook/jest/tree/master/packages/babel-jest) を使うのか [ts-jest](https://github.com/kulshekhar/ts-jest) を使うかを検討しました。

結果としては `ts-jest` を使っているのですが、その理由と使い方をまとめます。

# ts-jest を選んだ理由

[公式ドキュメントにある理由](https://kulshekhar.github.io/ts-jest/user/babel7-or-ts)からです。特にTypeCheckingがあるからJSからTSに移行した経緯があるので、 `ts-jest` を選びました。

1. Type CheckingがBabelではできない
2. `namespace` が使えない
3. `enum` が使えない（ただしこれは2019/09/05現在ではBabel7が対応していて使えます）
4. 型宣言のマージができない
5. 昔の `import` `export` の使い方ができない
6. カレットでのキャストができない

# 使い方

使い方を記します。

## 使い方の流れ

1. 必要なパッケージをインストールする
2. `jest` の設定ファイルを作成する
3. `jest` の設定ファイルを必要に応じて編集する

### 必要なパッケージをインストールする

#### npm

```bash
npm install --save-dev jest typescript ts-jest @types/jest
```

#### yarn

```bash
yarn add --dev jest typescript ts-jest @types/jest
```

### `jest` の設定ファイルを作成する

#### npm

```bash
npx ts-jest config:init
```

#### yarn

```bash
yarn ts-jest config:init
```

### `jest` の設定ファイルを必要に応じて編集する

#### `baseUrl` と `paths` を `tsconfig.json` で設定している場合

必要に応じての編集なのでここまでで `ts-jest` を使ってのTDD/BDDはできるようになっている方もいると思います。 `ts-config.json` で `baseUrl` と `paths` を使っている方はもう少し設定を追加しないと、 `jest` がファイルを見つけられなくて怒られるので設定を追加します。

公式ドキュメントをそのまま流用しますが、仮に `ts-config.json` で以下のように `paths` を設定しているとします。

```json

{
  "compilerOptions": {
    "paths": {
      "@App/*": ["src/*"],
      "lib/*": ["common/*"]
    }
  }
}
```

この場合は `jest` にも上記の設定を読み込ませる必要があって二つの方法があります。

##### `jest.config.js` に直書き

```js

module.exports = {
  // [...]
  moduleNameMapper: {
    '^@App/(.*)$': '<rootDir>/src/$1',
    '^lib/(.*)$': '<rootDir>/common/$1'
  }
};
```

##### `ts-jest` のユーティリティを使う

```js

// jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest/utils');
// In the following statement, replace `./tsconfig` with the path to your `tsconfig` file
// which contains the path mapping (ie the `compilerOptions.paths` option):
const { compilerOptions } = require('./tsconfig');

module.exports = {
  // [...]
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths /*, { prefix: '<rootDir>/' } */ )
};
```

これで `tsconfig.json` で設定されているパスを `jest` が読み込めるようになり、TDD/BDDをゴリゴリできるようになりました。

#### `dotenv` を使っている場合

`dotenv` を使っている場合は、テストファイルで `dotenv` を読み込むのではなく、 `jest.config.js` で設定してあげることによって `jest` が環境変数を読み込んでくれます。

```js
module.exports = {
  setupFiles: ['dotenv/config']
};
```

#### TSCの特定のコンパイルエラーを無視したい場合

`TypeScript` の `tsc` は様々なチェックをしてくれてバグを防止してくれますが、テストのときはあえて無視したいチェックもあります。そのときは `jest` の `config` に該当するエラーコードを書いてあげると、そのエラーコードはテスト上無視できます。

例えば今回、`TS6133 error (declared but its value is never read)` を無視したいとします。その場合、以下のように書いてあげてください。

```js
module.exports = {
  globals: {
    'ts-jest': {
      diagnostics: {
        /* Ignore the error "is declared, but not used."
        https://huafu.github.io/ts-jest/user/config/diagnostics */
        ignoreCodes: [6133],
      },
    },
  },
  ...
};

```

# 編集履歴

1. 2019/09/07 `dotenv` を使っている場合を追加
2. 2019/11/04 TSCの特定のコンパイルエラーを無視したい場合を追加
Djangoでテンプレートを追加する

以下の手順で環境作った前提で書いてます。

⇒[Djangoをインストールしてアプリケーションを作成する](https://qiita.com/wau/items/b9e589557f0efd5abefc)

## 最終的なディレクトリ構造
こんな感じの構成にしたい

```
sampleSite
  —manage.py
  -db.sqlite3
  —sampleapp
    -urls.py ←新規作成する
    -views.py ←編集する
  -templates ←新規作成する
    -index.html ←これを画面に表示させたい
  —sampleSite
    -settings.py ←編集する
    -urls.py ←編集する
```

## templatesフォルダを作る
上の構造に合うようにtemplatesフォルダを作成

```
$mkdir templates
```
設定がしっかりしていればフォルダ名は違っていても良さそう

ここに画面表示させたいhtmlファイルを配置。
サンプルとしてindex.htmlを置きました。

```index.html
<html>
    <head>test</head>
    <body>
        <p>Hello World</p>
        <p>This is index.html</p>
    </body>
</html>
```

## 設定ファイルに登録する
設定ファイルのTEMPLATESの所を編集する。
具体的にはその中のDIRSに作ったフォルダのパスを登録する感じ。

```sampleSite/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
```

### BASE_DIRの場所
ちなみにここで出てくるBASE_DIRはルートディレクトリ（今回はsampleSite\）になるようです。

```
sampleSite ←ここ
  —manage.py
  -db.sqlite3
  —sampleapp
  -templates
  —sampleSite
```

## views.pyの編集
sampleapp配下のviews.pyを編集する

```sampleapp/views.py
from django.shortcuts import render #ここは多分元からある

# Create your views here.
# 以下を追加
def index_template(request): #関数名は任意
    return render(request, 'index.html') #表示するhtmlファイルを指定
```

## urls.pyの編集
### アプリ配下のurls.py
まずはアプリ配下のurls.pyを編集する
最初は存在しないファイルなので、自分で新規作成する

```sampleapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    #index_templateはviews.pyで宣言した関数名
    path('', views.index_template, name='index_template'),
]
```

### プロジェクト配下のurls.py
こちらは最初からあるので編集する。

```sampleSite/urls.py
# ↑↑↑↑↑ドキュメントコメントが並んでます

from django.contrib import admin
from django.urls import path, include #includeもimportする

urlpatterns = [
    path('admin/', admin.site.urls),
    path('sampleapp/', include('sampleapp.urls')), #アプリ配下のurlsを登録している
]
```

## 確認
ルート（manage.pyのあるディレクトリ）に移動して、以下を実行

```
$python manage.py runserver
```

以下のようなののが出てれば動いてます

```
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 05, 2019 - 23:00:26
Django version 2.2.5, using settings 'sampleSite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```
ここに書いてある```http://127.0.0.1:8000/```にurls.pyで書いた```sampleapp```を加えた```http://127.0.0.1:8000/sampleapp```をブラウザのURLに指定して表示するとhtmlが表示されます。
[備忘]audioタグにおけるstop

audioタグのメソッドにplayとpauseはあるが、stopがない模様。
つまり、こうするしかないのかという備忘。


```html:test.html
<audio id="testsound" src="test.mp3"></audio>
```

```javascript:test.js

objSOUND = document.getElementById("testsound");
objSOUND.play();

//・・・

objSOUND.pause();
objSOUND.currentTime = 0;
```
Intel C++ Compiler インストール後に Xcode をアップデートしたときの追加作業

Intel C++ Compiler をインストールした後に、Xcodeをアップデートすると、Intel C++ Compilerが認識されなくなってしまうことがあります。
例えば、Xcode 10.0 -> Xcode 10.2のようにマイナーアップしたときです。

通常は、Intel C++ Compiler を再インストールで修正されるのですが、Xcode 10.1以降はIntel C++ Compiler のインストーラが正しく認識出来ないことがあります。

次のようにシンボリックを張ることで認識されるようになります。

## この記事の動作環境

* macOS 10.14.5
* Xcode 10.0 -> Xcode 10.2.1 にアップデート
* Intel XE Composer 2019 Update 4

## 追加作業

Xcode のコンパイラプラグインを認識出来なくなっているので、インストール先にシンボリックリンクを張ります。
Xcode 10.0 にインストールすると、次のディレクトリにコンパイラプラグインがインストールされています。

`/Library/Application Support/Developer/10/Xcode/Plug-ins`

次のように操作して、「10」ディレクトリのシンボリックリンクを「10.2」という名前で作ります。「10.2」はXcodeのバージョンです。「10.2.1」の場合も「10.2」で認識されました。

```bash:
$ cd /Library/Application Support/Developer
$ sudo ln -s 10 10.2
```
CLIP STUDIO関連の参考URL

個人用のメモです。
僕が初学者なので、初学者の人が読んでわかるリンクを載せています。
日々更新します。
世の中に発信してくれている人達のおかげで僕もコツコツ作品作れます。
ありがとうございます。

あまりソフトウェアエンジニアには関係ないかもしれませんが、自分のオリジナルアイコン作ったりするのに参考にしていただければと思います。
自分のアイコンは、人に描いてもらった絵の写真をトレスしてなぞって描いてます。
（もちろん本人に許可もらってます。）
自分の絵は引くくらい下手くそなので、こういったツールも使えるといいなと思い使ってみました。

- *写真をトレスして使いたい*

[https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/38387](https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/38387)

- *レイヤーパレットが表示されなくなったら*

[https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/91486](https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/91486)

- *連続曲線、どうやって終わらせるの？*

[https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/87833](https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/87833)

- *保存形式はどうするべき？*

[https://www.clipstudio.net/oekaki/archives/149062](https://www.clipstudio.net/oekaki/archives/149062)

- *読み込んだ写真を直接編集したいが、禁止マークが出てしまう。*

[https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/36515](https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/36515)

- *オートアクションの使い方*

[https://tips.clip-studio.com/ja-jp/articles/719](https://tips.clip-studio.com/ja-jp/articles/719)
【iOS】Carthage でリモートブランチを指定する

## 背景

Xcode11対応がmasterにはMergeされておらず、developブランチで対応されていたときに以下のように対応しました。
## リモートブランチの指定方法

**github [リポジトリ] [ブランチ名]** で指定する。
以下、実際には以下のように指定します。

```:Cartfile
github "radex/SwiftyUserDefaults" "develop"
```
指定したリンクからクロームを起動してスクリーンショットをとっていくPGM

指定したURLリストからクローム起動して、スクリーンショットを取っていくPGMです。
起動時には他のクロームが起動していないで動作させるようにします.

1. 参考サイト

<a href="https://qiita.com/nimzo6689/items/488467dbe0c4e5645745">
PowerShellでSendKeysを使ってみた - Qiita
</a>

<a href="https://hosopro.blogspot.com/2017/01/powershell-start-sleep.html">
【PowerShell】指定した期間動作を一時停止する | ほそぼそプログラミング日記
</a>

<a href="http://www.mita.nu/blog/windowspowershell%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6%E9%80%A3%E7%B6%9A%E4%BD%9C%E6%A5%AD">
WindowsPowerShellをつかって連続作業 – みたホーム,iPhone,Lineスタンプ,猫,写真,格安SIM,暦,閏年,雑記
</a>



ソースコード
<p>2.chromeSousa.ps1</p>
<pre>
<code class="PowerShell">
#スクリーンショットをとるリンクのリスト
$linkList = @("http://hooktail.sub.jp/mathInPhys/intro/",
"http://hooktail.sub.jp/mathInPhys/kainokoshiki/"
);

for($i=0; $i -lt $linkList.Count; $i++ ){
    $url = $linkList[$i];
    $ps = Start-Process chrome.exe -ArgumentList $url -PassThru

    #クローム起動するまで待ち
    Start-Sleep -Seconds 3

    [System.Windows.Forms.SendKeys]::SendWait(“{F12}”);
    #デバックモードになるまで待ち
    Start-Sleep -Second 5
    
    #Ctrl+Shift+p
    [System.Windows.Forms.SendKeys]::SendWait("^+p")
    [System.Windows.Forms.SendKeys]::SendWait("full")
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
    #スクリーンショット取り終わるまで待ち
    Start-Sleep -Second 5

    Stop-Process -Id $ps.Id

}


</code>
</pre>
Markdown関連の参考URL

個人用のメモです。
僕が初学者なので、初学者の人が読んでわかるリンクを載せています。
日々更新します。
世の中に発信してくれている人達のおかげで僕もコツコツ作品作れます。
ありがとうございます。

※Qiitaのヘルプに載ってなかったやつを載せるつもりです。

- *HTMLタグをエスケープしたい*

[https://step-learn.com/markdown/20141021-tag-escape.html](https://step-learn.com/markdown/20141021-tag-escape.html)

- *Qiita Markdown 書き方 まとめ*

[https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
めちゃめちゃまとまってる・・・！
Stripe サブスクリプションに消費税が含まれていたので解決した話

# はじめに
社内の何気ない発言で不意に判明した、
**税込価格で価格提示しているものに税もプラスして請求してね？**
その通り、¥5,500/月 の定期購読があったとしよう、
それを¥5,940/月 請求していたのである。
<img width="591" alt="スクリーンショット 2019-09-05 22.07.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147005/faab2ec8-3a15-322d-6ef9-8dc0fcbb4c6c.png">


下手こいたああああああ。
とうことで対応をした。

（実装はrubyです）

# 原因
・StripeのCustomerにデフォルトTaxレート8%という設定をしていた。
・Planには税の設定はない。
・Subscriptionが作成される時にCustomerのデフォルトTaxレートが適用される。
・ずれる

# 対応
## Customerの税率は登録しない
8%をデフォルトで入れるようにしていたが、何も更新しないように変更。

```ruby
email: 'test@test.com',
plan: 'business',
# tax_percent: 8.0 <- 8%よ貴様はいらない子なのだ
```

## 既存のCustomerおよびそれらに紐づいているPlanのSubscriptionの税率をクリア
すでに作成されたCustomerの税率およびSubscriptionの税率をクリアしないといけない。
Stripeに確認したところダッシュボードでの一括変更は不可能。
というか個別変更すら不可能っぽい。
なので、パッチで対応。

```ruby
User.all.each do |user|
  begin
    stripe_customer = Stripe::Customers.retrieve(user.stripe_subscription_id)
    stripe_customer.tax_percent = nil
    stripe_customer.save
    stripe_subscription = Stripe::Subscription.retrieve(user.stripe_subscription_id)
    stripe_subscription.default_tax_rates = nil
    stripe_subscription.save
  rescue => e
    Rails.logger.error(e.message)
  end
end
```
エラー処理しているのは、テストユーザーとかでStripeのカスタマーデータ消しているやつを握りつぶしでスキップするため。

次回予定インボイスから正常に処理されていることを確認ずみ。

## カスタマーに返金っぽいことをする
お金を多くもらいすぎているので、返さないといけない。
今回は返金処理ではなく、次回の更新時に割引されるようにする。
方法は残高の追加 or クーポンの紐付けの二種類あるらしい。
ただ、ユーザーによって返金金額がバラバラなためクーポンは発行と紐付けがクソめんどくさい。
ということで、残高の追加をした。
クレジットで金額を入力する。
<img width="1094" alt="スクリーンショット 2019-09-05 22.08.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147005/6a696351-5f22-fe06-6775-6cb8d585bcc6.png">


すると次回の請求はこんな感じになる。
（クーポンあるから紛らわしいけど）
<img width="1085" alt="スクリーンショット 2019-09-05 22.09.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147005/ce7228c0-957e-9321-7f43-dd4d68c2a47d.png">


## お詫びメッセージの送信
とりあえず悪いことをしてしまったので全力で謝罪文を送る。


# 最後に
Stripeが結構的を射た返信をすぐに返してくれるのでもっと好きになった。

ブログで見たい方はこちら
[](http://nabesys.com/article/2019/09/05703/)
JavaScript関連の参考URL

個人用のメモです。
僕が初学者なので、初学者の人が読んでわかるリンクを載せています。
日々更新します。
世の中に発信してくれている人達のおかげで僕もコツコツ作品作れます。
ありがとうございます。

- *chartjsを使ってみたい*

[https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369)

- *文字列を置換したい*

[https://www.sejuku.net/blog/21107](https://www.sejuku.net/blog/21107)

- *==と＝＝＝の違い*

[https://qiita.com/Nossa/items/358c467906c38cd04f91](https://qiita.com/Nossa/items/358c467906c38cd04f91)

- *`<input type="text">`の値を取得したい*

[https://itsakura.com/js-textbox](https://itsakura.com/js-textbox)

- *日付や時間の差分を取得したい*

[http://komukomu.hatenablog.com/entry/2016/02/16/171947](http://komukomu.hatenablog.com/entry/2016/02/16/171947)

- *数字の桁合わせをしたい*

[https://rfs.jp/sb/javascript/js-lab/zeropadding.html](https://rfs.jp/sb/javascript/js-lab/zeropadding.html)

- *一定時間後に処理させたい*

[https://techacademy.jp/magazine/5541](https://techacademy.jp/magazine/5541)

- *正規表現を使用して文字列検索*

[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match)

合わせてこちらも（正規表現について）
[https://qiita.com/iLLviA/items/b6bf680cd2408edd050f](https://qiita.com/iLLviA/items/b6bf680cd2408edd050f)
反復試行で確率を確認する

#この記事について
C++言語を使って反復試行をするプログラムを作り、
それを使って
事象Aが起こる確率と、事象Aの反復試行との関係を可視化しました。
初心者なのでC++らしくはないですが。
#プログラム

胸を張って出せるものではないですが一応。

```rt.cpp
#include <iostream>
#include <math.h>
using namespace std;

long double Combination(int n,int r) {

	long double result = 1;
	for (int i = 0; i < r; ++i) {
		result *= n - i;
		result /= r - i;
	}
	return result;
}

long double RT(long double pb, int n, int r) // pbは確率
{
	long double result;
	result = Combination(n, r) * pow(pb, r) * pow(1.0 - pb, n - r);
	return result;
}

const static int n_g = 30; // 試行回数

int main() {
	int num, deno;
	deno = 3; // 分母
	num = 2; // 分子
	cout << num << " / " << deno << "の確率の事象で" << endl;
	long double results[n_g+1];
	char graph[n_g+1][100];
	for (int i = 0; i <= n_g; ++i) {
		for (int j = 0; j < 100; ++j) {
			graph[i][j] = '0';
		}
	}
	for (int i = 0; i <= n_g; ++i) {
		results[i] = RT(num / (double long)deno, n_g, i);
		cout << n_g <<" 回の試行で " << i << " 回成功する確率の百分率は " << (int)(results[i] * 100) << " %" << endl;

		for (int j = 0; j < (int)(results[i] * 100); ++j) {
			graph[i][j] = '1';
		}
	}

	for (int j = 0; j < 100; ++j) {
		for (int i = 0; i <= n_g; ++i) {
			cout << graph[i][99-j] << flush;
		}
		cout << endl;
	}

}
```

2/3の確率で成功する事象で30回の反復試行をすると20回成功する確率が
一番高いのではと思い、作りました
また、0と1を使ってグラフっぽいものも作りました。
###実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249046/f4a97d8c-3626-6f4d-bace-1a6fa0599671.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249046/fa9d9b24-c331-be27-154e-59c2aba74312.png)

別の確率でも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249046/275bf8fd-208e-f13b-0d91-81c881836b94.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249046/23d24d7d-3e61-a887-3066-470035eaa045.png)


#わかったこと
結果として、予想通りでした。
データベースってなに【初心者向け】

#そもそもデータベースとは何か

そもそも、データベースはプログラミング用語ではなく、
「辞書」や「住所録」などもデータベースの一つです。

つまり、
**「ある一定の形式で整理されたデータの集まり」**
であれば、それは全てデータベースを意味します。


##データベースの役割

- データを整理して貯める
- データを情報として活用しやすくする

紙面上のデータベースは、データ量が多くなればなるほど管理が困難になり、やがてデータベースの役割を満たさなくなる可能性があります。

そこで、現在もっとも効率が良いと考えられているデータ・モデルが**「リレーショナルデータベース(RDB)」**です。

##リレーショナルデータベース(RDB)

RDBはデータをエクセルのような表形式でデータを整理することです。

- データの重複を避けられること
- 検索能力が高い

これらを効率よく運用するソフトウェアが「リレーショナルデータベース管理システム(RDBMS)」です。

##SQLはRDBMSを操作する言語

RDBMSを使って、目的のデータを取得したり、データを操作したりするための言語がSQLです。
なんとなくSQLを使ってた初心者が数多くいると思いますが、前提から整理するとその目的がはっきりします。

##SQL言語の種類

- MySQL
- PostgreSQL
- SQLite
- Oracle DB
- SQL Server
- DB2
- H2 Database
- Apache Derby
- NoSQL
etc..

めちゃくちゃあるんですね。。
そのうち色々いじってみたいと思います。
Xcode 10 以降で Intel C++ Compiler を連携させるための設定

## 概要

Xcode 10 以降にアップデートすると、Intel C++ Compiler が正しく認識されず、ビルドエラーになってしまいました。
例えば、次のような場所で、「omp.h」ファイルが見つからないなどです。

```c++
#include <omp.h>
```

## 原因

原因は、Intel C++ CompilerがXcode 10で導入された新ビルドシステムに対応していないからのようです。
ビルドシステムをラガシーに変更するとビルドできるようになりました。

Intel C++ Compilerのリリースノート以下のように記述されていました。

[Intel® C++ Compiler 19.0 for macOS* Release Notes for Intel® Parallel Studio XE 2019 - Known Limitation](https://software.intel.com/en-us/articles/intel-c-compiler-190-for-macos-release-notes-for-intel-parallel-studio-xe-2019#known_limitations) より引用

> Xcode 10 new build system not supported
> 
> The Xcode 10 Beta introduced a “New Build System (Default)” which currently do not support custom compilers.You will see the error "no rule to process file" when building an Intel C++ Compiler project within XCode 10 To use Intel compilers, switch to “Legacy Build System” in Project Settings.
> 

## 動作環境

この記事を書いたときの動作環境は以下の通りです。

* macOS 10.14.5
* Xcode 10.0
* Intel XE Composer 2019 Update 4

## ビルドシステムの変更方法

Xcodeで以下の様に操作します。

1. 「File」メニューから「Project Settings...」を選択する。
2. 「Build System」から「Legacy Build System」を選択する。
別ファイルに先に記述したメソッド一覧を取得するawkスクリプト

## 別ファイルに先に挙動を記述したメソッド名一覧を取得したい。

別ファイルに先に挙動を記述したメソッド名一覧を取得したいという課題がありそのスクリプトについて調査しました。

サンプルとして下記の従業員モデルクラスを作成します。

```models/Employee.py
import datetime
class Employee(object):
    def __init__(self):
        self.Name = 'dummyData'
        self.Gender = 0
        self.Status = 2
        self.EmployeeCode = 'DUMMY01'
        self.Birthday = datetime.strptime('1985/01/01','Y/m/d')
        self.JoinDate = ('2015/11/01','Y/m/d')
        self.IsResigned = False
```
この従業員モデルをExcelファイルに出力するモジュールを作成するために、**まだ存在はしていない出力時の表示用のメソッド「getXXXXDisplayText」を別のファイルで先に呼び出すようにしました。** 

```employeeExcelGeneraterModule.py
from models.Employee import Employee
from pandas import DataFrame, Series


EXCEL_COLUMN_NO_FOR_EmployeeCode = 0
EXCEL_COLUMN_NO_FOR_Name = 1
EXCEL_COLUMN_NO_FOR_Gender = 2
EXCEL_COLUMN_NO_FOR_Status = 3
EXCEL_COLUMN_NO_FOR_PhoneNo = 4
EXCEL_COLUMN_NO_FOR_Birthday = 5
EXCEL_COLUMN_NO_FOR_JoinDate = 6
EXCEL_COLUMN_NO_FOR_IsResigned = 7

MAX_COLUMN_NO = 7

def getEmptyList()->list:
    emptyList = list()
    for i in range(0, MAX_COLUMN_NO):
        emptyList.append(None)
    return emptyList

def composeDataFrameRowOfEmployee(employee:Employee)->Series:
    toBeAppendedRow = getEmptyList()
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_EmployeeCode] = employee.EmployeeCode
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_Name] = employee.Name
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_Gender] = employee.getGenderDisplayText()
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_Status] = employee.getStatusDisplayText()
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_Birthday] = employee.getBirthdayDisplayText()
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_PhoneNo] = employee.PhoneNo
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_JoinDate] = employee.getJoinDateDisplayText()
    toBeAppendedRow[EXCEL_COLUMN_NO_FOR_IsResigned] = employee.getIsResignedDisplayText()
    return Series(toBeAppendedRow)

dummyEmployee = Employee()
DataFrame(
    composeDataFrameRowOfEmployee(
        dummyEmployee
    )
).to_excel(
    './exported.xlsx',
    index=False,
    header=False
)
```

今回は、この**employeeExcelGeneraterModule.pyに先に記述した** **models.Employee に記述が必要になるメソッド名一覧をawk で表示しようと思います。**

## Employeeに必要なメソッド一覧を絞り込んで取得するスクリプト

```sh
$ awk -F " " '/DisplayText/ {print $3}' employeeExcelGeneraterModule.py | awk -F "." '{print $2}'
getGenderDisplayText()
getStatusDisplayText()
getBirthdayDisplayText()
getJoinDateDisplayText()
getIsResignedDisplayText()
```

さらにメソッドの宣言コードも生成してしまうと、こうなりました。

```sh
$ awk -F " " '/DisplayText/ {print $3}' employeeExcelGeneraterModule.py | awk -F "." '{print "def " $2 "->str:"}'
def getGenderDisplayText()->str:
def getStatusDisplayText()->str:
def getBirthdayDisplayText()->str:
def getJoinDateDisplayText()->str:
def getIsResignedDisplayText()->str:
```

以上です。