OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでボタンを長押しするためのコンポーネント

## はじめに
[CyberAgent Developers Advent Calendar 2018 その2](https://adventar.org/calendars/2953) の12日目の投稿です。

株式会社サムザップの尾崎です。
開発中タイトルの[リンクスリングス](https://linqsrings.jp/)でUnityエンジニアしています。

## 内容
リンクスリングスのボタン長押しのためのコンポーネントを紹介したいと思います。

Unityは標準でボタンをタップしたときに処理を行う機能を提供していますが、長押ししたときに処理する機能は提供されていません。
そのため新規にコンポーネントを作成しました。

キャラクターや武器のアイコンを長押ししたときに詳細画面を表示するところなどで使用しています。

## 実装
```csharp
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UniRx;

namespace Linqs.UI
{
    [AddComponentMenu("Linqs/UI/LongPressTrigger")]
    public class LongPressTrigger : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
    {
        public float Duration = 0.5f;

        public UnityEvent OnLongPressDown = new UnityEvent();

        public UnityEvent OnLongPressUp = new UnityEvent();

        private bool _pressed;

        private float _pressedTime;

        private IDisposable _disposable;

        public void OnPointerDown(PointerEventData eventData)
        {
            _pressed = true;

            if (_disposable == null)
            {
                _disposable = Observable.EveryUpdate().Subscribe(i =>
                {
                    if (_pressed)
                    {
                        _pressedTime += Time.deltaTime;

                        if (_pressedTime >= Duration)
                        {
                            _pressed = false;
                            OnLongPressDown.Invoke();
                        }
                    }
                }).AddTo(this);
            }
        }

        public void OnPointerUp(PointerEventData eventData)
        {
            OnLongPressUp.Invoke();
            _pressed = false;
            _pressedTime = 0f;
            _disposable.Dispose();
            _disposable = null;
        }
    }
}
```
## 実装について
いくつか実装上のポイントがあります。

* Buttonクラスを継承せずに実装したコンポーネントになっていて、EventSystemのポインターイベントを受け取れるGameObjectなら長押しできます。(例. ToggleやImageなど)
* UnityEventを用いることでコードで処理を登録することも、インスペクタから登録することもできます。
* Update、コルーチンの代わりにUniRxのマイクロコルーチンを用いることでパフォーマンスを高めています。

## スクリーンショット
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/203221/261d523a-9cad-5ba7-c8d9-613067e1c667.png)


## 動作環境
* Unity2018.2
* UniRx
【Azure】BIG-IP VEのデプロイ

## Azure Big-IP VEのデプロイ

Azure環境へのBIG-IPデプロイ方法のメモです。

- 前提

PAYG 25Mbps Good
New Networking Stackで作成



### デプロイ方法
---
MarketPlaceからデプロイすると、なぜかSSH/WEBアクセスに失敗してしまうため
下記Gitリポジトリよりデプロイします。

[f5-azure-arm-templates](https://github.com/F5Networks/f5-azure-arm-templates/blob/master/README.md)

Deploying the BIG-IP VE in Azure - 3 NICsからNew Networking StackのPAYGを選択します。

Azureに遷移するので、必要なパラメータを入力します。

このままだと検証エラーが発生します。

**エラー例**

    {"code":"InvalidResourceName","message":"リソース名 -mgmt-pip は無効です。名前の長さは 80 文字までです。単語文字で始まり、単語文字または '_' で終わる必要があります。名前には、単語文字、'.'、'-'、'_' を使用できます。"},

頭文字に-は使用できないため、テンプレートの編集から
エラーに該当しているリソース名を修正します（頭文字のマイナスを削除）。

面倒な場合、一度テンプレートをダウンロードしローカルで修正・ファイル読み込みが可能です。

また、この場合、なぜかdnsラベルの入力が必須となるためdnsラベルにも適当な
文字列を入力します。

購入を押せばデプロイ完了です。

SSHアクセスはNG、WEBアクセスはOKでした。

### その他
---
検証完了後、デプロイ中にデプロイ失敗となりましたが
おそらくvCPUの上限に引っかかっているようなので、既存のリソースを全て削除すると
問題なくデプロイできました。
Sprache 使って Parser 書いたけどすごく戸惑ったって話

# はじめに
この記事は[Sansan Advent Calendar 2018](https://adventar.org/calendars/3423)の12日目の記事です。
実は昨日まで**いろいろあって**執筆したのは実は今日の昼です。マジで反省します。

# 何で Parser なんて書こうと思ったか
Azure の [ARM Templete](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-authoring-templates) みたいにリソースの定義とその中で使える[Bulit inの関数](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-authoring-templates#syntax)みたいなものが
プロジェクトで必要になりそうだったので、人知れず調べていました。（結果的にいらなくなったけど）

# で Sprache というものがあると知ったが…
[Sprache](https://github.com/sprache/Sprache)という**スペル書けるけど読めない**ライブラリがあることを知って使ってみたけど、下記の理由でどハマってしまいました…。

- 関数型チックで全然ピンとこない
  - 私は関数型言語の経験がない
- サンプルあったけど、私には高尚すぎて理解できなかった
  - [サンプルの計算機](https://github.com/sprache/Sprache/blob/develop/samples/LinqyCalculator/ExpressionParser.cs)があるんですが、**いろいろとやりすぎてて**理解に時間がかかってしまった

# というわけで
同じ悩みを抱えちゃってるかもしれない人向けに記事書いてみることにしました。

# とりあえずソースコードを晒す
[GitHubのリポジトリ](https://github.com/myzktkyk/Sprache)

# 解説

## 例題
以下のような文字列を関数としてパースすることを考えます。
`"Coalesce(Concat($.data.property ,b) ,Concat(c ,d))"`

## コード
肝はコード中でも↓のParser定義部分なのですが、実は一番わかりにくいっていう（関数型言語のパラダイムでできている）
なので、コード内にコメントを入れつつ解説します

``` C#
private static readonly Parser<Expression> Function =
    // 関数名の部分 関数名にカッコやカンマは含まれないはずなので除外する
    from name in Parse.CharExcept(new[] { '(', ')', ',' }).AtLeastOnce().Text()
    // 関数の最初のカッコ
    from lparen in Parse.Char('(')
    // 関数の引数の部分 引数に関数を取る場合があり得るので`Ref`を使用して再帰的にパースされるように定義する
    from arguments in Parse.Ref(() => Arguments).DelimitedBy(Parse.Char(',').Token())
    // 関数の閉じカッコ
    from rparen in Parse.Char(')')
    // 関数を表す文字列と引数を表す文字列をExpressionにする関数を呼び出す
    select CallFunction(name, arguments.ToArray());

// 引数のうち、関数でないもの（＝定数）
private static readonly Parser<Expression> Constant =
    Parse.CharExcept(new[] { '(', ')', ',' }).AtLeastOnce().Token().Text().Select(Expression.Constant);

// 引数は関数か定数であるはず。なので、まず関数かどうかを評価してから関数でない場合は定数と判断する（なので`Or`を利用している）
private static readonly Parser<Expression> Arguments = Function.Or(Constant);
```
これを理解できれば[サンプルの計算機](https://github.com/sprache/Sprache/blob/develop/samples/LinqyCalculator/ExpressionParser.cs)が一体何をしているかわかるようになる…はずです。

# 終わりに
Parserを書くことなんてそうそうない気がしますが
「ある決まりを持って構造的に記述されたテキスト」なんかを処理するときにはとても有効です。
XMLやJSONであれば吐いて捨てるほどParserはありますが、ちょっとニッチなものや、
自社のシステムにしかないようなものだと自作するしかありません。
そんな時に便利…かもしれません。
pythonでパッケージが__init__.pyがなくても動いた件

pythonで初めてパッケージの自作をしたときのメモです．
バージョンはPython 3.6.7です．

まず，parentというディレクトリを作り，そこにchildというディレクトリを作ります．
そして，そこに```hello.py```というファイルを作りました．

```python:parent/child/hello.py

def say_hello():
    return "Hello!!"
```


そして，childディレクトリに```__init__.py```という空のファイルを作りました．

次に，parentディレクトリに戻り，
```main.py```というファイルを作ります．

```python:parent/main.py  
from child import hello 

print(hello.say_hello())
```


結果，次のような構成となりました．


```
parentディレクトリ
  |
  |-- main.py
  | 
  |-- childディレクトリ
       |
       |-- hello.py
       |--__init__.py #空ファイル
  
```

parentディレクトリで```main.py```を実行すると，次のように表示されました．

```
$ python main.py
Hello!! 
```

さて，```__init__.py```の意味を確かめたく，試しにこれを削除してみました．

```
$ cd child
child $ del __init__.py 
child $ cd .. 
```

そして```main.py```を実行するとやはり，正常に表示されます．

```
$ python main.py
Hello!! 
```

参考書では```__init__.py```がないと正常に動かないとあったのですが，不思議に思い，調べてみました．

すると，[こちらのサイト](https://teratail.com/questions/110829)によると，Python 3.3以降では```__init__.py```はなくても動きはするということが分かりました．(初期化処理を行える点で，あったほうがいいけど)


以上，備忘録でした
Lumenのバリデーションエラーレスポンスをどこに定義すべきか

# LumenのControllerクラスにあるバリデーションハンドリング

Lumenのバリデーションエラーをハンドリングするお作法ってどんなだろうと思って基底Controllerクラスのソースコード読んでました。

```php
protected function throwValidationException(Request $request, $validator)
{
    throw new ValidationException($validator, $this->buildFailedValidationResponse(
        $request, $this->formatValidationErrors($validator)
    ));
}

protected function buildFailedValidationResponse(Request $request, array $errors)
{
    if (isset(static::$responseBuilder)) {
        return call_user_func(static::$responseBuilder, $request, $errors);
    }

    return new JsonResponse($errors, 422);
}

protected function formatValidationErrors(Validator $validator)
{
    if (isset(static::$errorFormatter)) {
        return call_user_func(static::$errorFormatter, $validator);
    }

    return $validator->errors()->getMessages();
}
```

ValidationExceptionを投げる時第2引数にレスポンスデータを渡す模様。
レスポンスのフォーマットするのは `$errorFormatter` と `$responseBuilder` の2つのプロパティ（コールバック関数）らしい。

この2つのプロパティの設定は下記セッターがありました。

```php
public static function buildResponseUsing(BaseClosure $callback)
{
    static::$responseBuilder = $callback;
}

public static function formatErrorsUsing(BaseClosure $callback)
{
    static::$errorFormatter = $callback;
}
```

ということでコンストラクタでフォーマットをセットすれば良さそうに見える。

```php
public function __construct()
{
    self::formatErrorsUsing(function(Validator $validator) {
        // バリデーションエラーのメッセージフォーマットを設定
    });

    self::buildResponseUsing(function(Request $request, array $errors) {
        // バリデーションエラーのレスポンスフォーマットを設定
    });
}
```

# バリデーションエラーのハンドリングをControllerでやるべきなのか

Relux Advent Calendar 2018の昨日の記事「[Lumenで例外ハンドラをいじって異常系レスポンスを自由に変更しよう](https://qiita.com/mu-naka/items/68a185d8b3d9fc673040)」のようにLaravel/LumenのException処理はExceptionHandlerに集約することが標準な気がします。

上記のようにControllerでハンドリングをすると、バリデーションエラーはController、それ以外のException（NotFoundなど）はExceptionHandlerに持たせる、というちぐはぐな状態になってしまいます。

`$errorFormatter`はバリデーションに引っかかったフィールド、値、エラーメッセージの構造を定義できます。これはバリデーションエラーの詳細データの構造なのでValidationExceptionが持つべき責務のように思えます。

`$responseBuilder`は文字通りレスポンスのフォーマットを定義できます。ExceptionHandlerで異常系レスポンスを定義する設計なのであればExceptionHandlerが持つべき責務のように思えます。

結論、こんな構成が良いのでは。

```php
use Illuminate\Validation\ValidationException

class CustomValidationException extends ValidationException
{
    public function errors()
    {
        $errors = parent::errors();
        // TODO バリデーションエラー情報をフォーマット
    }
```

```php
class BaseController extends Controller
{
    protected function throwValidationException(Request $request, $validator)
    {
        // 上記のエラーフォーマットを返すExceptionクラスを投げる
        throw new CustomValidationException($validator, $this->buildFailedValidationResponse(
            $request, $this->formatValidationErrors($validator)
        ));
    }
```

最後はいつものExceptionHandlerでレスポンスをハンドリングする。

ということで前段のControllerに定義しているバリデーションエラーハンドリングは使っていないのですが、こちらの構成のほうが収まりが良いと思います。
非エンジニアがPythonのtwitterを使っておすすめレシピをTwitterに投稿★本日の献立を考える②

この記事は [Stylez Advent Calendar 2018] (https://qiita.com/advent-calendar/2018/stylez) の 19日目の記事です。
(今回も大安ゲット！！）

『[非エンジニアがPythonのrequestsを使って楽天レシピからおすすめレシピを取得★本日の献立を考える①](https://qiita.com/tanamimi/private/d7e9e86a8e346fd388b2)』
の続きです！

**①以前からAPIで何かするってことをしたかった。
②現在勉強中のPythonでなんか作ってみたかった。
③Lambdaを使って何かできないかな～、サーバレスかっちょいいと思った。
④今晩作るおすすめレシピをゲットできたら良いな～と思った**
という動機のもと、

非エンジニアが
「PythonとAWS Lambdaを使ってAPIで取得したデータをTwitterに自動でつぶやく」ことに挑戦しています。


思いの他、今後の構想で考えていた内容のひとつ、
「Twitter APIを使う」はさくさくとできました。

Twitter APIを使って楽天レシピAPIから取得したレシピを、投稿しています！

本記事は、
**Twitter developer アカウント登録～Pythonを活用してTwitterに投稿する**までです。


## 前回の記事内容

試してみたこと

* Pythonのrequestsを使ってAPI情報を取得
* 楽天レシピAPIから人気メニュー情報を表示

今後の構想として、以下をあげさせていただいています。

*  **TwitterのAPIを利用する　←今回の記事**
*  Lambdaで、Twitterに自動投稿


## Twitter API Keys　を取得する

で、一応構想を書いたからには、まずはTwitter APIについて勉強せねば！と思い、
「Twitter API」などで検索。

とりあえず以下から開発者登録をしなきゃいけないらしいので、
開発者登録。
https://developer.twitter.com/

登録するのに参考にしたのは以下の記事。
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2018年9月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

英語で申請しました！

なんだかよくわかんないけど、
審査もなく、API keysとAccess token & access token secretが発行されたよ。。。？

「分析しません」って書いたからなのかな？？


## 楽天レシピAPIで取得したレシピをTwitterに投稿

個人的に、一番分かりやすかった、
PythonでTwitterに投稿に関する記事は以下です。
[Python3で簡単にtwitterに投稿する](https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43)

ドキドキしながら、
取得した必要なキーとアクセストークンで、
全く同じソースを実行。。。

Twitterに投稿されていました！！！


「意外といけたのかな。。。？」と思い。。
そのまま、楽天レシピから取得したレシピをTwitterへ投稿！


今回は人気メニューのランキング2位の情報を取得するようにしました。


```
import twitter

import pprint
import requests

url = 'https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=XXXXXXXXXX&categoryId=30'
api_data = requests.get(url).json()

for menu in api_data['result']:
      if menu['rank'] == ('2'):
            menu_title = menu['recipeTitle']
            menu_url = menu['recipeUrl'] 

recipe = menu_title + menu_url

# 取得したキーとアクセストークンを設定する
auth = twitter.OAuth(consumer_key="XXXXXXXXXX",
                     consumer_secret="XXXXXXXXXX",
                     token="XXXXXXXXXX",
                     token_secret="XXXXXXXXXX")

t = twitter.Twitter(auth=auth)

# twitterへメッセージを投稿する 
t.statuses.update(status="本日のおすすめレシピ:"+recipe)
```




Twitterを確認してみると・・・
![rakuten0201.PNG](https://qiita-image-store.s3.amazonaws.com/0/223994/11837576-0765-1d95-efc4-b936eff9294d.png)

無事投稿されていました～♪♪

## 改めて今後の構想：Lambdaを使って自動でつぶやきたい

やはり、ここまでだと本テーマにした理由の③、
**Lambdaを使って何かできないかな～、サーバレスかっちょいいと思った。**
が試せていない！！

今後の構想として、以下を考えています。

- Lambdaで、Twitterに自動投稿


~~なのですが、
現状、ここまで実験できていない。。。
（どこかで見た文章）~~
**無事、本テーマにした理由①～④を実現する
「PythonとAWS Lambdaを活用して、API取得情報をTwitterに自動投稿」ができました。**
**[Stylez Advent Calendar 2018] (https://qiita.com/advent-calendar/2018/stylez)の24日に続編かつ結末が公開される予定です。**

きっと世の中に、類似の使いやすくて便利なBotはあるのですが、
（事実、自分の登録しているLINEアカウントでも本日のおすすめレシピ送られてくるし・・）
**自分で作ることに意味がある！**とやる気を失わずに頑張りました。。。


また、改めまして、
学習の参考にさせていただいてる記事の著者さんありがとうございます。

本記事についての修正やもっとコードはこうしたら良いよ、などがありましたら、
引き続きコメントをお待ちしています。
意外と知られていない（かもしれない）beginの使い方

皆さんは`||=`のイディオム、使いますよね？例えばこんなふうに

```ruby
def current_user
  @current_user ||= User.find(session[:id])
end
```

ところで、ユーザーを見つけるロジックがもっと複雑で、複数行に渡って書ける場合はどう書けばいいのでしょうか。

ここで`begin`の出番です。`rescue`とのセットで有名ですが、実は`rescue`なしでも使えます。

```ruby
def current_user
  @current_user ||= begin
                      some_complex_logic
                      to_fetch
                      user
                    end
end
```

この場合、最後の`user`が評価されて`@current_user`に代入されることになります。
[StaticTable編](1)事前準備


###ステップ1：テーブルを作成します。	
###ステップ2：データ登録画面を作成します。
###ステップ3：データを登録します。


##ステップ1：データベースに、下記の通りにSaaSForceにサンプルテーブルを作成します。

#####下記はテーブル作成のSQL文:

```sql:statictable_sample7
CREATE TABLE EMPLOYEE (
ID varchar(20) NOT NULL ,
NAME varchar(20) NOT NULL ,
DEPT varchar(50) NOT NULL ,
AGE int(3) ,
SALARY int(20) ,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

#####1-1．＜テーブル＞－＜定義インポート＞の画面を開き、上記のSQL文を「定義内容」に張り付け、「実行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/07691a3e-3516-64b6-f024-d8917f2b941c.png)

#####1-2．＜テーブル＞－＜テーブル定義・作成＞の画面を開き、テーブル結果「EMPLOYEE」行の「編集」ボタンをクリック、テーブル定義の「詳細画面」を開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/580f78de-7824-5726-02d5-6edf04fff76e.png)


#####1-3．テーブル定義の内容を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/3d53b759-9323-a957-46ea-8e558ec14b7a.png)

##ステップ２：SaaSForceの開発環境に登録画面を作成します。
#####2-1．＜画面＞－＜画面項目定義＞の画面を開き、中央上の「検索条件」ボタンをクリック。左から2番目「新規」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/2326c901-6968-21e9-2ce7-f4508ad1f089.png)

#####2-2．「画面項目定義新規」画面にて、「画面名」に社員登録を入力、「管理ID」に「S0001」を入力。「編集情報」に「EMPLOYEE」を選択し、表示される「EMPLOYEE」テーブルの編集項目に対し、「選択」欄のチェックボックスを全てチェック、「検索条件」欄にID、NAME、DEPTをチェックし、「保存して次へ」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/f7aa6348-6158-700b-30c5-36426b6fcd6c.png)

#####2-3．「フォルダ追加管理」ダイアログボックスが表示されます。画面の登録対象フォルダを選択して「登録」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/0696c585-5950-a724-0bc5-8979201ae1b9.png)


#####2-4．「画面項目定義」詳細画面が表示されます。「画面レイアウト設計へ遷移」アイコンをクリックし、「画面レイアウト設計」画面を表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/9346a325-b3c1-6939-2b28-195eece07890.png)

#####2-5．「画面デザイン」画面が表示され、この画面で項目の移動、変更などが自由に行えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/2f223b10-c84e-0fec-31fe-e296adc0b33f.png)

##ステップ３：SaaSForceの運用環境に社員データを登録し、Static Tableに表示するデータを準備します。

#####3-1．運用環境にログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/2f8c7411-5f70-487e-30a5-e144d3839bac.png)


#####3-2．社員登録画面を開いて、「新規」ボタンをクリックし、新しい社員データを登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/2d3ee94a-5e24-7967-0680-e18616b13866.png)

#####3-3．下記のようにデータを登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/a1f6a0aa-7d2e-12f2-b35d-1000c7badb1d.png)

#####3-4．社員検索結果画面に登録したデータを確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/cd19c53a-2f89-c866-cb29-989c5d833395.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184885/b5a3c6de-85f8-7f5a-2be7-50652ad54593.png)
今更ながらQiitaを使ってみる

#シャープひとつでh1みたいな感じ
##シャープふたつでh2
###シャープみっつでh3
####シャープよっつもできるようだ
#####ここはいつつ
######むっついけるか　いつつと変わらない気がする
#######シャープ7個で左に一つ出てきたのでhtmlと同じようにh6まであるようだ

- ハイフンの後は半角スペースでリスト
- リスト
    - タブでインデントすれば子要素になる
        - もう一つ下げるとこうなる
            - 更に一つ
                - これどこまでもいくのかな
                    - ラスト　どこまでもいきますね　点が変わればいいのになあ

1. 番号付きリスト
2. あまり変わらない　ドットの右に半角スペースが必要っぽい
    3. 子要素　表示は1って出てるけど書いてるのは3
        4. 更に子要素
        5. 点にならないのが残念
6. ここは6
「ドメイン駆動設計とは」を一言で表現して

@Yorinton さんのツイートがきっかけで、「ドメイン駆動設計」をみんなどう理解し、表現しているのか気になって調べてみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">[急募寄りのゆる募]<br>「ドメイン駆動設計とは」を１，２文で分かりやすく伝える表現。<br>(対象：ドメイン駆動設計を知らないエンジニア)</p>&mdash; ピーターパン@CPO&amp;エンジニア (@hukuzatsu) <a href="https://twitter.com/hukuzatsu/status/1072649335886749696?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

1. ドメイン駆動設計とは、実装を業務の中核をなす概念モデルの発展に深く結びつけることで、複雑なニーズに対応するソフトウェアを開発するためのアプローチ。[^dddcommunity.org] - [_What is Domain-Driven Design?_](http://dddcommunity.org/learning-ddd/what_is_ddd/)

[^dddcommunity.org]: 「_Domain-driven design (DDD) is an approach to developing software for complex needs by deeply connecting the implementation to an evolving model of the core business concepts._」 

1. ドメイン駆動設計とはソフトウェアの設計手法であり、「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフトウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメインそのものとドメインのロジックに焦点を置くべき」であるとする。 - [_ドメイン駆動設計 - Wikipedia_](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88)

1. 巨大なソフトウェアプロジェクトが直面する最も複雑な局面は、実装ではなく、ソフトウェアが提供する実世界のドメインです。ドメイン駆動設計(Domain Driven Design)は、非常に複雑なドメインを取り扱うためのヴィジョンとアプローチです。このヴィジョンとアプローチは、ドメイン自身をプロジェクトの主な焦点とし、ドメインの深い理解を反映したソフトウェアモデルを維持します。 - [_Domain Driven Design（ドメイン駆動設計） Quickly 日本語版_](https://www.infoq.com/jp/minibooks/domain-driven-design-quickly)

1. 厳しい現実の中で、ソフトウェア設計を習得しようと奮闘してきた技術者の物語。不完全な状況の中で、抽象的な設計原則を、現実のソフトウェアに適用するための助言。 - [_ドメイン駆動設計 基本を理解する - 増田 亨_](https://www.slideshare.net/masuda220/ss-59756718)

1. ソフトウェア開発者、ドメインエキスパートと共に常に同じ言語で認識を合わせ、ドメインモデルについて常に探求を続ける。そして最終的にモデルと言語をソフトウェアにまで落としこむことを目指す。 - [_ドメイン駆動設計の定義についてEric Evansはなんと言っているのか[DDD] - little hands' lab_](https://little-hands.hatenablog.com/entry/2017/09/27/014403)

1. 顧客と開発者が業務を戦略的に理解し、共通の言葉を使いながらシステムを発展させる手法 - [_ドメイン駆動設計のメリットと始め方 ～ 1章「DDDへの誘い」 (1/3)：CodeZine（コードジン）_](https://codezine.jp/article/detail/9546)

1. 作成したいシステムに対して開発者とその業務に詳しい人が一緒にビジネスロジックのみに焦点を当て、誰が何をするかというドメインモデルを作成する設計手法 - [_DDDってなんだっけ？DDDの外部セミナーに参加してきました - CyberZ公式エンジニアブログ_](http://engineer-blog.cyber-z.co.jp/entry/2017/06/30/154940)

1.  DDDとは、Eric Evans氏が2000年代初頭から提唱しているソフトウェア設計手法で、機能中心ではなくドメイン（ビジネス上の関心領域）に設計の重心を置いたオブジェクト指向設計手法の1つである。 - [_DDD超入門(前編) - Domain-Driven Designの概要 - エンタープライズギークス (Enterprise Geeks)_](http://enterprisegeeks.hatenablog.com/entry/2016/07/04/074614)

1. DDDは、Domain-Driven Designの略で、ドメイン駆動設計と訳されます。エリック・エヴァンス氏が、著書『Domain-Driven Design』(以降DDD本)で提唱している開発方法論です。同書のサブタイトルには「Tackling Complexity in the Heart of Software」(ソフトウェアの核心にある複雑さに立ち向かう)とあります。複雑化するシステムにおいて、いかにユーザのニーズを把握、実現し、保守・拡張していけば良いかの戦略を示したものです。 - [_実践DDD　［Domain-Driven Design］：第1回：DDDを俯瞰する | 豆蔵ソフト工学ラボ_](http://labo.mamezou.com/special/sp_008/sp_008_001.html)
自分が重宝してるGolangのtesthelper

golangに限らず、テストを書いてると同じようなパターンを何回も書くことが多いです。そこで私が重宝してるヘルパー関数を紹介します。

golangの関数を書く場合、戻り値にerrorと何かを返すパターンが多いですね。そこで以下のヘルパー関数を用意します。

```go
// CheckErr エラーの存在チェック
func CheckErr(t *testing.T, i int, ok bool, err error) bool {
	t.Helper()
	if ok {
		if err != nil {
			t.Errorf("[%d] err should be nil, but got:%s", i, err)
			return true
		}
		return false
	}
	if err == nil {
		t.Errorf("[%d] err should not be nil, but got:%s", i, err)
		return true
	}
	return true
}
```

err以外のレスポンスをチェックする場合はfalseを返します。
iはTDDのループのindexを入れます。TDDしてるとどこででたエラーが出たかわからなくなることがあるので...
okはerrが出るテストケースかどうかをboolで入れます（trueならエラーがない）
errはテスト対象の関数のerror戻り値を入れます

例えばこんな感じで使います。
errorを返す場合は、他の戻り値はどうせゼロ値なのでチェックしないでしょう。

```go
func Something(x int) (string, error){
	if x < 0 {
		return "", errors.New("")
	} else {
		return strconv.Itoa(x), nil
	}
}

func TestSomething(t *testing.T){
	testTable := []struct{
		x int
		res string
		isErr bool
	}{
		{x: 1, res: "1", isErr: false},
		{x: -1, isErr: true},
	}
	for i, tt := range testTable {
		res, err := Something(i)
		if !CheckErr(t, i, tt.isErr, err) {
			if w, g := tt.x, res; w != g {
				t.Errof("unmatch w: %s, g: %s", w, g)
			}
		}
	}
}
```

さらに例えばerrorがcodeを返すように拡張(?)してる場合もあるでしょう。

```go
// ErrCodeを返すMyErrorがあるとする
type MyError interface{
	Error() string
	ErrCode() uint32
}

type HogeError struct{}

func (e HogeError) Error() string {
	return "error"
}

func (e HogeError) ErrCode() uint32 {
	return 1001
}
```

その場合はCheckErrも以下のように拡張します。

```go
// CheckErrCode 想定されるエラーコードがあればそれを確認する
func CheckErrCode(t *testing.T, i int, code uint32, err error) bool {
	t.Helper()
	noErr := code == 0
	if !noErr && err != nil {
		if terr, ok := errors.Cause(err).(MyError); ok {
			if w, g := terr.ErrCode(), code; w != g {
				t.Errorf("[%d] err_code unmached. want:%d, but got %d", i, w, g)
			}
		} else {
			t.Errorf("[%d] err type unmached. %T", i, terr)
		}
	}
	return CheckErr(t, i, noErr, err)
}
```

func渡したり構造体作ったりもせずシンプルな関数なので適当に拡張できて便利です。
whileとglobalsと短絡評価でPythonチューリング完全ワンライナーは簡単

[lambdaでPythonチューリング完全ワンライナーくらいは簡単](https://qiita.com/KTakahiro1729/items/819318043f06f07be8c0)なのはわかったので、lambda抜きでもいけるかなと思ったら行けた。

## コード例
内容は上記記事と同じ。一対一対応ができるので、さっきのがチューリング完全ならこっちもチューリング完全。

```python
while not (globals().update({'ln':0, 'ns':{}}) if 'ln' not in globals() else None) and not (
	(ln == 0 and (print(1) or globals().update({'ln':1}))) or
	(ln == 1 and (print(3) or globals().update({'ln':2}))) or
	(ln == 2 and (ns.update({'i':20}) or globals().update({'ln':3}))) or
	(ln == 3 and (globals().update({'ln':4}) if ns['i'] else globals().update({'ln':7}))) or
	(ln == 4 and (print(ns['i']) or globals().update({'ln':5}))) or
	(ln == 5 and (ns.update({'i':ns['i']-1}) or globals().update({'ln':6}))) or
	(ln == 6 and (globals().update({'ln':3}))) or
	(ln == 7 and True) or
	0):pass
```

例のごとく、改行抜きでも動きます。

現在の課題は、ワンライナーで変数を定義することができず、globals().updateを多用していることかな。
USキーボードを使い始めの方へたった１つのアドバイス

# 言いたいこと。キーボードビューアーを開きなさい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30329/861fe671-c061-5523-901d-1bc8542c0f7c.png)

USキーボードのキー配列にまだなれていない方はJISキーボードとの違いに戸惑うと思います。
そんな時にこのキーボードビューアを表示しておくと  `SHIST` `CTRL` `OPTION` `COMMAND` を押した時の
キーマップが変更されたところが可視化されるので特殊記号なんかを探すのに大変便利です。

MACなら右上の文字入力変換のアイコンから「キーボードビューアーを表示」を選択すると表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30329/bbe85093-7a63-ba55-ccb5-4da68fce07b4.png)
Xamarin.Macでスクリーンキャプチャを撮ってみる

# はじめに
本記事は[Xamarin Advent Calendar 2018](https://qiita.com/advent-calendar/2018/xamarin)の12日目として、Xamarin.Macでスクリーンキャプチャを撮る手法をご紹介します。
また、スクリーンキャプチャのメインとなる処理は[こちらの記事](https://monobook.org/wiki/Xamarin.Mac/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%82%92%E6%92%AE%E3%82%8B)を参考にさせていただきました。
# 環境
macOS Mojave(10.14.2)
Visual Studio for Mac Community(7.6.11)
Xcode(10.1)
# 実装
ボタンを押下したらその時点での画面のスクリーンキャプチャを撮る実装をしてみました。実装全体は[こちら](https://github.com/shimshimkaz/XamarinMacScreenCapture)を参照していただければと思います。
## スクリーンキャプチャ
さて、肝となるスクリーンキャプチャの実装ですが、以下の通りです。

```C#
using System;
using System.Runtime.InteropServices;
using CoreGraphics;

namespace XamarinMacScreenCapture
{
    public static class ScreenCapture
    {
        public const string DllName = "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics";

        [DllImport(DllName)]
        extern static IntPtr CGDisplayCreateImage(UInt32 displayId);

        [DllImport(DllName)]
        extern static void CFRelease(IntPtr handle);

        public static CGImage CreateImage(UInt32 displayId)
        {
            IntPtr handle = IntPtr.Zero;

            try
            {
                handle = CGDisplayCreateImage(displayId);
                return new CGImage(handle);
            }
            finally
            {
                if (handle != IntPtr.Zero)
                {
                    CFRelease(handle);
                }
            }
        }
    }
}
```

DllImportを行うあたりはWindowsのスクリーンキャプチャと変わりないのかなという印象です。
画面全体をCGImageとして取得できるようになったので、あとは画面に表示するだけです。

```c#
using System;
using System.Drawing;
using AppKit;
using Foundation;

namespace XamarinMacScreenCapture
{
    public partial class ViewController : NSViewController
    {
        public ViewController(IntPtr handle) : base(handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
        }

        public override NSObject RepresentedObject
        {
            get
            {
                return base.RepresentedObject;
            }
            set
            {
                base.RepresentedObject = value;
            }
        }

        partial void ClickedCaptureButton(NSObject sender)
        {
            var mainScreen = (NSNumber)NSScreen.MainScreen.DeviceDescription["NSScreenNumber"];

            using (var cgImage = ScreenCapture.CreateImage(mainScreen.UInt32Value))
            using (var nsImage = new NSImage(cgImage, new SizeF(cgImage.Width, cgImage.Height)))
            {
                ImageView.Image = nsImage;
            }
        }
    }
}

```

少し分かりづらいですが、画面全体をスクリーンキャプチャしたものがアプリ内に画像として表示されています。
<img width="548" alt="スクリーンショット 2018-12-12 13.22.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/221271/034d2905-6361-2332-383f-f7a2951011c2.png">

# 所感
Xamarin.Macは触ったことがない状態からのスタートでしたが、事前に簡単なMacアプリを作成していたことと、[Xamarin.Macチュートリアル](https://docs.microsoft.com/ja-jp/xamarin/mac/get-started/hello-mac)を一通りこなしたおかげで、それほど苦労なくやりたいことを実装することができました。非常に小さな規模でのXamarin.Macのサンプルプログラムでしたが、やはりmacOS固有の知識は必須だなと実感できました。これを機に引き続きXamarin.Macを触っていきたいと思います。
UiPath「RPAチャレンジ」で全問正解できない原因

#RPAチャレンジとは
UiPathが自動入力の練習用に公開しているサイト[RPAチャレンジ](http://rpachallenge.com/?lang=ja)があります。
フォームの順序や要素名がランダムに変わるので、セレクター類を使うアクティビティの学習になります。
####参考サイト
- [RPAチャレンジでチャレンジ – Yoshihiko Miyaichi – Medium](https://medium.com/@miyaichi/rpa%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%81%A7%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8-e25093da2934)
- [RPAチャレンジに挑戦してみた | BTC RPA](https://rpa.bigtreetc.com/column/rpachallenge/)


#正解率： 71.43 (50/70) の原因は？
正しく入力しているはずなのに、なぜか正解にならない。
入力スピードが速すぎるせいだと思い、待機時間で調整しても変わらず。
面倒だけどデバッグで一画面の入力完了ごとExcelファイルの生データと目視で比較しても、不自然な箇所は見当たらず。

最終的に【苗字／名前／会社名／部署／住所／メールアドレス／電話番号】を順に1項目1データだけ入力して、どれが間違いなのか探ったら【苗字】と【名前】の項目が正解にならないのを発見。
あれこれ試行錯誤した結果、**【苗字】と【名前】を逆に入力する**と正解になります。
>【苗字】→　隆司
>【名前】→　井上

UiPathさん修正お願いします！
C言語の初歩的なトピックの理解を確認する10の問題

10個作る前に力尽きました。

# これは何?

これは、大学の授業等で教養としてC言語を学習した人、またはC言語を独学で身につけようとしている人が、基礎的なトピックを十分理解しているか?を確認するための問題です。

まずソースコードのみを見て問題を考えた後、実際に実行して答え合わせをしてください。

もしまだ未習の部分がある場合は、[Waseda Course Channel](http://course-channel.waseda.jp/subject/contents/99ZZ000002/ZZ/26)等で確認してください。

# 問題

## 変数・標準出力

何が出力されるでしょうか?

```c
#include <stdio.h>
int main(void) {
    int i, b = 3;
    for (i = 0; i < 5; i++) {
        int b = 5;
        printf("%d %d\n", i, b);
    }
    printf("%d %d\n", i, b);
}
```

## 繰り返し

`N`を自由に設定するとき、`for`で記述されたループと同じ挙動になるのは(a),(b),(c)のどれでしょうか?(`for (;;)`は無限ループの意味です)

```c
int i;
for (i = 0; i < N; i++) {
    printf("%d\n", i);
}
```

```c
// (a)
i = 0;
for (;;) {
    if (!(i < N)) break;
    printf("%d\n", i);
    i++;
}
// (b)
i = 0;
for (;;) {
    printf("%d\n", i);
    if (!(i < N)) break;
    i++;
}
// (c)
i = 0;
for (;;) {
    printf("%d\n", i);
    i++;
    if (!(i < N)) break;
}
```

他にも、**while**文, **do-while**文について確認しましょう。

## 配列・ポインタ

ポインタについては言いたいことがいっぱいありますが、とりあえず以下の問題がわかれば授業が求めるレベルには達しているといえるでしょう。

```c
int *p, a[] = {3, 2, 5, 7, 9, 0};
p = a;
while (*p) printf("%d\n", *++p);  // 何が表示される?
char *s = "hello";
while (*s) printf("%d\n", *s++);  // 何が表示される?
int b, *c, **d;
c = &b;
d = &c;
**d = 5;
printf("%d\n", b);  // 何が表示される?
int m[][3] = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};
int i, *m1 = m[1];
for (i = 0; i < 3; i++) printf("%d\n", m1[i]); // 何が表示される?
```

## 関数呼び出し

何が表示されるでしょうか?

```c
#include <stdio.h>
void f(int r) {
    if (r < 0) return;
    printf("%d\n", r);
    f(r - 1);
    f(r - 2);
}
int main(void) {
    f(5);
}
```

## 文字列

何が表示されるでしょうか?(間違いを修正しました。下のコメント参照)

```c
int main(void) {
    char a[] = "ABCDabcd", *c = a;
    while (*c) printf("%c\n", *c++ - 'A' + 'G');
}
```

## その他のトピック

上に挙げた他にも、**条件分岐**, **switch文**, **構造体**, **文字列**, **数学関数**, **プリプロセッサマクロ**などの理解を確認してみてください。

# 次のステップ

「[【C言語】初心者が中級者になるまでに身につけるべきトピック](https://qiita.com/yasuo-ozu/items/732963f3fe68393de902)」へ続く
HTTP/2とかHTTP/3とか

#HTTP/2とかHTTP/3とか

## この記事の目的
- HTTP/2及びHTTP/3について理解する際、役に立つ資料をまとめて置くこと。

## 資料

### HTTP
[Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) \| 山本 陽平 |本 | 通販 | Amazon](https://www.amazon.co.jp/exec/obidos/ASIN/4774142042/)
[O'Reilly Japan - Real World HTTP](https://www.oreilly.co.jp/books/9784873118048/)

[GitHub - oreilly-japan/real-world-http: 書籍『Real World HTTP』のサポートリポジトリ](https://github.com/oreilly-japan/real-world-http)
### HTTP/2
[http2 explained - The HTTP/2 book](https://daniel.haxx.se/http2/)
[http2 explained · GitBook (Legacy)](https://legacy.gitbook.com/book/bagder/http2-explained/details/ja)

[RFC7540](https://www.rfc-editor.org/rfc/rfc7540.txt)
[RFC7540 日本語訳](https://summerwind.jp/docs/rfc7540/)

[High Performance Browser Networking - O'Reilly Media](http://shop.oreilly.com/product/0636920028048.do)

### HTTP/3
[Introduction · HTTP/3 Explained](https://http3-explained.haxx.se/ja/)
[HTTP/3 explained · GitBook (Legacy)](https://legacy.gitbook.com/book/bagder/http3-explained/details/ja)

[詳解 HTTP/3 の翻訳に寄せて - inductor's blog](https://inductor.hatenablog.com/entry/2018/12/08/110018)

[HTTP and 5G (fixed1)](https://www.slideshare.net/dynamis/httpp-and-5g-fixed1)
TypeScriptで画像をimportしても怒られない方法(ParcelとHyperappを添えて)

# 注意
TypeScript 3.2.2にアップグレードしたら怒られるようになった。調査中。

importにこだわらないなら、以下。

```ts
const foo = require('../assets/foo.png')
```

こっちが無難なんかな〜？

# ３分クッキング

まず、モジュールの型定義を書きます。

```ts:types/index.d.ts
declare module '*.png'
declare module '*.jpg'
declare module '*.gif'
```

お好みでお好きな拡張子を加えてください。


次に、モジュールの型定義を置いたディレクトリ(`types`)を`typeRoots`に付け加えます。

```json:tsconfig.json
{
  "compilerOptions": {
    "typeRoots": ["types", "node_modules/@types"],
  },
}
```

最後に、importして彩りを添えます。

```ts
import foo from '../assets/foo.png'
```

できあがり。

Hyperappアプリに書いてParcelでビルドしても動きます。お試しあれ。


# 参考

- [import images · Issue #12 · Microsoft/TypeScript-React-Starter](https://github.com/Microsoft/TypeScript-React-Starter/issues/12)
Windows Application Deiver を利用して、Windows 10 の設定アプリを起動する

## はじめに

この記事は、Windows Application Driver で設定アプリを起動する方法について調べたときのメモです。

## Windows Applicatin Deiver について

Windows Application Driver は、Windows 10 上のアプリケーションの自動 UI テストを行うためのテストフレームワークです。

- [Windows Applicatin Driver](https://github.com/Microsoft/WinAppDriver)

## 設定アプリを起動するコード

設定アプリを起動するコードを以下に記載します。

```csharp
namespace SettingsTest
{
    public class SettingsSession
    {
        private const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
        private const string SettingsAppId = @"Windows.ImmersiveControlPanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel";
        protected static WindowsDriver<WindowsElement> session;

        public static void Setup(TestContext context)
        {
            // Launch Calculator application if it is not yet launched
            if (session == null)
            {
                // Create a new session to bring up an instance of the Calculator application
                // Note: Multiple calculator windows (instances) share the same process Id
                DesiredCapabilities appCapabilities = new DesiredCapabilities();
                appCapabilities.SetCapability("app", SettingsAppId);
                session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
                Assert.IsNotNull(session);

                // Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
                session.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1.5));
            }
        }

        public static void TearDown()
        {
            // Close the application and delete the session
            if (session != null)
            {
                session.Quit();
                session = null;
            }
        }
    }
}

```

ポイントは、```appCapabilities.SetCapability("app", SettingsAppId)``` に渡すアプリケーション ID です。Windows 10 の UWP アプリの場合は、アプリケーション ID は、タスクマネージャのプロパティから調べることができます。

![TaskManager](https://gist.githubusercontent.com/tafuji/2b1d989b3aeb2886df816a26791134fa/raw/38b0583b7d8ab35b1ea49ad81dade6246eb082ec/01-TaskManager.png)

プロパティで表示されたテキストボックス内の ```Microsoft.WindowsCalculator_10.1805.1201.0_x64__8wekyb3d8bbwe``` が、アプリケーションID になります。

![Property](https://gist.githubusercontent.com/tafuji/2b1d989b3aeb2886df816a26791134fa/raw/38b0583b7d8ab35b1ea49ad81dade6246eb082ec/02-Calculator.png)

しかしながら、設定アプリの場合は、そのような ID が表示されません。

![SettingsProperty](https://gist.githubusercontent.com/tafuji/2b1d989b3aeb2886df816a26791134fa/raw/38b0583b7d8ab35b1ea49ad81dade6246eb082ec/03-SettingsApp.png)

調査した結果、```Windows.ImmersiveControlPanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel``` を指定すればよいことがわかりました。

## 動作確認

実際に Windows Application Driver を使って、Windows 10 の設定アプリを起動してみました。

![demo](https://gist.githubusercontent.com/tafuji/2b1d989b3aeb2886df816a26791134fa/raw/ef1619186044403ef54d5c9fb7e326c56c838128/05-LaunchSettings_min.gif)

### おわりに

Windows Application Driver についてざっと調べた結果を記事にしただけなので、また新しいことが分かったら、追加記事を書いていきたいと思います。
Classic Editorがうまく動かない！その原因

# 追記
▼この通りにしたらプラグイン関係なしに普通に動いた。ありがとうございます。

ビジュアルエディタへの切り替えができない？「Uncaught ReferenceError: tinymce is not defined」エラーの対処法 | WEMO
https://wemo.tech/2251

だからこの記事は意味ないけど、念の為残しておく。


#環境
- WordPress 5.0
- オリジナルテーマ
- PHP 7

#症状
- 文字カウントは動く。
- テキストエディタのボタンが表示されない。
- ビジュアル←→テキストのエディタ切り替えができない。
![DuL5VKpV4AESXCF.jpeg](https://qiita-image-store.s3.amazonaws.com/0/167113/93ead53c-7bc8-48fd-8926-b346e6d4a551.jpeg)

#原因
**Smart Slider 3 プラグイン**（バージョン 3.3.11）
https://ja.wordpress.org/plugins/smart-slider-3/
プラグイン全部切って一個一個試したらこいつだった。

**Yoast SEO プラグイン**（バージョン 9.2.1）
https://ja.wordpress.org/plugins/wordpress-seo/
これが原因だったことも。設定による？

#試したこと
エディター拡張プラグインを入れてみた。

- TinyMCE Advanced
- HTML Editor Syntax Highlighter
- AddQuicktag

変わらず。テキストエディタのボタンが表示されない。無効化されてるっぽい。
HTML Editor Syntax Highlighterだけは症状がちょっと変わる。

- ボタン以外の機能は動いた。
- 文字数カウンターは動かない。
- エディタの切り替えは可能だが、ビジュアルエディタにするとエディタのボックスが消える。

![screenshot-mokurasu.com-2018.12.12-12-48-17.png](https://qiita-image-store.s3.amazonaws.com/0/167113/0f8328d3-b4aa-3b6b-5e34-c35479e2b86a.png)

もちろん、原因のプラグインを切ったら普通に動いてくれる。

#対処方法

- 原因のプラグインを切る。
- プラグインのアップデートを待つまで我慢する。
    - ただし対応してくれるかどうかはわからない。 
- 諦めてGutenbergの波に乗る。

タグをゴリゴリいじれる人が更新するならそのままでいいかも。
WSL 上でMacのopenコマンド (/mnt/c以下のファイルも開きたい)

## 背景
Windows10標準機能として定着してきたWSL(Windows Subsystem for Linux)ですが、コマンドライン上で生活しているとMacのopenコマンドのようにパワポやPDF、画像ファイルを開きたくなることが結構あります。
理想的にはWindows側とUbuntu側をあまり意識せずにファイルをいじりたいところです。

下記リンクでは、引数で指定したファイルをcmd.exeで開くようにaliasを設定することで解決しています。
- [WSLでmacのopenコマンドみたいなこと](https://qiita.com/chez_sugi/items/603a0ba8016aaae9ef98)
- [WSL で start コマンドを使う](https://medium.com/@h.taiju/use-the-start-command-on-wsl-bea3d82725e1)

上記の問題点として、Ubuntu側から見たWindows側のファイル(/mnt/c/以下のファイル)を開けないことが挙げられます。
これを解決するために仮想openコマンドを実装します。(ほぼ[ここ](https://qtakamitsu.hatenablog.jp/entry/2018/01/06/004536)のパクリです)

## やったこと
下記を`open`というファイル名として保存し、実行権限を与えた上でPATHの通ったディレクトリに移動します。

```bash
#!/bin/bash
to_winpath(){
    local abs_path=`readlink -f $1`
    if echo $abs_path | grep -q /mnt/c; then
        local win_path="C:"${abs_path#/mnt/c}
        echo ${win_path//\//\\}
    else
        local wsl_path=`powershell.exe -Command 'echo ($env:LOCALAPPDATA + "\lxss")' | tr -d '\r'`
        local internal_path=${abs_path//\//\\}
        echo "${wsl_path}${internal_path}"
    fi
}
/mnt/c/Windows/explorer.exe `to_winpath $@`
```

## 機能
macの`open`コマンドのように`-a`オプションで開くアプリケーションを選択することはできませんが、`explorer.exe`でダブルクリックで開くように設定されているアプリケーションで開かれます。
これはWSLから見たWindowsのディレクトリ(/mnt/c/以下)にいても使うことができます。

```
$ open image.png    # カレントディレクトリの画像を開く
$ open ./hoge.pptx  # 相対パスで指定したパワポを開く
$ open ./           # カレントディレクトリをexplorer.exeで開く
```

## やっていること

`to_winpath`で`explorer.exe`に渡すファイルパスを生成し、`explorer.exe`で実行しているだけです。
`open`コマンドに引数として渡したファイルパスが`/mnt/c`から始まる場合には`C:`、それ以外では`C:\Users\user\AppData\Local\lxss`から始まるファイルパスに変換して`explorer.exe`に渡しています。

## 余談
実装してみるとVimから画像ファイルを開ける上に、[ranger](https://qiita.com/aratana_tamutomo/items/e287d90252359be1e2b5)を使っているのでコマンドライン環境でほぼ完結してしまいそうです。
この記事を書いてる途中で気づいたんですが、[`wsl-open`](https://www.npmjs.com/package/wsl-open)というコマンドがありましたw
`npm`で簡単にインストールできます。
SEOとは結局なんなのか

最近SEOを勉強し始めたのですが、タグがどうとか見出しがなんだとか、小手先のノウハウはたくさん出てくるけど結局は何を目的としているのかがわからなくなったので、そのへんをまとめました。

---

# SEO = Search Engine Optimization
その名の通り、SEOとは検索エンジン最適化のことです、若干用法が正確ではありませんが、世間的に言われているSEOが目指すのは<strong>「検索エンジンで上位に表示してもらいやすくするために、コンテンツを最適化すること」</strong>です。

つまり、検索エンジンがどのような基準でコンテンツを評価し、上位に表示するかを決めているのかを理解する必要があるということ。

---

## Googleの評価基準
ここでは検索エンジンの代表例としてGoogleを用います。
Googleのコンテンツを評価する基準は明確で、<strong>「ユーザーが知りたいことにドンピシャな、良質なコンテンツかどうか」</strong>だそうです。

つまり、【新宿　週末　天気】で検索したユーザーに対して、きちんと知りたい情報（この例ではおそらく今週末の新宿の天気）を提供できているかが上位表示の重要のカギになってくるわけです。

---
## Googleのアルゴリズムのアップデートってなんの話なのか？
アフィリエイターやブロガー界隈ではよく耳にする「Googleのアルゴリズムのアップデート」という単語。
これは、Googleがコンテンツの質を判断するための評価方法のアップデートのことです。

例えば、今までは被リンク数が多ければ多いほど良質だと判断していたけれど、自作自演でリンクをダミーサイトに貼りまくった質の低いサイトが上位に出てしまった。
そんなときに、Googleは被リンクが多いだけでは上位に表示されないようなアップデートを施すわけです。

こういったアップデートの目的も常に「ユーザーが知りたいことにドンピシャな、良質なコンテンツ」を届けるため。被リンクが多いだけでおそまつな情報しか乗っていないサイトはユーザーの求めるところではないので、Googleはそういったコンテンツを上位に表示しないようにするわけです。

---
## アップデートに左右されないSEOは存在するのか

正直な所、Googleのアルゴリズムは複雑過ぎて完全な対策をすることは不可能だと思います。
ですが、以下の２点が守られていればアップデートの際に一時的順位が下がったとしても、長期的に見れば上位にステイするようなコンテンツを作ることは可能だと思います。

その２点とは

- <strong>ユーザーのニーズを満たすような、圧倒的に良質なコンテンツを制作する</strong>
- <strong>クローラーに内容を正確に読み取ってもらえるよう、HTMLタグを正確に設定する</strong>

です。

まずはとにかく、ユーザーに求められるコンテンツを作る。Googleがどのような指標を用いているかわかりませんが、結局は良いコンテンツを上位に表示するようになっているので、コンテンツの質が高ければ必然的にそれらの指標にも影響するはずです。

そして、せっかく良いコンテンツを作ってもGoogleのクローラーが正確に読み取ってくれなければ正しく評価してもらえない可能性があります。めっちゃいい作文を書いても、字が汚かったら読んでもらえないのと一緒ですね。クローラーは機械なので、タグなどの目印をしっかり使って正確に読み取ってもらうことが必要です。

---

# まとめ
被リンクを増やすとかの小手先のSEOは、結局のところ大したことないコンテンツをGoogleのエンジンをだまくらかして上位に表示させようとする行為なので、本当に良質なコンテンツにいずれは淘汰されていく運命にあるわけですよ・・・。
そこに労力をかけるくらいなら、はじめっからいいもん作ればいいって話ですな。がんばりましょ。

---
## とても参考になる記事
[【エンジニア用SEO用語集】僕が思うエンジニアが最低限知っておくべきSEOの専門用語【SEO初心者向け】](https://qiita.com/mmusasabi/items/49b96b3fcb0954942883)
slack/github連携のコマンド

# 利用するためのslack設定
 - これをApp管理から追加: https://slack.github.com/ 
 - github連携したいslack窓の作成
 - コマンドを実行: `/github subscribe <owner>/<repository>`
   - option parameter: `issues, pulls, deployments, commits, releases, comments, branches, reviews`
 - 全部の通知をするコマンド: `/github subscribe <owner>/<repository> issues, pulls, deployments, commits:*, releases, comments, branches, reviews`

# 参考リンク
 - [GitHub と Slack を連携させる](https://get.slack.help/hc/ja/articles/232289568-GitHub-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
 - [GitHubとSlackを連携してSlackに通知する設定 2018年版](https://www.vektor-inc.co.jp/post/github-slack-2018/)
lambdaでPythonチューリング完全ワンライナーくらいは簡単

ラムダ関数を大量に使ったら、ワンライナーくらい簡単にできそうだなと思ったら一応できた。ワンライナーと呼べるほど立派なものでもないことは重々承知してます。

## コード例

1と3を出力した後、20からカウントダウンするやつ。もっと複雑なのもできるけど、面倒臭いので……

```python
(lambda main, getnext, code: main({},0,main,getnext,code))(lambda ns, ln, main,getnext,code: main(ns,getnext(ln, code[ln](ns, ln),code),main,getnext,code) if ln >= 0 else 0,
lambda now,next,code: min(list(filter(lambda x:x>now,code.keys()))) if next is None else next,
{
		0:lambda ns, ln:print(1),
		1:lambda ns, ln:print(3),
		2:lambda ns, ln:ns.update({'i':20}),
		3:lambda ns, ln:None if ns['i'] else 7,
		4:lambda ns, ln:print(ns['i']),
		5:lambda ns, ln:ns.update({'i':ns['i']-1}),
		6:lambda ns, ln:3,
		7:lambda ns, ln:-1,
		}
)
```

複数行だけど、改行は全部消せます。


基本的なアイディアは

- ns:名前空間、ln:行番号でnsはupdateで更新。lnはレジスタのPCを若干意識してます
- code内のラムダ関数を逐次実行
- 関数の返り値は次に実行する行番号を示す。Noneなら次の行を探して実行。

なので、基本的にgotoを使っているのと同じ。チューリング完全を示すのはそんなに難しくなさそうだけど面倒臭いので誰かやって下さい。多分brainf**kと一対一対応するものが見つかるとかそんなノリ。

Pythonでワンライナーできます！！！！っていうより、ラムダ使っていいならワンライナーくらい楽勝だよね、というデモンステレーションです。

## Update 12/14

[Pythonでのワンライナー](https://qiita.com/gyu-don/items/1c200d4e9fc6e22d3c7b)を参考にglobal()を消しました。
小説書きさんに贈る文章整形・チェック用正規表現

## 経緯
Twitterでちょっと話をしたので、思いついた分だけ書いてみました。
こんなときはどう書くの？っていうのがあったら気軽に聞いてください。
正規表現がわからなくても、一応コピペで使えるようになってます。
サクラエディタやVSCodeなどプログラム書くようなテキストエディタはもちろん、Googleドキュメントや一太郎でも正規表現は使えるそうです。テキストエディタでも正規表現対応してないソフトもありますが。
※Wordのワイルドカードは、Wordの仕様を理解した上で正規表現と微妙に違う文法で記述する必要があってぱっと出て来ないため、すぐには書けない。すまない。気が向いたら試行錯誤します。

気になったら「正規表現 入門」あたりでググるといいよ！正規表現は覚えたら超便利なので！

## 注意事項
- わたしならこう書くよ～って感じのゆるい例です。これが正しい！完璧！ではないです。もっと効率いい方法があったら教えてください。
- 1回の置換で済むパターンがすぐ思いつかない場合、複数回に分けてたりするよ！ごめんね！ただそれでも目視でチェックして手動で書き換えるより早いと思います。
- このページ上では、半角の￥マークはバックスラッシュ(\\)で表示されています。バックスラッシュって何？どこのキー？ってなっても大丈夫！半角状態で￥でいいですよ。

---
### スペース(半角/全角/タブ等)のみの行を空行に置換する
検索パターン：`^[ 　\t]+$` 
置換パターン：未設定(何も入力しない)

### 文頭に全角スペースを挿入する
文頭に全角スペースを挿入します。既に文頭が全角スペースの行に対しては、何もしません。
検索パターン：`^(\S)`
置換パターン：`　$1`

文頭に半角スペースとかタブが混じってる場合、それらを全角スペースに統一するなら、こう。
検索パターン：`^(\s+)`
置換パターン：`　$1`

上記を両方やっとけば、基本的に文頭に全角スペースが入った状態になります。
あと文頭を半角スペースとかタブにしたい場合、置換パターンの`$1`の前を置換したい文字にしてね！
半角スペースならそのまま` `、タブにしたいなら`\t`です。

### 感嘆符の後に全角スペースを挿入する
鍵括弧または普通の丸括弧の直前のエクスクラメーションマークとクエスチョンマークの後に全角スペースを挿入します。
検索パターン：`([!?！？]+)([^」｣）\)])`
置換パターン：`$1　$2`

上記だけだと文末にも全角スペースが挿入されてしまうので、文末の全角スペースを削除します。
検索パターン：`　$`
置換パターン：未設定(何も入力しない)
ついでに文末に余計に入っちゃってる半角スペースとかタブも削除したーい！って場合は `\s$` です。

### 半角文字をチェックする
これは置換じゃなくて検索するだけ。半角→全角置換は残念ながらマクロ組んだりしないと無理っぽい。
検索パターン：`[a-zA-Z0-9 !"#$%&'\(\)*+,-./:;<=>?@\[\\\]^_```{|}~]`

ついでに半角カナ(句読点と鍵括弧含む)をチェックする場合
検索パターン：`[ｦ-ﾟ｢｣｡､]`

### 英数をチェックする
縦書きだと漢数字にしたりするので。
検索パターン：`[a-zA-Z0-9ａ-ｚＡ-ｚ０-９]`

英字だけチェック
検索パターン：`[a-zA-Zａ-ｚＡ-ｚ]`

数字だけチェック
検索パターン：`[0-9０-９]`

---
気が向いたら増やしていきます。
Oracle 12c 初期化パラメータの確認方法

Oracle 12cR2での、初期化パラメータの確認方法です。

sqlplusでDBに接続し、
v$parameterからSELECTすることで確認できます。

```ruby:
$ sqlplus user/passwd
SQL> SELECT name, value FROM v$parameter;

NAME                           VALUE
------------------------------ --------------------
lock_name_space
processes                      300
sessions                       472
timed_statistics               TRUE
timed_os_statistics            0
resource_limit                 TRUE
license_max_sessions           0
license_sessions_warning       0
long_module_action             TRUE
standby_db_preserve_states     NONE
…
```



「pool」を含むパラメータを検索したいなど、
特定の文字列を含むパラメータを検索する場合には、LIKE句を使います。

```ruby:
$ sqlplus user/passwd
SQL> SELECT name, value FROM v$parameter
  2  WHERE name LIKE '%pool%';

NAME                           VALUE
------------------------------ --------------------
shared_pool_size               0
large_pool_size                0
java_pool_size                 0
streams_pool_size              0
shared_pool_reserved_size      15309209
buffer_pool_keep
buffer_pool_recycle
olap_page_pool_size            0

8行が選択されました。
```
libmp3lame を有効にした Windows 用の FFmpeg を LGPL ライセンスでビルドする

msys2-i686-20180531 と Visual Studio 2013 update 5 で確認。
異常に手間がかかったので、健忘録として記載。

~~※ MinGW の gcc でもビルドできるけど、一部の依存ライブラリが GPL になるので MSVC でビルドする。なお基本的な方法は ffmpeg の wiki に記載があるです。~~
~~https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC~~
スタティックリンクしなければ libgcc は LGPL 扱いになるので MinGW でもビルド可能な模様。

## libmp3lame のビルド
1. lame のソースコードを sourceforge からダウンロードして解凍する  
https://sourceforge.net/projects/lame/files/lame/
2. 解凍先の `vc_solution/vp9_lame.sln` を Visual Studio で開いて Release 版をビルドする  
※ ビルド時に gtk が不足しているメッセージが表示されるけど、無視して OK
3. 解凍先の include ディレクトリ内のヘッダファイルを、MSVC のインクルードパスへ `#include <lame/lame.h>` でインクルードできるようにコピーする
4. ビルド時に生成された `output/Release/libmp3lame.*` を MSVC のライブラリパスへコピーする

## FFmpeg のビルド環境の準備
1. configure を実行するために、msys2 をダウンロードしてインストールする  
https://www.msys2.org/
2. インストール後、パッケージの更新と必要ソフトウェアのインストールを行う

```bash
# msys2 をはじめて使う場合はパッケージの更新が必要
$ pacman -Syuu
# パッケージ更新時 msys2 の再起動を求められた場合は、再起動後 y を抜いて更新を再開
$ pacman -Suu
# 更新が完了したら必要なソフトウェアをインストール
$ pacman -S diffutils make pkg-config yasm
```

#### FFplay も必要な場合
1. ビルドに必要となる SDL2 の最新版を github のミラーなどから取得する  
https://github.com/SDL-mirror/SDL
2. 取得した最新版の `VisualC/SDL.sln` を Visual Studio で開いて Release 版をビルドする。
3. ビルド後 sdl2-config ファイルを msys2 の PATH（`/usr/bin` など）へ作成し、sdl2 の include ディレクトリとビルドしたライブラリへのパスを設定する。

```bash:sdl2-config
#! /bin/sh

SDL_MAJOR_VERSION=2
SDL_MINOR_VERSION=0
SDL_MICRO_VERSION=5

includedir='C:\\\\SDL2\\\\include' # include ファイルへのパス
SDL_CFLAGS=
libdir='C:\\\\SDL2\\\\lib' # ビルドしたライブラリへのパス
SDL_RLD_FLAGS=
SDL_LIBS="-lSDL2"
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION

while test $# -gt 0; do
  case $1 in
    --cflags)
      echo -I${includedir} ${SDL_CFLAGS}
      ;;
    --libs)
      echo /LIBPATH:${libdir} ${SDL_RLD_FLAGS} ${SDL_LIBS}
      ;;
    --version)
      echo ${SDL_VERSION}
      ;;
  esac
  shift
done
```

### FFmpeg のビルド
1. VS2013 x** Nativa Tools Command Prompt を実行する
2. msys2 を実行する  
`C:\hoge\fuga>c:\msys32\msys2_shell.cmd`
3. FFmpeg のソースコードを github のミラーなどから取得する   
https://github.com/FFmpeg/FFmpeg
4. Visual Studio のパスを export する  
`export PATH="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin":$PATH`
5. FFmpeg のディレクトリへ移動し configure 〜 make を実行する

```bash
$ cd path/to/ffmpeg
$ ./configure --enable-libmp3lame --enable-shared --toolchain=msvc
$ make
```

生成された `ffmpeg.exe` と `lib*/lib*.dll`、`libmp3lame.dll`、`SDL2.dll` を同じディレクトリにコピーして完了。
EC-CUBE4 初回デプロイ

## 概要

すでにプラグイン追加済みのプロジェクトを別の環境にインストールしようと思ったところ、外部ライブラリ・プラグインをうまくインストールすることができなかったので、インストールできる方法を考えてみました。

## プラグインなしの作業手順

1. `composer install` を実行

```bash
composer install
```

## プラグインありの作業手順

EC-CUBE4.0.1の例

１. 外部ライブラリの準備

```bash
wget https://raw.githubusercontent.com/EC-CUBE/ec-cube/4.0.1/composer.json -O composer-core-4-0-1.json
wget https://raw.githubusercontent.com/EC-CUBE/ec-cube/4.0.1/composer.lock -O composer-core-4-0-1.lock

COMPOSER=composer-core-4-0-1.json composer install --no-scripts
```

※ `composer.json` には、追加プラグインの情報やEC-CUBEのプライベートリポジトリの情報が含まれているので、通常の `composer install` ではインストールできません。

２. EC-CUBEインストラーの実行

３. マイグレーションの実行

```bash
bin/console doctrine:migrations:migrate
```

※この時点では、プラグインが適用されていない状態のEC-CUBE4が動きます

４. EC-CUBEブラグインのダウンロード

```bash
# EC-CUBEプラグインのダウンロード
bin/console eccube:composer:install

# Autoloaderの生成
composer install
```

５. EC-CUBEプラグインの有効化

```
# 独自プラグインの場合
bin/console eccube:plugin:install --code=プラグインコード
bin/console eccube:plugin:enable --code=プラグインコード

# オーナーストアプラグインの場合
bin/console eccube:plugin:enable --code=プラグインコード
```

## composer.json の情報を別の環境に反映

以下のコマンドで適用する。
`bin/console eccube:composer:require-already-installed`

外部ライブラリを使っている場合には個別に再度反映する
`composer require psr/http-message`

http://doc4.ec-cube.net/quickstart_update#5-composerjsoncomposerlock%E3%81%AE%E6%9B%B4%E6%96%B0
[WIP] php:// とは

# 概要

突然出てきたphp:// が何者かわからなかったため、メモ。


# PHP のドキュメントより。

## php://output

php://output は書き込み専用のストリームで、 print および echo と同じ方法での出力バッファへの書き込みを許可。

# 中身はどうなっているのか

まだ調査中。
出来次第と更新します。
stdout の出力に内容を写していると考えているが、実装も何もみていないので、わからない。
macで Excel Online (MS) のショートカットキー一覧（書きかけ）

## 誰向け？

macを用いていて、インストール版ではないmsのexcelonlineを普段用いている人向け

## ショートカット一覧

|やりたいこと|ショートカット|
|---|---|
|このセルを編集|fn + f2(touch bar)|
|セルないで改行|option + enter|
可変長配列は苦手

C/C++の可変長配列は苦手

まず、Qiitaの記事から拝読。

C99 の sizeof と可変長配列
https://qiita.com/Nabetani/items/a2ecdba9af0add723170

C言語 可変長配列の実装による速度の違い
https://qiita.com/acnaman/items/87ad4679fff5d2f29cf7

ランダムアクセス・追加削除が爆速な可変長配列（Java C++）
https://qiita.com/GachiNyanNyan/items/5a05322b6d2026d323aa

C言語(C11)で可変長の配列を使う方法
https://qiita.com/raccy/items/bfcb62086c5f027d57b6
fishで簡単にnvm(のようなもの)を使えるようにするツール

どうもfish使いです

なんとなく簡単に導入できるからfishを使っている勢ですが、どうしても nvmのインストールだけがクソ面倒なのが辛い
困ってたら最高にナウいツール見つけました


https://github.com/jorgebucaran/fnm

インストール

```
fisher add jorgebucaran/fnm
```

最新(ろんぐたーむさぽーと)取得してセット

```
fnm lts
```

おわり。

これだけでnpm node使えるようになるから最高です

(よくよくqiita調べたら同じ記事たくさんあった)