OmniAICreator/Qiita-1.07M huggingface dataset:
MT コンテンツタイプ使ってみて詰まったところ

## MT コンテンツタイプ使ってみて詰まったところ
### MT7からコンテンツタイプというものが新しく追加されたので、触ってみた。

まずコンテンツタイプを作成し、色々追加したい項目を、作ってみて、それをコンテンツデータで埋めていき、コンテンツタイプテンプレートで書き出すテンプレートを用意する。

## 詰まったところ
コンテンツタイプで別のコンテンツタイプを呼び出すときに、呼び出し方がわからず詰まった。

```
<mt:ContentField content_field="別の呼び出したいコンテンツタイプ名">
<mt:ContentField content_field="別のコンテンツタイプのコンテンツフィールド項目名"><mt:ContentFieldValue language="ja"></mt:ContentField>
</mt:ContentField>
```
こうしてコンテンツタイプで、コンテンツフィールドに設定した別のコンテンツタイプを、mt:ContentFieldで呼び出しその中で、別のコンテンツタイプのフィールドを指定して上げると、選択したコンテンツデータの中身が取ってこれる。
AWSに関するおススメ記事まとめ

# はじめに
新卒のサーバーエンジニアに見ておいた方が良いサイトはありますか？と聞かれたので、AWSで閲覧するおススメのブログサイトをまとめてみました。AWSはクラウド市場の33％と大きいシェアを占めるため、情報収集の一端にご使用いただければ嬉しい限りです。

## 株式会社クラスメソッド様のブログ
AWSの仕様に関する検索を行うと検索上位で見ることが多くなったサイト。
圧倒的な記事の量で、メジャーなものからマイナーなものまで、ほとんどのAWSの機能に関する記事があります。最近では逆に記事が多すぎて目当ての記事が探しづらい気がしますvvvvv

### おススメ記事
SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました!
https://dev.classmethod.jp/cloud/aws/ssm-session-manager-release/

ネットワーク視点で見るAWS ELB(Elastic Load Balancing)のタイプ別比較[NLB対応]
https://dev.classmethod.jp/cloud/aws/describe-elb-types/


## クックパッド開発者ブログ
エンジニア御用達の開発者ブログ。私の周囲のエンジニアでは一番認知度が高い開発者ブログで、日課でチェックしている方が多いサイトです。

### おススメ記事
AWS Lambda@Edge で画像をリアルタイムにリサイズ＆WebP形式へ変換する
https://techlife.cookpad.com/entry/2018-05-25-lambda-edge

AWS Elemental MediaLive を使用したライブ動画配信アプリの基盤開発
https://techlife.cookpad.com/entry/2018/05/10/090000


## 株式会社サーバーワークス様のブログ
AWS関連の記事では閲覧頻度の高いサーバーワークス様のブログ。尖った記事が多いのでよく閲覧しています。

### おススメ記事
［Alexa新連載！］kokexa Go！ – レジレスこけしショップへの道 – 顔認証編 #alexa
http://blog.serverworks.co.jp/tech/2018/04/26/kokexa-go/

Route53のALIASをALIASする
http://blog.serverworks.co.jp/tech/2018/06/07/route53-alias-alias/


## ナレコムAWSレシピ
ナレコムクラウドというAWSの導入・運用保守サービスを提供している株式会社ナレッジコミュニケーションのAWS用ブログです。

### おススメ記事
AWSでWebサイトをHTTPS化 全パターンを整理してみました
https://recipe.kc-cloud.jp/archives/11067


## はてな開発者ブログ(Hatena Developer Blog)
株式会社はてなの開発者ブログです。AWSの記事という枠組みでいうと微妙なところですが、ブログ自体の愛好者は多いと思いますので記載します。

### おススメ記事
コンテナデプロイ基盤の検証
http://developer.hatenastaff.com/entry/2018/09/26/133000


## TEAM T3A様のブログ
最近見つけた元鯖屋さんのブログ。時折変わった記事を書いてるので気が向いたときに確認してます。

### おススメ記事
[AWS]月間1億アクセスに耐えるシステム設計を解説する
https://www.t3a.jp/blog/infrastructure/aws-large-service/


## あぱーブログ
ネットワークエンジニアさんのブログ。AWSの記事よりも「５分でわかる！～」シリーズを呼んでる気がします(苦笑)。

### おススメ記事
Amazon Inspector で CentOS7 の脆弱性診断をやってみた
https://blog.apar.jp/web/6499/


## fukuの犬小屋
大学生(工学部)？の方が運用されているブログ。Azureを使ったり、NLTK(Natural Language Toolkit)を使ったりと多方面に手を伸ばされているサイトです。

### おススメ記事
AWS Amazon Rekognition -SearchFacesで顔検索-
http://blog.roy29fuku.com/infra/aws/amazon-rekognition-search-faces/


# 番外編
Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/

AWS公式のウェブサービスのブログ。当記事の趣旨としては反則な気がしますが、AWSの最新情報を取得したいときにはココをチェックするのが一番です。


# さいごに
まとめてみると企業の開発者ブログが多いですねvvvvv
実際にはチェックする個人様のサイトは多いものの、AWSの記事が少ないか、更新が停まっているものが思ったより多かったので、本記事では記載をためらってしまいました。

上記以外で、おススメの開発者サイトがあればコメント頂ければ喜んで追記しますので、よろしくお願いしますm(_ _)m
abc 083

B
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。

既視感

```
#include<iostream>
using namespace std;
int findsumofdigits(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int main() {
    int N, A, B;
    cin >> N >> A >> B;
    int total = 0;
    for (int i = 1; i <= N; ++i) {
        int sum = findsumofdigits(i);
        if (sum >= A && sum <= B) {
            total += i;
        }
    }
    cout << total << endl;
    return 0;
}
```
二か月くらい前に

C
高橋君は、日頃の感謝を込めて、お母さんに数列をプレゼントすることにしました。 お母さんにプレゼントする数列 A は、以下の条件を満たす必要があります。
A は X 以上 Y 以下の整数からなる
すべての 1≤i≤|A|−1 に対し、Ai+1 は Ai の倍数であり、かつ Ai+1 は Ai より真に大きい
高橋君がお母さんにプレゼントできる数列の長さの最大値を求めてください。
制約
1≤X≤Y≤1018
入力は全て整数である

```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
#define INF 1e9
int main() {
	ll X, Y;
	cin >> X >> Y;
	ll ans = 0;
	for (ll i = 0; i < INF; ++i) {
		if (X <= Y) {
			ans++;
		}
		else {
			break;
		}
		X *= 2;
	}
	cout << ans << endl;
	return 0;
}
```
Django2.0でブログの作成（その７：記事の編集）

その７

記事の投稿者であれば、その場で編集出来たら良いですよね。
create_articleとdelete_commentの合わせ技です！
投稿者なら編集ボタンを表示させ、編集用htmlに飛ぶという方法をとります。
それでは、let's go!

# views.py
記事編集という定義を追加します。

```blog/views.py
def edit_article(request, pk):
    article = Post.objects.get(id=pk)

    if request.user.id == article.author.id: #if記事の投稿者
        if request.method == "POST":
            form = forms.PostForm(request.POST, instance=article)
            if form.is_valid():
                article = form.save(commit=False)
                article.author = request.user
                article.save()
            return redirect('blog:article', pk=article.id)
        else:
            form = forms.PostForm(instance=article)
            print(form)
    else: #記事の投稿者でないのならば、記事のページに強制的に戻る
        return redirect('blog:article', pk=article.id)

    return render(request, 'blog/edit_article.html', {
        'article':article, 'form':form
    })
```

# urls.py
追加します。

```blog/urls.py
path('article/<int:pk>/edit/', views.edit_article, name='edit_article'),
```

# edit_article.html
記事編集のhtmlを作成します。

```edit_article.html
<html>
  <head>
    <!-- bootstrap -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
  </head>

  <body>
      <div>
        <a href="{% url 'blog:post_list' %}" class="btn btn-primary">HOMEへ戻る</a>
          <h1><a href="">記事の編集</a></h1><br>

          <form method="post" action="">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit">
          </form>

      </div>
  </body>
</html>
```
commentと同じ感じですね。
何をやっているかわからなくなってしまった方はコチラがオススメ。
[DjangoのForm生成が便利すぎる件について](http://d.hatena.ne.jp/natsumesouxx/20100522/1274554253)

# article.html
記事のページに編集ボタンをつけましょう。
もちろん、投稿者にしか編集権限はありませんが、ボタンの表示も記事投稿者のみに制限しておきます。

```article.html
{% if request.user.id == article.author.id %}
  <a href="{% url 'blog:edit_article' article.id %}" class="btn btn-primary">記事を編集</a>
{% endif %}
```

# 確認
<img width="379" alt="スクリーンショット 2018-10-09 16.55.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/ffcb6fbc-f37e-7691-b050-fcdee0ba7874.png">
Struts2をJDK11環境で動かすために必要なこと

# Struts2はjdk7以降で動作するのだが…

一部の公式プラグインで上位のバージョン(8～11)で動かないこともあるため、Struts2プラグインから利用している他ライブラリもあわせてバージョンをあげると動作します。

jdkのバージョン8や10の対応でStruts2.5の中核部がセキュリティフィックスも含めてリファクタリング＆利用ライブラリのバージョン修正もされていますので、動作確認バージョンの再確認は適宜必要です。

なお、本件の対応は、Struts2.5.17 のみを対象としています。Struts2.3系は別途対応が必要です。

# 対応内容

## mavenへの対応

### maven-compiler-plugin

jdk11への対応が必要です。今までsourceやtarget要素でバージョンを指定していましたが、これを解除して release を使います。

```xml:pom.xml(build抜粋)
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <release>11</release>
                </configuration>
            </plugin>
   .........
```

## Struts2-Plugin

### Struts2-Springプラグイン

Struts2内部ではSpring4.2系を使っており、DIコンテナとして利用しています。5.0/5.1にあげても特に問題なく動作します。

### Struts2-Conventionプラグイン, Struts2-Restプラグイン

[ASM](https://asm.ow2.io/) のバージョンを6系にします。2018年9月の段階では、最新安定板の 6.2.1 で動作確認済みです。

```xml:pom.xml(dependencies抜粋)
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>${struts2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>${struts2.version}</version>
        </dependency>
...
        <dependency>
        	<groupId>org.ow2.asm</groupId>
        	<artifactId>asm</artifactId>
        	<version>6.2.1</version>
        </dependency>
        <dependency>
        	<groupId>org.ow2.asm</groupId>
        	<artifactId>asm-commons</artifactId>
        	<version>6.2.1</version>
        </dependency>
        <dependency>
        	<groupId>org.ow2.asm</groupId>
        	<artifactId>asm-tree</artifactId>
        	<version>6.2.1</version>
        </dependency>
```

### Struts2-JSONプラグイン

デフォルトでは特に変更は不要ですが、もしJSONレスポンスの出力設定クラスを `org.apache.struts2.json.JSONWriter` から変更した場合は、jdk11でも動作するかを確認しましょう。特に古いバージョンのJacksonやJSonicを使っている場合は依存ライブラリの影響で動かない可能性があります。

### Struts2-Thymeleaf3プラグイン

Conventionプラグインと同じ対応で問題ありません。バージョン1.2.0のみ動作します。
テキストボックスに入力した文字数をリアルタイムに表示するアレ

テキストボックスに入力されてる文字数をリアルタイムに計算して表示するアレ

HTMLの方はこんな感じ

```CSS
<style>
.length_counter {
  display: block;
  text-align: right;
}
</style>
.
.
.
<body>
  <input type="text" id="text_box" maxlength="20" class="countable">
  <label for="text_box" class="length_counter">
</body>
```

JSの方はこんな感じ

```JavaScript
$(function () {
  // 画面を表示したときにテキストボックスのサイズと合わせてから、[入力されてる文字数] / [最大文字数] を表示
  $('.length_counter').each(function () {
    var obj = $('#' + $(this).attr('for'));
    $(this).css({
      'width' : obj.css('width')
    });
    $(this).html(obj.val().length + ' / ' + obj.attr('maxlength'));
  });

  // 入力イベントを拾ってラベルを更新
  $('.countable').bind('keydown keyup keypress change', function () {
    var maxLength = $(this).attr('maxlength');
    var valLength = $(this).val().length;
    $('[for="' + $(this).attr('id') + '"]').html(valLength + ' / ' + maxLength);
  });
});
```

ひとまず分かっているのは、jQuery UIのAccordionで折り畳まれた要素に対しては、width属性が上手く取得できないことがあるので、ラベルへの初期値の表示はAccordion化する前に済ませておかないと、体裁が崩れちゃうことくらい。
曖昧比較は果たして本当に絶対悪なのか？

## はじめに

ポエムです
いちエンジニアの主張です
`PHP`の`==`曖昧比較と`===`厳密比較について取り上げます

## 曖昧比較は果たして本当に絶対悪なのか？

いきなり表題ですが、例えば以下のようなコードを見てください。

```php
if($message == 'hoge'){
  echo('true');
} else {
  echo('false');
}
```

こんなコードがあった時、僕は間違いなくレビューでこうコメントをつけます

`曖昧比較ではなく厳密比較にしてください`

これに関しては理由もなく本当に脳死でコメントつけてました
ただ最近ふと「曖昧比較って何のためにあるんだっけ？」となり熟慮したいと思ったのでこの記事を書いてます

## 曖昧比較のデメリット

そもそも何故曖昧比較はダメなのでしょう？
例えば次のような時がNGです。

```php
$message = 0;
if($message == ''){
  echo('messageは空文字です');
} else {
  echo('messageは'.$message.'です');
}
```

上記結果は「messageは空文字です」になります(`0 == ''`がtrue判定になる)
この場合そもそもmessageに数値の0が入ってる時点で変なのですが、空文字判定にヒットしてしまうため意図しない挙動をしてしまう可能性があります

一般的に「意図しない挙動、意図しない判定」をされる可能性が高くなるため、使わない方がよいとされています。

## 曖昧比較のメリット

私の疑問を掻き立ててしまったコードがこちら

```php
if($icon != ''){
  echo("<i class={$icon}></i>");
}
```

画面に表示するiconのクラス名を変数に持っており、空文字でなければそのアイコンを表示するというような内容です
このコードをレビューした時のやりとり

私「厳密比較にしてください」
後輩「厳密比較にしたところうまく判定できないところがあったのでこのままにします」
私「うまくいかなかったということは空文字以外があったってこと？」
後輩「はい、NULLが入っている場合がありました。NULLの時に空のiタグが表示されてしまいます」
私「なるほど、ではis_null判定も追加しましょう」
後輩「分かりました！」
で改修したコード

```php
if($icon !== '' && !is_null($icon)){
  echo("<i class={$icon}></i>");
}
```

空文字でもNULLでもない場合にはiconを表示する
今はこれでも良いですが今後falseや空配列が入ってきた場合（そもそもそうならないようにした方が良いが）に、判定がどんどん複雑化するなーという思いになりました
だったら曖昧比較のままでよいのでは…？🤔

`$icon != ''`であれば空文字でもNULLでもfalseでも空配列でもやりたいことが実現できる
ここで比較したいのは空文字ではなく「空」であること、だったので厳密に空文字やNULLを比較する必要がなかったのです
ただしそれに気付いたのでこのケースに関しては以下のように修正しました

```php
if( !empty($icon) ){
  echo("<i class={$icon}></i>");
}
```

## 結論

やはり原則的にはデメリットの方が多く、厳密に比較した方が堅牢なコードが書けるように思います。
限定的に曖昧比較を使う方がコーディングが楽な場合もありますが

* 曖昧なので何を比較したいのか書き手と読み手で解釈が異なる可能性がある
* 読み手の知識が足りない場合に参考にされるコードとしてはやはり相応しくない（コピペで増殖しても困る）

ので、基本的には非推奨という結論になりました。

## おわりに

あくまでいち個人、いちエンジニアの主張なので石を投げるのは程々にお願いしますｗ :sweat:
CSS設計方法

#目次
+ 導入背景
+ BEMとは
+ SMACSSとは
+ OOCSSとは
+ 記述例
+ パーツ名規則

#導入背景
CSSの記述ルールは自由度が高いため、人によってルールが異なり、コードルールの不明確、コードの重複、メンテナンス性の弱さなどの弱点がある。一人で作業する場合でも複数人で作業する場合でも、正確で迷いの少ないCSS設計ルールの必要性を感じた。今回それらを解決するためにBEM、SMACSS、OOCSSを採用し、自分なりに利用方法をまとめてみた。


#BEMとは
Block(塊),Element(要素),Modifier(状態）の略で、
`Block__Element--Modifier`のように記述する
つまり指定したい場所と状態がわかるように記述すれば良い


#記述規則

**ブロック以下の要素はわかる程度に要素名を省略**
Element→Elmnt


**ハイフンとアンスコは使わない**
`Block-Element__Element--Modifier`のように記述したい場合、
ローワーキャメルケースで記述する

```
BlockElmntElmnt-Modifier
```

**全部にCSS名をつけない**
`ul`の直下は`li`なのでつけない

```ex.css
#リンク
.Link>li{
display:inline-block;
}

#画像
.blockImg>img{
}

#画像(リンク)
.blockImgLink>img{
}

#テーブル
.Atable>td{
}

```

**なるべく3つまで**
`BlckElmntElmnt--Modifier`や`BlckElmnt...-Modifier`など、どこまで子供を記述すればよいか迷うため、名前は**親と子の3つまで**に収まるようにする。
そこにしか使わない場合は仕方ないため長くなることは目を瞑る。


#SMACSS
SMACSS とは、Scalable and Modular Architecture for CSSの略でスマックスと読みます。 SMACSSはCSSを5種類のルールにカテゴライズして記述する手法です。 5種類のルールとは、ベース、レイアウト、モジュール、ステート、テーマ です。


#OOCSS
Object Oriented CSS(オブジェクト指向CSS)の略。
構造と見た目、又コンテナと内容を分離してクラス定義し、それらを組み合わせてスタイルを定義する方法です。
IDや子孫セレクタによってスタイルを定義するのではなく、「すべてのスタイルをクラスで定義」して「それらを組み合わせる」ということです。


SMACSSとOOCSSをBEMに取り入れると、

```index.html
<button class="btn btn-primary col-2">ボタン1</button>
<button class="btn btn-success col-2">ボタン２</button>
```

```reset.css
button{
background-color: transparent;
border: none;
cursor: pointer;
outline: none;
padding: 0;
appearance: none;
}
```

```common.css
.btn{
width:50px;
line-height:40px;
font-size:12px;
text-align:center;
}
.btn-primary{
background-color:red;
}
.btn-success{
background-color:green;
}

```

```layout.css
.col-2{
display:inline-block;
width:48%;
}
.col-2+.col-2{
margin-left:2%;
}

```
上記のように細かくBlockを細かく刻んで、cssの重複も減る。


#記述イメージ
細かいBlockを作って積み上げるイメージ


#パーツ名規則

**要素名**

接頭辞

| 要素 | 規則 |
|:--|:--|
| 主要な | main |
| 主要な | primary |
| 補助的な・第二の| secondary |
| 一般的な | general |
| 全体的な | grobal |
| 局所的な | local |

* main > primary



セクション系

| 要素 | 規則 |
|:--|:--|
| ページ全体 | container |
| ヘッダー | header |
| サイドバー | side |
| フッター | footer |
| メインコンテンツ | main |

*全体の場合はglbを接頭辞につける

パーツ系

| 要素 | 規則 |
|:--|:--|
| ナビ | nav |
| ボタン | btn |
| リスト | list |
| 背景 | bg |
| ロゴ | logo |
| 見出し | ttl |
| テキスト | txt |
| 画像、図、写真 | img |
| サムネイル | thumb |
| バナー | bn |
| アイコン | icon |
| ページトップ | pagetop |

レイアウト系

| 要素 | 規則 |
|:--|:--|
| ユニット | unit |
| ボックス | box |
| コラム | col |


**Modifire**

| 種類 | 規則 |
|:--|:--|
| 現在 | current |
| アクティブ | active |
| 次へ | next |
| 前へ | prev |
| 主要な | primary |
| 成功した | success |
| 注意 | warning |
| 太文字 | b |
Cloud SQL Proxyを別サーバで実行

#経緯
Cloud SQL Proxyを使用する場合、公式ではlocalhost(127.0.0.1)を指定する様になっているが、
Cloud SQL Proxy専用サーバを構築し、そのサーバ経由で接続できるか試してみた。

公式
<https://cloud.google.com/sql/docs/sql-proxy?hl=ja>

#結論
構築した専用のサーバのIPを指定しても接続が正常に行えなかった。

#原因
cloud_sql_proxyのモジュールをバイナリエディタで調べて見るとlocalhostが指定されていた。

設定ファイル等で変更できる様になっていれば良かったのに
あまり用途がないからかな。。。
【redis】入門

# 【install】

```
sudo apt install redis-server redis-tools redis-sentinel
```

# 【基本的な使い方】

## ・DBの選択

```
select 0
select 1
```

## ・保存

`/var/lib/redis/dump.rdb`に保存される。
このファイルをリネームすることによって複数のデータベースファイルを管理することができる。

```
save #フォアグラウンドセーブ
bgsave #バックグラウンドセーブ
```

## ・set/get

```
set key01 value01
set key02 value02
get key01
get key02
```

## ・データ型の取得

```
type key01
type key02
```

## ・複数個のデータの同時set/get

```
mset key01 value01 key02 value02
mget key01 key02
```

## ・全てのkeyの取得

```
keys *
```

## ・keyが存在しているかどうかを取得

```
exists key01
exists key01 key02
```

## ・keyの削除

```
del key01
del key02
```

# 【データ構造】

## ・String

最も基本的な型。

```
set str01 5
incr str01
incrby str01 10
dicr str01
dicrby str01 10
```

## ・List

配列。

```
rpush list01 value01 #後ろに追加
rpush list01 value02 #後ろに追加
lpush list01 value00 #前に追加
rpop list01 #後ろから一つ取り出し
lpop list01 #前から一つ取り出し
lrange list01 0 5 #0から5までインデックスアクセス
ltrim list01 0 5 #lrangeの破壊的バージョン
lindex list01 3 #インデックス3にアクセス
lset list01 2 value02_new #インデックス2のvalueを更新
llen list01 #Listの長さを取得
```

## ・Set

要素の集合。

```
sadd set01 value01 #要素の追加
sadd set01 value02 #要素の追加
srem set01 value02 #要素の削除
smembers set01 #要素の表示
sunion set01 set02 #和集合
sinter set01 set02 #積集合
sdiff set01 set02 #差集合
```

## ・Sorted Set

ソート済みのSet。

```
zadd zset01 1 value01 #スコア1の要素を追加
zadd zset01 5 value02 #スコア5の要素を追加
zrem zset01 value02 #要素の削除
zrange zset01 0 3 #インデックス0から3までを昇順で取得
zrevrange zset01 0 3 #インデックス0から3までを降順で取得
zrangebyscore zset01 1.3 5 #スコア1.3から5までを取得
zrangebyscore zset01 (1.3 (5 #スコア1.3超過5未満までを取得
```

## ・Hash

ハッシュテーブル。

```
hset hash01 key01 value01
hset hash01 key02 value02
hget hash01 key01
hmset hash01 key03 value03 key04 value04
```
10月9日エクセルVBA学習ー同一のシートに文字をコピーするやり方ー

こんにちは、エクセルVBAで、同一のシートに文字のコピーの仕方に関して勉強をしてみました。

RangeオブジェクトのCopyメソッドの使い方に関してきちんと理解ができてなかったため

ネット上にあるサンプルプログラムを理解し、手打ちしてみて

実行してみました。

その結果は以下のキャプチャになります。
![2018-10-09 (1).png](https://qiita-image-store.s3.amazonaws.com/0/200171/e22a67f0-3850-a694-6734-b4ca75afb446.png)

A1セルに「こんにちは」という文字を書きましてそのA１セルに書いた文字をC3セルにコピーしてみる

といったやり方の学習をしました。

実際に書いたソースコードです。

```vb
Sub sample()
Worksheets("sheet1").Range("A1").Value = "こんにちは"
Range("A1").Copy Range("C3")
End Sub
```

こうしたことによって、A1セルには特定の文字が書かれ、その文字をCopyメソッドを使って
同一ブック、同一シートのC3列にコピーしたというものです。

こうして同一シートにコピーする方法を学んだので
次は別シートにコピーするやり方を学んでいきます。

また、進捗がありましたら、記事を更新いたします。
[WordPress]タグ編集・保存時に関連データを更新する

##フック
**edit_terms**（複数形）、**edited_term**（単数形）の二つのフックを使うことで実現できた。

    edit_terms　　グがDBに保存される前に呼び出される
    edited_term  保存された後に呼び出される

カスタマイズはテーマディレクトリ内にfunction.phpファイルを作成して記述する。
wordpress/htdocs/wp-content/themes/テーマ名/function.php
フックを利用するには、WordPressに組み込まれているadd_action関数を利用する。

```php:function.php

// タグが更新される直前：　更新前のタグ情報を変数に保持する
add_action('edit_terms', 'get_tag_edit_before', 10, 2);
function get_tag_edit_before($term_id, $taxonomy){
         $tag = get_tag($term_id);
         global $cstm_tag_slug;
         $cstm_tag_slug->slug = $tag->slug;
}
```

```php:function.php
// タグが更新された場合：　タグに紐づく固定ページを更新する
add_action( "edited_term", 'edit_info_page', 10, 3);
function edit_info_page($term_id, $tt_id, $taxonomy){
         global $wpdb;
         if($taxonomy != 'post_tag'){ return; }
         $tag = get_tag($term_id);
         $tag_slug = $tag->slug;
         $tag_name = $tag->name;
         // 固定ページIDを取得する
         global $cstm_tag_slug;
         $post_id = $wpdb->get_var( 'SELECT 
                          ID
                          FROM '.$wpdb->posts.' 
                          WHERE post_type = "page"
                                  AND post_name = "'.CSTM_PREFIX.$cstm_tag_slug->slug.'"'
                  );
         $post = array(
                  'ID'            => $post_id,
                  'post_title'    => CSTM_TITLE . $tag_name,
                  'post_name'     => CSTM_PREFIX . $tag_slug
          );
          wp_update_post($post);
 }

```

※　WordPressのフックは似たような名前が付けられたフックが多く、
引数の数などが違っても動かなかったりした。
例：**edit_terms**、**edit_term**、**edited_terms**、**edited_term**
**edited_terms**は編集保存後に実行されるフックなのかと思ってしまうが、実際は違う。


###おまけ１：タグ追加時にテンプレートを指定して固定ページを作成する
ソースコードは下記。

```php:function.php
// タグが追加された場合：　タグに紐づく固定ページを作成する
add_action('create_term', 'create_info_page', 10, 3);
function create_info_page($term_id, $tt_id, $taxonomy){
         if($taxonomy != 'post_tag'){ return; }
         $tag = get_tag($term_id);
         $tag_slug = $tag->slug;
         $tag_name = $tag->name;
         // タグが追加された場合
         // 固定ページを自動作成する
         $post = array(
                 'post_title'     => CSTM_TITLE . $tag_name,
                 'post_content'   => '',
                 'post_status'    => 'publish',
                 'post_type'      => 'page',
                 'post_name'      => CSTM_PREFIX . $tag_slug,
                 'page_template'  => CSTM_INFO_TEMPLATE
         );
         wp_insert_post( $post, true);
}
```

###おまけ２：WordPressタグ更新処理について詳しく知りたい

ソースコードはこちら
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/taxonomy.php
Ubuntu18@VMware Fusion 11でmacによるキーボード入力環境を整える

MacにVMwareで仮想環境を構築して、Ubuntuをインストールしました。
キーボードでの入力が思うようにいかず、設定変更に苦戦したので後学のために書き残します。
自身で行った設定は３つです。

# 環境
- VMware：VMware Fusion 11 Pro
- Ubuntu：Ubuntu 18.04 LTS（日本語Remix）
- PC：MacbookPro（JISキーボード）

# インストール直後の状況
- 『英数』キーが『Capslock』として動作
- 入力メソッドをmozc（Google日本語入力）に変更すると、英字入力の際も変換が有効になる

# 改善目標
- 通常のMacbookと同様の動作
    - 『かな』キーでローマ字入力
    - 『英数』キーで英数字直接入力

# Step１：キーボードの選択
Ubuntuをインストールすると、デスクトップ画面でキーボードの選択が立ち上がります。
そちらの選択は『MacBook/MacBook Pro (Intl.)』を選択します。

# Step2：『英数』キーから『Capslock』をはずす
キーボードを選択した直後では、『英数』キーに『Capslock』が割り当てられており、macと同様のキー操作ができません。
そこで、『英数』キーから『Capslock』をはずすように修正します。

## 現在の設定の確認
まずは現在の設定を確認してみましょう。
`$ setxkbmap -print`
上記コマンドを端末で入力すると下記の結果が出力されると思います。

```bash:結果
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+jp+us:2+inet(evdev)+capslock(escape)"   };
    xkb_geometry  { include "pc(pc105)" };
};
```
こちらの結果から、`xkb_symbols`を見ると`pc`、`jp`、`us`、`inet(evdev)`、`capslock(escape)`を読み込んでいることがわかります。

## 設定ファイルの編集
`pc`、`jp`といったそれぞれのオプションの細かい設定は、`/usr/share/X11/xkb/symbols/`にすべて書かれています。
ここの`jp`を編集すれば問題は解決します。
編集箇所は２か所です。
47行目付近と186行目付近の２か所を下記のように変更します。

```bash:/usr/share/X11/xkb/symbols/jp
    key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
    ↓
    key <CAPS> { [ Eisu_toggle ] };
```

書き換えたら再起動して設定を反映させます。

# Step3：『英数』キーでIMEオフ
ここまでで、無事『英数』キーがCapslockから開放されました。
上部のバーの入力ソースのアイコンから、『ツール』＞『プロパティ』で『Mozcプロパティ』画面が開きます。
この画面で『キー設定の選択』の『編集』を選びます。

『Mozcキー設定』画面を下の方にスクロールしていくと、下の画像のように『英数』キーに関わる部分が出てきます。
MS-IMEの標準の設定では『英数入力切替』となっています。
![Eisu-英数入力切替.png](https://qiita-image-store.s3.amazonaws.com/0/281085/ea8c0e5c-e29a-157a-6f12-b933195d225d.png)

これを『IMEを無効化』に変更します。
![Eisu-IMEを無効化.png](https://qiita-image-store.s3.amazonaws.com/0/281085/3c75a11f-3823-2e23-f7d6-ca2590863d4b.png)

以上で目的としていた動作になります。

# 参考
[mac/linux/windowsに全対応した日本語入力切り替えキー](https://yhara.jp/2018/05/22/kana-eisu-mac-linux-win)
Situs Master Dominoqq

Jika situs master dominoqq  Anda masih memiliki tangan yang kuat bermain [Situs Judi Online](https://masterdominoqq.net), Anda harus benar-benar bertaruh pada kegagalan.Tidak ada inisiatif Terutama terhadap lebih banyak pemain, tangan yang buruk harus benar-benar lulus. Bermain dominoqq  dengan tangan seperti pasangan rendah atau menengah adalah kesalahan yang sering dilakukan pemula. Sebaliknya, tangan yang baik harus dilindungi terhadap menggambar domino qq tangan dengan membuat taruhan dan meningkatkan [https://www.racked.com/users/masterdominoqq](https://www.racked.com/users/masterdominoqq) tangan menggambar sering dapat dimainkan agen domino online  dengan hasil yang baik terhadap beberapa pemain. Hal ini tergantung pada dominoqq online  fakta bahwa peluang pot situs domino99  lebih baik jika situs domino online lebih banyak pemain melihat dan memenangkan lebih banyak chip jika Anda menemukan draw.Ii Anda limpate Pada tahap awal [https://community.endnote.com/t5/user/viewprofilepage/user-id/528174](https://community.endnote.com/t5/user/viewprofilepage/user-id/528174) itu benar-benar sah untuk hanya melihat situs domino terpercaya sebelum kegagalan. Bahkan dalam posisi situs domino online  awal dimungkinkan untuk melihat dengan tangan yang berbeda. Ini situs domino terpercaya termasuk pasangan menengah-kecil dan konektor benih tunggal, tetapi juga jenis atau tangan. Kemungkinan agen domino online lain adalah untuk melihat ketika satu atau agen domino online  lebih pemain memanggil kami. Tergantung pada posisi pilihan ini dimungkinkan agen domino99 dengan banyak domino99 online tangan. Terutama pada tombol dengan [https://community.activision.com/t5/user/viewprofilepage/user-id/12767715](https://community.activision.com/t5/user/viewprofilepage/user-id/12767715)
 beberapa pemanggil Anda dapat situs domino terpercaya lemas dengan hampir semua kartu. Anda telah lulus situs domino online kepada kami dan Anda berada di posisi tengah atau akhir dan Anda memutuskan agen domino online untuk bermain tangan, lebih baik untuk menaikkan. Dalam lempengan lemas Anda harus terus bermain hanya di hadapan benar-benar baik jepit situs master dominoqq.
Rails ransack  ボタンで検索条件を設定する方法

# はじめに
画面での検索画面を作るのに便利な `ransack`というgemがありますが、例えば、「本日の予定」といった、値を入力せず、特定条件を既に持ったボタンを作りたい場合に以下のようにすればできます。

# 前提条件
- Planモデルに検索したい、「date」カラムという例にします。
- controllerのindexで検索処理を実装し、検索条件はview側で実装
- viewはslimで記載

# Controller
コントローラーは以下のような感じ。

```
class PlansController < ApplicationController

  def index
    @q = Plan.ransack(params[:q])
    @plans = @q.result
  end
```


# 方法１(search_form_for & hidden)
hidden_fieldに条件と値を設定して、値を飛ばし検索する。

```
= search_form_for @q, url: plans_path do |f|
  = f.hidden_field :date_eq, value: Date.today
  = f.submit '本日の予定', class: 'btn btn-primary'
```

# 方法2(link_to)
上記だと、複数ボタンを設定しづらいので、link_toでindexに飛ばす際、
条件と値を設定して、検索する。

```
= link_to '本日の予定', plans_path(q: { date_eq: Date.today }), class: 'btn btn-primary'
= link_to '過去の予定', plans_path(q: { date_gteq: Date.today }), class: 'btn btn-primary'
```

このようにすることで、複数ボタンを作成でき、かつ、`q:`の中に複数条件を含めることができる。


以上。ちょっとした小技でした。
rails consoleで試し実行したい時

rails consoleでDBの変更をロールバックしたい時は、sandboxオプションをつけると、コンソールを抜けた時に自動でロールバックされます。

[sandboxとは](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9_(%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3))

```
 bundle exec rails console --sandbox
```
Rubyの基本記述の仕方〜その9〜　ローカル変数とインスタンス変数

変数の取り扱いで、「@」を頭に付けるべきか不要なのか判断に迷うことが増えてきました。
先輩から聞いた説明がとても明快で、つまづきがひとつ解消。
忘れないうちに以下にまとめておきます。

## ローカル変数
・頭に何もつかない。
・メソッドで定義したスコープ（def〜end）の中でだけ使える。

```ruby.qiita.rb
def morikuma
 user = User.find_by(id: params[:id])
end
```
※定義の内容はあくまで一例です。


## インスタンス変数
・@が頭につく。
・インスタンス変数のスコープはメソッド定義内に限定されない。
　→スコープの範囲外や、ファイルが変わっても使える。

```ruby.qiita.rb
def morikuma
 @user = User.find_by(id: params[:id])
end
```
※定義の内容はあくまで一例です。


## 検証

実際に、インスタンス変数で定義されて正常に動いているコードをローカル変数に変更して検証してみました。

＜正常に機能している記述＞

```ruby.qiita.rb
def index
 @users = User.all
end
```

```index.html.erb
〜
<% @users.each do |user| %>
〜
〜
<% end %>
〜
```
@usersで定義されているインスタンス変数を、ローカル変数に変えてみます。
＜検証用に変更した記述＞

```ruby.qiita.rb
def index
 users = User.all
end
```

```index.html.erb
〜
<% users.each do |user| %>
〜
〜
<% end %>
〜
```

![スクリーンショット 2018-10-09 15.47.34.png](https://qiita-image-store.s3.amazonaws.com/0/148137/4df719bd-7e2c-589d-387b-305dfc642e05.png)

undefined local variable or method 'users'
「users」というメソッドが定義されていないよとエラーが出ました。

ローカル変数はあくまで、定義したスコープの範囲内でしか適用されないことが確認できました。
別のファイルで呼び出そうとしても「undefined」となります。



## 参考サイト
progate
https://prog-8.com/

Ruby のエラーメッセージを読み解く（初心者向け）その 2
https://qiita.com/scivola/items/77017693de371ab49667

Ruby 変数のスコープ
https://qiita.com/kansiho/items/f5ab9b6eeb990e6af327

RubyLife インスタンス変数
https://www.rubylife.jp/ini/class/index4.html
Rubya~zまで出力

```
puts [*?a..?z]
#？aで文字リテラル化している
#参考https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html
=begin
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
=end
```
Django2.0でブログの作成（その６：記事の作成）

その６

記事の作成をトップページからできるようにしましょう。
入力フォームから何かを作る場合は、forms.pyを使用します。（commentでもやりましたね。ほとんど同じですよ！）

# models.py
既存のPostモデルを使用するので、今回ここの変更はありません。

# forms.py
新しく記事入力のフォームを作って、PostModelと繋げるため以下のように記述を追加します。

```blog/forms.py
class PostForm(forms.ModelForm):
    class Meta:
        model = models.Post
        fields = ('title', 'text',)
```

# views.py
```blog/views.py
def create_article(request):
    form = forms.PostForm()
    if request.method == "POST":
        form = forms.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
        return redirect('blog:article', pk=post.id)

    return render(request, 'blog/create_article.html', {
        'form': form
    })
```

#urls.py
```blog/urls.py
path('article/create/', views.create_article, name='create_article'),
```
追加します。

# create_article.html
新しく、記事の作成用のhtmlを作ります。

```create_article.html
<html>
  <head>
    <!-- bootstrap -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
  </head>

  <body>
      <div>
        <a href="{% url 'blog:post_list' %}" class="btn btn-primary">HOMEへ戻る</a>
        <hr>
          <h1>記事の作成</h1><br>

          <form method="post" action="">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit">
          </form>
      </div>
  </body>
</html>

```
# post_list.html
トップページ(post_list.html)に記事の作成ボタンを追加します。

```post_list.html
<a href="{% url 'blog:create_article' %}">記事の作成</a>
```



# 確認
※`Post.author" must be a "User" instance.`
と言われてインスタンスがないなどと言われる場合があります。
これはユーザーがログアウトされた状態で記事を書き込もうとしているので、エラーになっているだけです。
localhost:8000/adminから一度ログインしてためしてみてください。
（この問題の永久的解決法はまたのちほど…）

<img width="365" alt="スクリーンショット 2018-10-09 15.33.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/699a16de-c99d-9f92-b78f-8faa2d61faef.png">
Django2.0でブログの作成（その５：コメントを削除）

その５

記事に対して、コメントを出すところまでうまくいきました。
では、コメントをしたユーザーのみに、対象コメントの削除権を与えるにはどうしたらいいでしょう？

それではスタート。

# views.py

```blog/views.py
from django.shortcuts import render, redirect #redirect追加
(略)

def delete_comment(request, pk, comment_pk):
    comment = Comment.objects.get(id=comment_pk)
    post_id = pk
    if request.user.id == comment.author.id or \
       request.user.id == comment.post.author.id:
        comment.delete()
    return redirect('blog:article', pk=post_id)

```
同じページにリダイレクトするために、まずはredirectをインポートします。
pkは記事自体の番号、
comment_pkはコメントの番号です。
ifの中身は
削除リクエストのユーザーid == コメントの筆者(loginid)　か、
削除リクエストのユーザーid == ポスト(記事)の筆者
なら削除可能としています。

# urls.py
追加します。

```blog/urls.py
    path('article/<int:pk>/comment-delete/<int:comment_pk>/', views.delete_comment, name='delete_comment'),
```

# article.html
コメント削除ボタンの表示条件もifをつけます。

```article.html
        {% if request.user.id == article.author.id or request.user.id == comment.author.id %}
          <a href="{% url 'blog:delete_comment' article.id comment.id %}" class="btn btn-danger">コメント削除</a>
        {% endif %}
```

挿入箇所はfor commentの中です。


# 確認
※記事自体は adminが作成
※コメントは admin と user1 が書き込んでいる状態

▼user1でログイン
記事の筆者ではないので、自分のコメントだけしか削除できない。
<img width="331" alt="スクリーンショット 2018-10-09 14.46.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/65deb22c-ad14-4e7f-ce15-001d6a41b7ef.png">

▼adminでログイン
記事自体の筆者なので、全てに削除権が与えられる。
<img width="256" alt="スクリーンショット 2018-10-09 14.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/f60297ff-55ef-9901-4ac8-1cd3d92bca27.png">
vimのプラグインの入れ方（Vundle）

# 概要
Vundleというのが人気っぽいので使ってみる。
基本的には下記のQuickStart準拠。
https://github.com/VundleVim/Vundle.Vim#quick-start

# 前提
- Gitが使える。
- 筆者環境はMacなので、他のOSだと動きが違うかもしれません。

# 準備
格納用ディレクトリを作る。

```
mkdir -p ~/.vim/bundle
```

githubからVundleを取得。

```
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
```

.vimrcを編集。（なければ作る）

```
vi ~/.vimrc
```

下記をファイルの先頭に追記。※元のQuickStartでは説明コメントが長かったので一部を省きました。

```
set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" !! write plugins here !!

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
```

vimを起動して反映。

```
vim +PluginInstall +qall
```

# プラグインの導入
上記の`!! write plugins here !!`のところに、以下のようにプラグイン名を記載。

```
Plugin 'othree/yajs.vim'
```

vimを起動して反映

```
vim +PluginInstall +qall
```

# 補足
個人的にハマったのでメモ。
Macでシンタックスハイライトのプラグインを入れてもハイライトされなかった。
.vimrcの最後に下記を追記したらハイライトされるようになった。

```
:syntax on
```
Django2.0でブログの作成（その３：記事表示ページ）

ページをつくる その３

まだタイトルを押しても飛べないはずです。
移動先の記事ページを作ってリンクを貼りましょう。
記事専用の子ページをarticleとします。

# views.py
```blog/vies.py
def article(request, pk):
    article = Post.objects.get(id=pk)

    print(article)
    return render(request, 'blog/article.html', {
        'article': article
    })
```
pkはプライマリーキーです。
記事ごとに順番の番号が振り分けられているのですが、それをarticleでgetしています。
なので、一番最初に投稿した記事にはid=pk=1が入ります。


# blog/urls.py
追加します。

```blog/urls.py
    path('article/<int:pk>/', views.article, name='article'),
```

pkは記事の番号でした。

# article.html
template/blogの下に記事専用のページを作ります。

```article.html
<html>
  <head>
    <!-- bootstrap -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
  </head>

  <body>
    <a href="{% url 'blog:post_list' %}" class="btn btn-primary">HOMEへ戻る</a>
    <hr>
    <h1>記事</h1>

    <p>{{ article.title }}</p>
    <p>{{ article.text|linebreaksbr }}</p>
    <hr>
  </body>
</html>
```
bootstrapを読んでいるので、HOMEへ戻るボタンにclass定義をしてやるとそれっぽくなります。
articleは`Post.object`を読んでいました。
なので`article.title`や`article.text`でタイトルなどが呼び出せます。

### リンクの貼り方

```html:
<a href="{% url 'blog:post_list' %}">HOMEへ戻る</a>
```
`{% %}`でくくります。
リンクなのでurl。
そして、urls.pyで定義したnamespaseを入れ込みます。

### 課題：ホームのページから記事のページにリンクを貼ってみよう
やってみよー。

- - - 
【答え】

```post_list.html
<html>
    <head>
        <title>my blog</title>
    </head>

    <body>

        {% for post in posts %}
          <div>
              <p>date: {{ post.created_date }}</p>
              <h1><a href="{% url 'blog:article' post.id %}">title: {{ post.title }}</a></h1>
              <p>{{ post.text|linebreaksbr }}</p>
              <hr>
          </div>
        {% endfor %}

    </body>
</html>
```

`"{% url 'blog:article' post.id %}"`
記事の番号も渡さないといけないので、 post.id もこの中にいれます！
難しいですね。
Django2.0でブログの作成（その２：タイトルと本文の表示）

その2

タイトルや本文を表示させよう。


# views.py
```blog/vies.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post

def post_list(request):
    posts = Post.objects.all()
    return render(request, 'blog/post_list.html', {
        'posts': posts
    })
```

# post_list.html

```post_list.html
<html>
    <head>
        <title>my blog</title>
    </head>
    <body>

        {% for post in posts %}
          <div>
              <p>date: {{ post.created_date }}</p>
              <h1><a href="">title: {{ post.title }}</a></h1>
              <p>{{ post.text|linebreaksbr }}</p>
              <hr>
          </div>
        {% endfor %}

    </body>
</html>
```
created_dateが新しい順に並んでいる秘訣は、
models.pyで class Meta:を設定しているからです。
また、|linebreaksbrは、改行を表示させるという意味です。
pythonでは改行は`\n`ですが、html表示は`<br>`になるので、その変換処理を行なっているということになります。
フィルタの一覧は以下参照。
[Django: 組み込みタグとフィルタの一覧](https://qiita.com/nachashin/items/d3f9cd637a9cecbda72c)

# アクセスして確認
localhost:8000
<img width="491" alt="スクリーンショット 2018-10-09 12.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/68146c28-379f-a584-b3d9-6e001ec4a706.png">
laravel 5.6にアップデートすると undefined function imagejpeg() と言われてテストが落ちる問題の解決

### これは何
以下のアップグレードガイドにしたがって laravel 5.5 => 5.6　のアップデートをやっていたら、ガイドに書いていない部分のテストが落ちたので困った話。
https://readouble.com/laravel/5.6/ja/upgrade.html 

### 問題
手元のLaradockでphpunitを流すとテストが落ちないのだが、circleCI環境でテストを回すと落ちる。
エラーメッセージ

```
Call to undefined function Illuminate\Http\Testing\imagejpeg()
```
該当テストコードの例

```
    public function testAdd()
    {
        $this->post('/hoge/create', [
            'image' => UploadedFile::fake()->image('image.jpeg', 1400, 1400)->size(1000),
            'content' => '内容',
        ])->assertRedirect('/hoge');
    }
```

### 解決策
次の２ステップを行う

* libjpeg-dev をパッケージマネージャでインストールする
* gd のconfigure時に上記パッケージのパスを指定してあげるオプションを追加する `--with-jpeg-dir=DIR`

今回私はcircleCIにおけるファイルを編集したので参考として載せておきます。

```
       # Install Library 
       - run: sudo apt-get install -y libpng-dev libjpeg-dev 

       # Install PHP Extension 
       - run: sudo docker-php-ext-configure gd --with-png-dir=/usr/include --with-jpeg-dir=/usr/include
       - run: sudo docker-php-ext-install gd 
```

### 補足：なぜこの問題はlaravel updateのタイミングで起こったのか
**Laravel 5.6**においては
上記テストコードで呼んでいる image() メソッドは以下で、

```
    public function image($name, $width = 10, $height = 10)
    {
        return new File($name, $this->generateImage(
            $width, $height, Str::endsWith(Str::lower($name), ['.jpg', '.jpeg']) ? 'jpeg' : 'png'
        ));
    }
```

さらに呼ばれている generateImage() がもともと以下のようになっている。

```
    protected function generateImage($width, $height, $type)
    {
        return tap(tmpfile(), function ($temp) use ($width, $height, $type) {
            ob_start();

            $image = imagecreatetruecolor($width, $height);

            switch ($type) {
                case 'jpeg':
                    imagejpeg($image);
                    break;
                case 'png':
                    imagepng($image);
                    break;
            }

            fwrite($temp, ob_get_clean());
        });
    }
```

このファイルが**laravel 5.5**では以下のようになっていた

```
    protected function generateImage($width, $height)
    {
        return tap(tmpfile(), function ($temp) use ($width, $height) {
            ob_start();

            imagepng(imagecreatetruecolor($width, $height));

            fwrite($temp, ob_get_clean());
        });
    }
```

つまり、imagejpeg() は呼ばれておらずimagepngだけが呼ばれていた。（我々のコードではおそらくこの仕様を知らず jpeg拡張子を指定していたが結局裏ではpngファイルが生成されていたと思われる。）
laravel 5.6においては分岐が追加されたことにより imagejpeg() が呼び出されることになり、今回のエラーが発生した。
Git初心者ーSourceTree と Bitbucketの基礎的な使い方を学ぶ方法

初めてwebサイト制作のチームに入り、Gitを使うことになったGit初心者です。

バージョン管理はSourceTreeとBitbucketを使うのでインストールしてね、と言われたので準備したは良いものの、どうやって使うかというイメージが全くありませんでした。

使い方を調べて一番わかりやすかったのがこの動画でした。

__[きっとわかる Git！ 〜 SourceTree と Bitbucket ではじめよう！〜]
(https://www.youtube.com/watch?v=BV0tASkzHvQ)__

大串肇さんが解説した46分間の動画。

コミット、プッシュ、プル、マージ、リモートレポジトリなど、Gitの基礎用語や使い方が簡潔に説明されています。

YouTubeの動画なので倍速再生可。

私は２倍速で見ました。
MacでChoregraphe2.5.5の終了・最大化ボタンが表示されない問題を解決

気が付いた時にはChoregrapheの終了・最小化・最大化のボタンが表示されなくなった。
Choregraphe再インストールやここQiitaに書いてある情報など色々試したけど解決せず。
先ほど、閃いたことをやってみたら解決したので、困っている人の助けになれば良いかと思い、投稿することにしました。

## 環境
MacBook Pro
ｍacOS High Sierra 10.13.6
Choregraphe 2.5.5.5
外部ディスプレイ（HDMI接続）

## 閃いてやってみたこと（解決策）
1. 外部ディスプレイを接続。
2. Choregrapheを外部ディスプレイ側に移動。
3. メニューバーからChoregrapheを終了。
4. 外部ディスプレイを外す。

## ちょこっと検証してみた
どのようなときに現象が発生するのか、また同じ手順で解決するのか等を検証してみた。

**現象再現手順**
意外と単純でした。
1. Choregrapheを最大化
2. メニューバーから終了

**解決策の繰り返し検証**
2回だけ行いましたが、問題なく現象の解決が行えました。
（閃いた時の1回＋検証2回＝合計3回）

**ダメだったこと**
内蔵ディスプレイにデスクトップを追加して、同様の解決手順を行ってみたけどダメでした。
Firebaseでアプリのランディングページを無料で作った話

## 前書き
アプリをリリースしたが、ランディングページを持ってなかったので、作ることにした。
超簡単で無料でできた感動したので、まとめてみました。

## 前提条件
Firebaseアカウントを持っていること
ターミナルでFirebaseログインができること
(自分の環境がMacなのでMac中心の記事ですが、Windowsでも同様に進められると思います。)

<br>


## Firebaseのプロジェクト追加
firebaseでプロジェクトを追加する。
プロジェクト名,ロケーションは各々お好みで設定してプロジェクト作成する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/c0e35084-69a3-da00-fcb5-0dcf06a8addc.png" width=80%>

## 雛形を作る
https://appsite.skygear.io/
で自分のアプリを検索し、雛形を作成。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/221e3e15-48c0-bb2e-7c93-0e770eeb2680.png" width=80%>

START FOR FREEのボタンで検索画面に移行して自分のアプリを探す。
作成元が香港の会社っぽいので、香港のAppStoreに対応してないとダメかも。

作られた雛形で自分好みに色とか説明画面をいじる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/347337d2-bf5e-5167-51dd-dbdb3cccb340.png" width=80%>

作成して進んでいくとプレビュー画面の右下にDownload HTMLボタンがあるので、
ボタンを押下すると、zipがダウンロードできる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/6444edf4-e420-4f4d-c63e-888bcdf6f05f.png" width=80%>

ダウンロードできたら、解答し、細かいデザインはhtmlファイルとかcssとかをいじっておく。

## Hosting初期化とデプロイ
先ほど解凍したtemplateフォルダをpublicフォルダにする。
ターミナルを開き、
publicフォルダのあるディレクトリに移動し、
```firebase login```
でfirebaseにログイン。

```firebase init```
で初期化処理を始める。

下記のような選択肢が出るので、カーソルでHosting:~に合わせる。
スペースキーで選択し、enterを押す。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/14c394fc-2cc7-1ec5-85b3-535f62c40e45.png">

プロジェクトを選択する画面になるので、先ほど作成したプロジェクトを選択肢てEnter
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/07dc9326-638d-1b1d-c0d0-a5bd82a04aa0.png">
いくつか質問があるが、enterで進んでOK
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/5dd10f23-0016-2e1b-97d8-3cd57b340bc4.png">
下記メッセージが出たら、初期化処理終了。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/8fc8e377-9d88-8a92-b056-74fc2d7c3b65.png">
firebase deployでデプロイ完了。Hosting URLの部分がひとまず公開されたページのURLとなる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/bd641217-3d68-9d11-ba5a-eb6f0f544adb.png">
https://bluebooklandingpage.firebaseapp.com
<img src="https://qiita-image-store.s3.amazonaws.com/0/13599/8ed60a51-0bd5-ace7-8756-c91f5115994a.png" width=80%>

## ドメイン接続(キャプチャ撮り忘れたので、記憶ベース)
デフォルトでは
```(プロジェクト名)firebaseapp.com```
がドメインになってます。
独自ドメインを設定したい場合は、下記の手順を踏みます。


・ドメインを取得(ドメイン取得業者)
今回はお名前.comで取得しました。

・ドメインを接続(Firebaseコンソール)
firebaseコンソールのHostingのダッシュボードのドメインを接続のボタンをタップ
取得したドメインを追加
TXTレコードをコピー

・ドメイン取得元でDNS設定(ドメイン取得業者)
コピーしたTXTレコードをDNS設定する

・反映後接続実行(Firebaseコンソール)
ドメイン取得元でTXTレコードを検証して、ドメインを接続します。

・接続後設定
接続後もTXTレコードかAレコードを接続先に反映する作業を数回行って、完了です。


## あとがき
雛形作成サービス appsitesはHTML作成は無料です。(このサービス内のホスティングを使って独自ドメインで公開とかなら有料らしい。)
Firebaseは1プロジェクトにつき10GBまでなら無料のようです。
FluentValidation で複数条件に依存した DependentRules を登録する

# FluentValidation について
C# で検証ロジックを扱うのに FluentValidation を利用させて頂いている。
EntityFramework の Fluent API のようにメソッドチェーン形式で検証ロジックを登録できるものである。
# 他の検証結果に依存した検証ロジック
他の項目の検証をパスした場合のみ実行したい検証ロジックというのは往々にしてあるものであるが、FluentValidation でも以下のようにサポートされている。

```csharp
// 姓が入力されている場合に、名が入力されているか検証する。
RuleFor(x => x.Surname).NotNull().DependentRules(() => {
  RuleFor(x => x.Forename).NotNull();
});
```
ただ、姓と名が入力されている場合に、ニックネームが入力されているか検証するといったように、複数の検証に依存したロジックは作者的にはあまり推奨していないようでサポートされていない。
しかしそれでは困るので拡張メソッドを用意することにした。
# 拡張メソッドの定義
デリゲートを受け取ったら検証クラスでラップし登録するような拡張メソッドを定義する。

```csharp:AnonymouseValidator
public class AnonymouseValidator<T> : AbstractValidator<T>
{
    public AnonymouseValidator(Action<AnonymouseValidator<T>> validator) => validator(this);
}
```

```csharp:RuleBuilderExtensions
public static class RuleBuilderExtensions
{
    public static IRuleBuilderOptions<T, TProperty> SetAnonymouseValidator<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder, Action<AbstractValidator<TProperty>> validator)
        => ruleBuilder.SetValidator(new AnonymouseValidator<TProperty>(validator));
}
```
# 使い方
`SetAnonymouseValidator` で登録した検証をパスした場合に、`DependentRules` が実行される。

```csharp
RuleFor(_ => _)
    .SetAnonymouseValidator(validator =>
    {
        validator.RuleFor(x => x.Surname).NotNull();
        validator.RuleFor(x => x.Forename).NotNull();
    })
    .DependentRules(() =>
    {
        RuleFor(x => x.Nickname).NotNull();
    });
```
Vagrant の Synced Folder に NFS をつかったディレクトリでは chown できない

# 背景

ホストとゲストで共有したいディレクトリがあって、NFSが気持ち速いらしい。こうしてみたらトラブった。

```
config.vm.synced_folder "../", "/share", type: "nfs"
```

vagrantからAnsible provisionerでセットアップしてて、mkdir, chown, chmodしてる箇所があって、

```
- name: create document root
  file: path=/share state=directory owner=vagrant group=vagrant mode=0775
```

このようにコケていました。

```
TASK [apache : create document root] *******************************************
fatal: [default]: FAILED! => {"changed": false, "gid": 20, "group": "games", "mode": "0755", "msg": "chown failed: [Errno 1] Operation not permitted: '/share'", "owner": "501", "path": "/share", "secontext": "system_u:object_r:nfs_t:s0", "size": 416, "state": "directory", "uid": 501}
```

最初はVagrantfileをいじくり回していましたが、ゲストOS内に入ってみたりするうちに、違うとわかりました。

# 結論

ゲストOS内から、NFS共有したディレクトリに対して、chown操作ができない。chmodはできる。

```
[vagrant@hoge /]$ ll
total 102
(略)
drwxr-xr-x   28     501 games     896 Oct  9 13:20 share
(略)
[vagrant@hoge /]$ sudo chown vagrant:vagrant /share
chown: changing ownership of `/share': Operation not permitted
[vagrant@hoge /]$ sudo chmod 777 /share
[vagrant@hoge /]$ ll /
total 102
(略)
drwxrwxrwx   28     501 games     896 Oct  9 13:20 share
(略)
[vagrant@hoge /]$
```

NFS共有において、ゲストOS内からchownする必要があるかというと、必要ない。なぜならVirtualBoxのSynced Folder側が、ゲストOS内の誰で触ろうとも、map_uid, map_gid に変換してホストOSに読み書き操作するから。

# 他にハマったところ

## マニュアル読む

ググっても古い断片的な情報しかない。公式マニュアルが正義のはずだっ。

https://www.vagrantup.com/docs/synced-folders/nfs.html

## vagrant sshして挙動を観察する

ホストOSとVagrantfileからのアプローチが手詰まってきた頃合いで、ゲストOSからも見る。

## map_uid, map_gid

https://www.vagrantup.com/docs/synced-folders/nfs.html#map_uid
> This defaults to the current user running Vagrant.

とあるので、

```
config.nfs.map_uid = 502
config.nfs.map_gid = 20
```

は書かなくてよい。むしろ、ホスト側のuidは501だったり503かもしれず、gidもmacのバージョンによって違うかもしれず、git cloneしてから手作業でVagrantfileをイジるようなことになりかねないので、削るべき。

## ホストOSの /etc/exports

まずはVagrantfileには何も書かず、自動生成に任せるのが正解に思いました。自動生成でトラブった場合に、うまく動くよう明記するのが疲れないのでは。
Learning Spatio-Temporal Representation with Pseudo-3D Residual Networksを読んだ

Qiu, Zhaofan and Yao, Ting and Mei, Tao, "Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks", in ICCV2017, pp.5533-5541, 2017. [Online PDF at CVF](http://openaccess.thecvf.com/content_ICCV_2017/papers/Qiu_Learning_Spatio-Temporal_Representation_ICCV_2017_paper.pdf)


# １．どんなもの？
・3×3×3の畳み込みの代わりに3x1x1と1x3x3の畳み込みを組み合わせることで擬似的な３次元畳み込みを行う
・Pseudo-3D Residual Net（P3D ResNet）というアーキテクチャを提案

#2.先行研究と比べてどこがすごいか？
・2D空間畳み込みと1D時間接続を組み合わせたResNetの2D Residual Unitsを置き換えた残差ブロック(P3Dブロック)を提案
・2D畳み込みと1D畳み込みに分けることで画像認識における事前学習済みの重みを利用することが可能

# 3.技術や手法の肝はどこにあるか？

## Residual Unit
層の入力を参照した残差関数を学習することでネットワークモデルを深くする(誤差を再利用することで勾配消失問題を回避する)
-[参照](https://deepage.net/deep_learning/2016/11/30/resnet.html)
![スクリーンショット 2018-10-05 3.39.19.png](https://qiita-image-store.s3.amazonaws.com/0/249838/e97c2299-c938-f4fa-ee5a-57c2147708f6.png)
## P3D Blocks design
3つのP3Dブロックを提案
ResNetのボトルネック構造をそのままに適用させている
![スクリーンショット 2018-10-05 3.37.51.png](https://qiita-image-store.s3.amazonaws.com/0/249838/051df704-8576-5fd9-d9e2-e12ff500a348.png)
3つのP3Dブロックのメリットを検証
3つのP3Dブロックをすべて構造的多様性の観点から混合することで、P3D ResNetの完全版が提案
![スクリーンショット 2018-10-05 15.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/249838/550e870e-d9c3-8f29-131b-158f1792f39f.png)

### P3D-A
1Dフィルタ(T)と2Dフィルタ(S)を縦に繋ぐ．２つのフィルタは同じ経路で互いの影響を受ける
![スクリーンショット 2018-10-05 4.18.46.png](https://qiita-image-store.s3.amazonaws.com/0/249838/3e4bf50a-48e8-5246-693d-0bd03364b9eb.png)
### P3D-B
両方のフィルタが異なる経路で並行している点
SとTとの間には直接の影響はないが、両方とも最終出力に直接蓄積
![スクリーンショット 2018-10-05 4.36.05.png](https://qiita-image-store.s3.amazonaws.com/0/249838/a8bc22e9-04ca-b77b-dd22-51597a87b901.png)

### P3D-C
S、Tと最終出力の間の直接的な影響を同時に構築
![スクリーンショット 2018-10-05 4.38.00.png](https://qiita-image-store.s3.amazonaws.com/0/249838/4d4187fc-7b44-4c8f-e436-c00933da5870.png)

## 完全版
アーキテクチャ内の異なるP3Dブロックを混合して構造の多様性を高めることにより、P3D
ResNetの完全版を考案
![スクリーンショット 2018-10-08 22.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/249838/58b08151-6b45-1ad2-f9ad-c34234cff891.png)


# 4.どうやって有効だと検証した？

![スクリーンショット 2018-10-08 22.10.05.png](https://qiita-image-store.s3.amazonaws.com/0/249838/7bf91f4c-2c06-fa73-5c28-74bae0a0803e.png)

![スクリーンショット 2018-10-08 22.26.22.png](https://qiita-image-store.s3.amazonaws.com/0/249838/4a3bab6d-685a-710f-60dc-3eac538e319e.png)
## 主成分分析
どの次元でもP3DNetがうまくいっている
![スクリーンショット 2018-10-08 22.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/249838/1429ee88-f90d-841f-e282-5fa93ef3db39.png)