OmniAICreator/Qiita-1.07M huggingface dataset:
DXライブラリにあった自動で改行して描画してくれる関数

```C++:DxLib.h
extern int DrawObtainsString(int x, int y, int AddY, const TCHAR *String, unsigned int StrColor, unsigned int StrEdgeColor = 0, int FontHandle = -1, unsigned int SelectBackColor = 0xffffffff, unsigned int SelectStrColor = 0, unsigned int SelectStrEdgeColor = 0xffffffff, int SelectStart = -1, int SelectEnd = -1); // 描画可能領域に収まるように改行しながら文字列を描画
```

SetDrawArea関数で決めた領域に合わせて文字列を描画してくれる関数です。

#サンプル

```C++
#include "DxLib.h"
#include <string>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	SetOutApplicationLogValidFlag(FALSE);
	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);

	if (DxLib_Init() < 0)
		return -1;

	int Cr = GetColor(255, 255, 255);
	std::string str = "いろはにほへと　ちりぬるを　わかれよたそ　つねならむ　ういのおくやま　けふこえて\nあさきゆめみし　よいもせす";

	while (ProcessMessage() == 0)
	{
		ClearDrawScreen();

		DrawObtainsString(0, 0, GetFontSize(), str.c_str(), Cr);

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/250531/92a3802d-1a98-1fbc-a07a-287bf04daaf3.png)
若干見切れていますけど、そこは勘弁……。
改行コード(\n)を途中で入れると、そこで改行してくれます。

サウンドノベルとかに使えそうですけど……実際どうでしょう？

----

余談ですが、文字列だけではなく図形verもあります。

```C++
extern int DrawObtainsBox(int x1, int y1, int x2, int y2, int AddY, unsigned int Color, int FillFlag ); // 描画可能領域に収まるように補正を加えながら矩形を描画
```
WinFormsで、Genericクラスを継承したFormのデザイナ表示がエラーとなる問題の解決策

## 結論

少々無理やりですが、**Genericのフォームと派生クラスのフォーム間に非Genericクラスのフォームを挟む**ことで解消されました。
簡単ですが備忘のために書き残します。
以下の記事を参考にさせていただきました。というかほとんどそのままです。
　[ジェネリックパラメータを持つFormを継承したFormをデザイナで表示できない。](https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/5a3259ce-b204-4a41-8e70-263fd6b0917e/formform?forum=csharpgeneralja)

### 追記 2020-02-22
コメントいただきましたので訂正します。
本記事のやり方は **Visual Studio 2017** にて確認したものです。
Visual Studio 2019 ではこれでもエラーになるとのことでした。


## 具体的に

### エラーとなるパターン（GenericFormを直接継承）

```cs:GenericForm.cs
namespace Sample

public class GenericForm<T> : Form
{

}
```

```cs:InheritForm.cs
namespace Sample

public class InheritForm : GenericForm<string>
{

}
```

InheritFormのデザイナを開こうとすると例外が発生する。

### エラーを解消したパターン

```cs:GenericForm.cs
namespace Sample

public class GenericForm<T> : Form
{

}
```

```cs:NotGenericForm.cs
namespace Sample

public class NotGenericForm : GenericForm<string> { }
```

```cs:InheritForm.cs
namespace Sample

public class InheritForm : NotGenericForm
{

}
```

InheritFormのデザイナを通常通り開くことができる。
NotGenericFormのデザイナ画面は開けませんが（Genericを直接継承しているため）、中間クラスだと割り切って実装を空にしておけばそんなもんなのかなーと思ってます。
【はじめてのRDS】インスタンスの新規作成

#目的
RDSインスタンスの新規作成手順です。
最終的にはWebサーバに配置したTomcatアプリケーションのデータをRDSにcreateしたDBと連携させます。

#環境
CentOS7.5
Apache2.4
Tomcat8.5
MySQL5.7
macOS 10系

#とりあえずやってみる
##RDSインスタンスの起動
まずRDSがなんなのかすら知らないが（無知すぎて色々とすみません）、サービスを体験するに限る。
AWSのコンソールからRDSを選択、トップページにサービス概要が書いてあるので一読しデータベースインスタンスの起動を選択。
エンジンの選択とのことでMySQLを。MariaDBのロゴはじめて見た。かわいいw

業務用アプリを連携する必要があるため、ユースケースは本番稼働用を選択。
変更点は以下のとおりでそれ以外はデフォルトです。

```
・変更
MySQL 5.7.23
db.t2.medium-2vcpu, 2 GiB RAM
ストレージタイプ：汎用

・設定
DBインスタンス識別子：tomcat5（このフィールドがインスタンス起動後の名前になります）
マスターユーザの名前：okome
マスターパスワード：8文字以上の適当なパスワードを入力する
```

ここまではとても簡単。GUIがわかりやすいのでスルスル進みます。

##[詳細設定]の設定/ネットワーク ＆ セキュリティ

```
・Virtual Private Cloud (VPC)：EC2インスタンスと同じVPCを選択
・サブネットグループ：default
・パブリックアクセシビリティ：いいえ
```

パプリックアクセシビリティって一瞬なんのこっちゃですが、
　DBから見てインターネットに出て行く（out）
　インターネットからDBに直接アクセスする（in）
としたときに後者を実現したいならはいを選んでね、ということでしょうか。
実際はいを選んだ場合はサブネットが2つ以上必要でした（詳細は未検証）。

```
・アベイラビリティゾーン：指定なし　※どうやったらアクティブになるのか不明
・VPCセキュリティグループ：既存のVPCセキュリティグループを選択→EC2と同じセキュリティグループを選択。
```

VPCセキュリティグループのdefautはよくわからないので一旦バツで削除。
あとはデータベースの名前を入力し作成を押すと完了です。

#インスタンスの削除
EC2と違って削除するときにいくつか質問があります。
こういった仕様はHerokuとかと同じだなーというか、セキュアなデータを保持してるサービスはこんな感じで聞かれるのでしょうか？
経験不足のためよくわかってませんが、このような知識も少しずつ増えればいいなと思っています。

#DBインスタンスへのssh
[良い感じのサイト](https://qiita.com/nao-otsu/items/8cabd447d73b621cd07d)でありがたくお勉強。クライアントからEC2インスタンスにssh、それを踏み台にして同じセキュリティグループのRDSインスタンスにmysqlするといった手順になります。
インスタンス作成時に同じセキュリティグループを設定するのは意図的に行ったのですが、ソースを作業環境のグローバルにしたうえで3306ポートを空けていたのでログインできず少し混乱しましたが無事完了。

#次は何をするのか
とりあえず一旦はここまで。
問題はここからでどうアプリと連携するのか検討もつきませんがw、現状を確認してみます。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| tomcat5db          |
+--------------------+
6 rows in set (0.00 sec)
```

デフォルトのDB＋インスタンス作成時に作ったtomcat5dbが存在します。このDBにアプリが使うテーブルを用意してエンドポイントをアプリ（のソースコード）に明記してあげれば書き込まれるのかな？進捗がありましたら本記事に追記したいと思います。

#所感
VPCやNW周りの知識がかなり欠落していたので、ググってお勉強しなおしました。
サブネットの計算とかいって忘れる→思い出す→すぐ忘れる→思い出す、のループを10数年繰り返している気がします。。ありがたいことに[便利な計算サイト](https://note.cman.jp/network/subnetmask.cgi)がありますのでこういったプロダクトは積極的に使用してアウトプットの速度を上げる、ただし内部のロジックはちゃんと理解してるしおさらいすればすぐに思い出す…という状態を高いレベルで常にキープしたいなと最近よく考えています。

最後まで読んでいただきありがとうございました。
以上です。
VSCodeでC#のフォーマッターの動作をカスタマイズする

こんな感じの`omnisharp.json`ファイルをプロジェクトのルートに作成すると、C#フォーマッターの設定をカスタマイズできる。

たとえば`if`の後のカッコの前で改行するデフォルトの動作をこのようにしたいなら…

```csharp
if (someCondition)
{
  // 
}
else
{
  // 
}
```

↓

```csharp
if (someCondition) {
  // 
} else {
  // 
}
```


こういう設定をする。

```json:omnisharp.json
{
    "FormattingOptions": {
        "NewLinesForBracesInControlBlocks": false,
        "NewLineForElse": false
    }
}
```

omnisharp.jsonのファイル内ではCtrl+Spaceでプロパティ名の候補が補完されるので便利！
Jenkinsユーザーにsuできない場合の対処法

Jenkins実行ユーザーにsuできなかったのでメモ。

/etc/passwdを確認。

```
jenkins:x:106:65534::/var/lib/jenkins:/bin/false
```

/bin/falseになっていたので、suできなかった。

以下に変更。

```
jenkins:x:106:65534::/var/lib/jenkins:/bin/bin
```

**※用が済んだら、必ず戻しておくこと！**
macOSにcomposerをインストールする

ダウンロードします。

```sh
$ curl -sS https://getcomposer.org/installer | php
```

実行したディレクトリ直下に`composer.phar`という実行ファイルが生成されます。
もちろんこの状態で実行もできます。

```sh
$ php composer.phar --version

Composer version 1.7.3 2018-11-01 10:05:06
```

`composer`で実行できるようにする為に、実行ファイルを`/usr/local/bin`直下に移動します。

```sh
$ mv composer.phar /usr/local/bin/composer
```

挙動を確認します。

```sh
$ which composer

/usr/local/bin/composer
```

```sh
$ composer --version

Composer version 1.7.3 2018-11-01 10:05:06
```

終わり。

環境：
macOS High Sierra
Version 10.13.6

参考：
https://getcomposer.org/doc/00-intro.md
enchant.jsの基本

#enchant.jsを書いてみる

　そもそも使われているゲームが少ない、更新も止まっているが、個人的に好きなので書く。
　開発環境はMonaca、必要なファイルはHTML、CSS、enchant.js、main.jsがあれば
　必要最低限はできる。
　imgファイルやmp3ファイルは必要に応じて追加していってほしい。

##enchant.jsをやるにあたって踏まえといて欲しい知識
　ブラウザでもアプリでもそうなのだが、if文とswitch文の処理速度の違いを覚えていてほしい。

　https://qiita.com/ko8@github/items/f9aaf17c9c519386a961

　優秀な記事が書いてあるので1度でいいから目を通しておいてほしい。

###画像のUpload


　enchant.jsは基本的に画像を動かしてゲームを構築していく。
　
　game.preload('画像のパス')
  
　で画像をアップロードしてから
　
　画像オブジェクトの作成

　変数名 = new Sprite(画像のXサイズ,画像のYサイズ);
　//ここは表示したい領域を指定できるので3*3の画像でも1*1のサイズを入力すればトリミングが勝手にされる

　変数名 = game.assets['画像のパス']
  
　で変数に画像を入れる。

　game.rootScene.addChild(変数名);

　で画像表示
　
　変数名.tl.moveTo(移動先のX座標,移動先のY座標,速度)

　で画像を動かす
　ちなみにmoveToは絶対パスなので左上からの値を書かなければならない。
　
　これさえ出来ればただ単に画像が動くアプリが作れる。

　面白そう

###画面サイズの対応
　
　これが一番難しく、めんどくさい。
　AndroidStudioやXcodeなら自動になっているが、enchant.jsでやるためには
　window.innerWidthとwindow.innerHeightを使うのがいいと思う。
　それ以外のやり方は知らない。

　例えば

　変数名.tl.moveTo(window.innerWidth,window.innerHeight,速度)

　や

　変数名.tl.moveTo(window.innerWidth-window.innerWidth/2,
　window.innerHeight-window.innerHeight/2,速度)
　
　などという書き方で画面サイズに対応できる。
　
　そもそもだが、window.innerWidthなどを複数回書くのはお勧めしないので、変数に入れることをお勧めする

　例
　var 変数名 = window.innerWidth;
　var 変数名 = window.innerHeight;

　↑お願いします。
　
　上記は画像の動く領域だが、画像サイズ、文字の大きさ、文字を置いて置く位置にも必須なので、
　かなり大変である。
　需要があったらそれについても書くのでコメントしてください。
　
　アプリなら画面サイズ１つ１つに対しコードを分けるという方法もあるのだが、
　冗長コードが大量に作成される未来が見えるのでお勧めしない。
　
　次回の記事は当たり判定について書こうと思う。
　不明点、不備ございましたら、コメントお願いします。
GolangでAPIサーバ作ったよの話

<!--
# レコメンドエンジンについての紹介
どこかのお店の情報を見た時に、そのお店に近い[^1]お店を候補として出す機能です。
それをAPIとして提供しており、たくさんのリクエストを捌けるようにしています。

[^1]: 近いというのは例えば焼肉屋を見てる時に同じような焼肉屋のお店が出たりの事です

# レコメンドデータ作成
※データの作成は前もって行っており、この方法に関しては今回は触れません。

- 格納先はMemcache
- １日に１回更新するもの、１時間に１回更新するものがある
-->

# はじめに

Memcacheサーバにデータを格納し、リクエストに応じて適宜情報を取得し整形して返却するAPIサーバを作りました。

- ロードバランサ
- APIサーバ
- Memcacheサーバ

この構成で動くものです。

# サーバの構成
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/81539/4a02b141-70f9-3e85-2589-ce7f59234775.png)

# 事前情報
APIサーバからMemcacheサーバへのアクセスは最低1ms（ミリ秒）かかりました。
受け取るデータ量が多ければもっと多くの時間がかかってしまいます。

# １回目リリース時の処理

APIサーバからMemcacheサーバにデータを取りに行き、情報を整形して返却しています。
APIサーバからMemcacheサーバへのアクセスは多い時で100回を超えてしまっており、全部で100msかかる計算になってました。
その他の処理にも時間がかかるので平均すると<font color="Red">80ms</font>くらいかかってました。

# ２回目リリース時の処理

APIサーバからMemcacheサーバにデータを取りに行く回数を減らすべく、APIサーバのメモリを活用することにしました。Memcacheサーバからデータを取得したらAPIサーバのメモリに載せるようにしたのです。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/81539/ae707ca1-6fce-26e6-eee2-682d09919435.png)

同じデータへのアクセスであればAPIサーバのメモリから情報を取得するので、ネットワークに出ずに処理できるようになり処理速度が格段に向上しました。
その他の処理も最適化をかけ、例えば<font color="Magenta">mapを使っていた部分を配列にして</font>少しでも処理速度を上げたりと専化させ、処理にかかる時間の平均も<font color="Red">5ms</font>くらいまで下がりました。

## 変わったところ
- Memcacheサーバから取得した情報はAPIサーバのメモリ内に保存しておく
    - ローカルのメモリサイズとmemcacheのデータサイズを見て、大きすぎるやつは除外しました。幸いにも1回しかアクセスしないデータだったのでさほど気にならない程度で済みました。
    - APIサーバのメモリ内に保存したデータを更新しなければならないのですが、Memcacheのデータ自体の更新が発生したタイミングで該当のデータを削除できるようにし、その通知方法としては<font color="Magenta">Socket通信</font>[^2]を使いました。
[^2]: Socket通信については今回は詳しく書きません。

- mapを使わずに配列で処理することで時間短縮
    - mapは便利ですが、やはり処理時間がかかってしまうので、どうしてもというところ以外では配列にしました。（つまり全部配列というわけでもありません）

# まとめ
- 今回詳しく触れなかったSocket通信も容易に書けて
- さらに処理速度も申し分なく
- 書いていて楽しい
 
と、良いところがたくさんある<font color="Red">Golangは最高</font>なのでみなさんも是非書いてみて下さい。
Reactのeventハンドリングの際に、DOMのカスタム属性にアクセスする

ReactというかJavaScriptのDOM操作の話なのですが、恥ずかしながら小一時間stackしたので、書いておこうと思いました。

## Reactのイベントハンドリング
例えばボタンをクリックしたらそのカスタム属性のデータをlogで出す場合を考えてみます。
以下のようにすることで、実装できます。

```jsx
const ButtonComponent = (props) => {
  const clickButton = (e) => {
    console.log(e.currentTarget.dataset.location);
  }

  return (
      <button id="i-am-id" name="my-name-is-button" data-location="location" onClick={clickButton}>
        <span>Hello</span>
        <span>This is Button.</span>
      </button>
  )
}
```

### まず、event.target と event.currentTarget の違いを意識する
[こちらのページ](http://cly7796.net/wp/javascript/e-target-and-e-current-target/)で紹介されているデモページを見ればわかるのですが、`event.target`の場合ですと「イベントを発生させた要素自体」、`event.currnetTarget`の場合は「イベントがアタッチされている要素」（上述の例の場合は`<button>`）が取得できるようです。

### DOM要素の普通のプロパティにアクセスする
普通のプロパティとは、idやclass、nameなどのあらかじめ定められている属性のことです。
その場合、

```jsx
const ButtonComponent = (props) => {

const clickButton = (e) => {
  console.log(e.currentTarget.id);
  // i-am-id
  console.log(e.currentTarget.name);
  // my-name-is-button
  console.log(e.currentTarget.location);
  // undefined
}

  return (
      <button id="i-am-id" name="my-name-is-button" location="location" onClick={clickButton}>
        <span>Hello</span>
        <span>This is Button.</span>
      </button>
  )
}
```

以上のように、`e.currentTarget`から直接アクセスできます。しかし、`location`のように自分で勝手に作ったカスタムプロパティ(カスタム属性)にはアクセスできません。

### DOM要素のカスタムプロパティにアクセスする
カスタムプロパティにアクセスするには、[HTMLElement.dataset](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/dataset)を使います。

該当プロパティの前に`data-`を付けることで、`e.currentTarget.dataset.`でアクセスできるようになります。
コードは、一番最初に述べたものと同じです。

```jsx
const ButtonComponent = (props) => {
  const clickButton = (e) => {
    console.log(e.currentTarget.dataset.location);
  }

  return (
      <button id="i-am-id" name="my-name-is-button" data-location="location" onClick={clickButton}>
        <span>Hello</span>
        <span>This is Button.</span>
      </button>
  )
}
```


[参考 : stackOverflow - How to access custom attributes from event object in React?
](https://stackoverflow.com/questions/20377837/how-to-access-custom-attributes-from-event-object-in-react#answer-20383295)
古いゲームの動作がカクカクになる問題

きっと同じ現象でゲンナリしてる人がいると思ったので備忘録を兼ねての投稿。

先日、信長の野望創造PKをプレイしていたら、ある瞬間から突然動作がカクカクになる問題が発生しました。
各地で激しく戦が起こってたので、それが収まったら戻るのかな？って思っていたのですが全然直らず・・・。
PCのスペック的には全然余裕なのでさすがにおかしいと思って調べてみたところ、同じ現象に遭遇している人がチラホラいる事が分かりました。

更にググってみたところ、どうもDirectXのランタイムが新しいとカクカク現象が発生するという事を突き止めました。
どうも他のゲームでも古いゲームでは同じ現象が発生する事があるようです。

解決方法は簡単、単に昔のDirectXのランタイム（d3d9.dll）を実行ファイルの隣に置くだけでOK。勝手に読み込まれるようになるっぽいです。
ただ、古いd3d9.dllを入手する必要があるのですが、それが手元にありません。
仕方なくネット上を探してみたところ、古いdllを配布している怪しいサイトは色々あるみたいでした。

アレコレ試してみて、その中でうまく行ったd3d9.dllを配布していたサイトはこちら。
http://www.illusion.jp/support/windows10.html

ただ、得体の知れないものを入れる事になりますので、あくまでも自己責任で。
次の手順できっとヌルヌルになれます。

1. 古いDirectXのランタイムを入手する（上記URLのものがよさげ）
2. プログラムの実行ファイルの位置を特定する（場所が分からない場合は根性を出せば大丈夫です）
3. 実行ファイルの隣にさっき入手したd3d9.dllを置く
4. PCを再起動する
5. ヌルヌルを感じる

うまく行かなくても悪しからず、ご健闘をお祈りいたします。
chainerで九九

#概要

chainerで九九、やってみた。


#結果

```
214         0.0205839
215         0.0216847
216         0.0217508
217         0.0217022


493         0.00358729
494         0.00372512
495         0.00368116
496         0.00367013
497         0.0035804
498         0.00389284
499         0.00329972
500         0.00354485
      1   2   3   4   5   6   7   8   9
  1   1   2   3   4   5   6   7   8   9
  2   2   4   6   8  10  12  14  16  18
  3   3   6   9  12  15  18  21  24  27
  4   4   8  12  16  20  24  28  32  36
  5   5  10  15  20  25  30  35  40  45
  6   6  12  18  24  30  36  42  48  54
  7   7  14  21  28  35  42  49  56  63
  8   8  16  24  32  40  48  56  64  72
  9   9  18  27  36  45  54  63  72  81

```


#サンプルコード

```
import numpy as np
from chainer import Variable, report, datasets, iterators
from chainer import optimizers
from chainer import Chain
from chainer import training
from chainer.training import extensions
import chainer.functions as F
import chainer.links as L
import chainer

def in_encode(i, j):
	k = j * 16 + i
	return np.array([k >> d & 1 for d in range(8)])

def out_encode(i, j):
	k = j * i
	return np.array([k >> d & 1 for d in range(7)])

def decode(p):
	f = 0
	if p[0] > 0.5:
		f += 1
	if p[1] > 0.5:
		f += 2
	if p[2] > 0.5:
		f += 4
	if p[3] > 0.5:
		f += 8
	if p[4] > 0.5:
		f += 16
	if p[5] > 0.5:
		f += 32
	if p[6] > 0.5:
		f += 64
	return f

class MLP(Chain):
	def __init__(self, n_in, n_units, n_out):
		super(MLP, self).__init__(l1 = L.Linear(n_in, n_units), l2 = L.Linear(n_units, n_out))
	def __call__(self, x):
		return self.l2(F.relu(self.l1(x)))

def make_data():
	X = np.array([in_encode(i, j) for i in range(1, 10) for j in range(1, 10)], dtype = np.float32)
	T = np.array([out_encode(i, j) for i in range(1, 10) for j in range(1, 10)], dtype = np.float32)
	return datasets.TupleDataset(X, T)

def main():
	train = make_data()
	epoch = 500
	batchsize = 10
	model = L.Classifier(MLP(8, 96, 7), lossfun = F.mean_squared_error)
	model.compute_accuracy = False
	optimizer = optimizers.Adam()
	optimizer.setup(model)
	train_iter = iterators.SerialIterator(train, batchsize)
	updater = training.StandardUpdater(train_iter, optimizer)
	trainer = training.Trainer(updater, (epoch, 'epoch'), out = 'result')
	trainer.extend(extensions.LogReport())
	trainer.extend(extensions.PrintReport(['epoch', 'main/loss']))
	trainer.run()
	x = np.array([in_encode(i, j) for i in range(1, 10) for j in range(1, 10)], dtype = np.float32)
	y = model.predictor(x).data
	p = '    '
	j = 1
	for i in range(1, 10):
		p += '%3d ' % (i * j)
	p += '\n'
	for j in range(1, 10):
		p += '%3d ' % (j)
		for i in range(1, 10):
			g = y[(i - 1) * 9 + (j - 1)]
			k = decode(g)
			p += '%3d ' % (k)
		p += '\n'
	print (p)

if __name__ == '__main__':
	main()


```

以上。
Nextcloud のコメント機能

#ファイル共有時のコメント
ファイルを共有していると、例えば共有相手がどの部分を更新したとか、分からない事もあります。Wordとかで、履歴を付けたりする人もおりますが、もっと簡易的に相手に伝えたいときは、Nextcloudのコメント機能が有効です。

#プラグイン
Commentsというプラグインで、標準でついています。
![画像93.png](https://qiita-image-store.s3.amazonaws.com/0/308127/49bf646b-ab37-bc37-06d9-9357f67257d9.png)

#使い方
ファイルやフォルダに表示されている共有アイコンをクリックすると、画面右側に設定画面が表示されるので、コメントタブを選択。ファイル単位、フォルダ単位のどちらでもコメントができます。
![画像94.png](https://qiita-image-store.s3.amazonaws.com/0/308127/3f7b14d6-0a79-1ab8-aaf9-e8851f728f74.png)
コメントが追加されると、共有相手にも通知されます。コメントが追加されたファイルには、コメントマークがつきます。
![画像95.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c3deaea5-0dab-20f5-61d3-59d3bc0c57e8.png)
後から、コメントを編集したり、削除することも可能です。
![画像96.png](https://qiita-image-store.s3.amazonaws.com/0/308127/31030fb2-ae02-8ee2-f05e-030e7a7f8602.png)
[アクティビティ機能](https://qiita.com/mmisu/items/5c025a17114c2f127253)にも、コメントの項目があります。
![画像97.png](https://qiita-image-store.s3.amazonaws.com/0/308127/76678db2-9db7-13fb-266a-41f368c7e67d.png)

#まとめ
アクティビティメールでも通知できますので、結構便利に使えそうです。一日に何回も更新するようなファイルだと使い道がありそうですね。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
条件を満たすまで $.ajax を繰り返し続けるサンプル

## あらすじ
Qiitaのリニューアル前に記事ページの右カラムに表示されていた **人気の投稿** をローカル環境で復活させようと思い、APIにリクエストをして投稿データを取得し、いいねの多い上位5件のタイトルとURLを取り出して、右カラムにHTMLで追加する、という処理を UserScript で書いたのですが、[**APIのリクエスト回数制限に引っかかって**](https://qiita.com/api/v2/docs#%E5%88%A9%E7%94%A8%E5%88%B6%E9%99%90) 泣く泣くお蔵入りしました。(実装する前に気づけよ)

### ＊ 本当はこんなの作ろうとしてました
![貼り付けた画像_2018_11_13_17_31_3.png](https://qiita-image-store.s3.amazonaws.com/0/70638/b8614372-e5e7-3e5a-916a-bfa9f683a59f.png)



リニューアル以前の Qiita でこんなのあったかとおもいます。一応期待どおり動きはしたんですが、リクエスト回数がすぐ上限に達してしまうので使い物にならないのが現状です。悔しい。

## じゃあ今日は何の話か

前項に書いた **全件取得するまで `$.ajax` を呼び続ける** というパターンはわりと今後も出番ありそうかとおもいましたため、今日は作ったコードをサンプルとして公開してみたいと思います。

## 検証ブラウザ
- Google Chrome(70.0.3538.77)

IEだとたぶん動かないです。

## サンプルコード

というわけでこれが全件取得するまで `$.ajax` を呼び続けるコード例です。(jQuery は事前に読み込まれているものとします。)
私の場合は [**Qiita の API の仕様が最大でも100件づつしか取得できない**](https://qiita.com/api/v2/docs#%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) というものであったため、記事が100件以上あるユーザーの場合は何度も $.ajax を呼ぶ必要があったことからこのようなコードが必要になりました。

**※更新：わかりやすくするため処理の骨子を残して余計なものはごっそりカットしました。当初作ったコードを見てみたい方はお手数ですがこの記事の編集履歴から過去のコードをご覧ください。**

```js
(function($){
  //1回のAPIリクエストで取得する件数
  const perPage = 100;

  //fetchPosts が実行されるたびここに記事が貯まります
  let posts = [];

  //APIからデータを取得します
  const fetchPosts = (userId, page) => {
    return $.ajax({
      type: "get",
      url: "//example.com/path/to/api",
      data: {
        user_id: userId
        page: page,
        per_page: perPage
      }
    }).then(items => {
      //取得結果を貯める
      posts = posts.concat(items);

      //次ページがありそうなときは再帰呼び出し
      if(items.length == perPage) {
        fetchPosts(userId, page++);
      }

      return posts;
    });
  };

  //Main
  $(function(){
    const page = 1;

    //fetchPosts は Promise を返すので then で続けて処理が書けます
    fetchPosts(userId, page).then((posts) => {

      //APIで取得したデータを使っていろいろやる

    });
  });
})(jQuery);
```

## この処理の要点
下記の部分です。**再帰呼び出し** をすることでわりとあっさり実現できました。また、この if 文の条件で繰り返し処理の継続如何をコントロールできます。fetchPosts は Promise ごと返して、ソートなどの後処理は大元の呼び出し側に任せています。

```js
if(items.length == perPage) {
  fetchPosts(userId, page++);
}
```



## 感想
当初、while文内で $.ajax するようなコードを書いてうんうん唸っていたのはいい思ひ出(遠い目
ちなみにこの人気の投稿欄復活は諦めていないので、何か別の作戦を考えてまたリベンジしたいと思います。

※2018/11/21追記
リベンジしてみました。
[[Qiita]なつかしの "人気の投稿" 欄を UserScript で復活させる(β版) - Qiita](https://qiita.com/tommy_aka_jps/items/ef706414bc26fefb9cbd)

## 参考
- [はじめてajaxを使うときに知りたかったこと - Qiita](https://qiita.com/nekoneko-wanwan/items/bedc0e826c0842ca0b11)
- [javascript - Recursive ajax() requests - Stack Overflow](https://stackoverflow.com/questions/18310338/recursive-ajax-requests)
Swiftではtypealiasで型に情報を詰め込むといいかも

コードを書いててミリ秒の変数を表現したい箇所に遭遇したのですが、リーダブルコードでは
> ex) int reconnection_time_ms = 1000;

など、**末尾に単位情報を詰め込んだ変数名を付けよう**。と、書いてありました。

ただ、msは小文字表記なので小文字でそのまま書きたいのですが、Swiftではキャメルケースなので普通に書くと、`reconnectionTimeMs` となってしまいます。

かといって、
`reconnectionTimeMillisecond` では変数名が無駄に長くなってしまうので、 `typealias` で解決する事にしました。

```swift:millisecond.swift
typealias Millisecond = Int
let reconnectionTime: Millisecond
```

変数名に情報を詰め込むのが何らかの状況によってイマイチ綺麗に解決できない時は、 `typealias` で**別名を付けて型に情報を詰め込むと良いかもしれません。**
Vue.jsユーザーがまとめるLaravel Mixの要点とカスタマイズ方法

## 導入
私は1年以上Vue.jsを仕事で愛用しており、それなりにVue.jsについてやそれに関連してwebpackについての知見はたまってきているつもりでした。そんな私がLaravel-Mixを利用したプロジェクトに参加し、がっつりカスタマイズするミッションにぶち当たったなかで得たLaravel-Mixとはなにか、カスタマイズにあたっての方法はなにかをまとめたいと思います。

__webpack/Vue.jsに関してはそれなりに知っている前提で、PHP/Laravelに関してはほぼ知識のない状態でのスタートでした__

## Laravel-mixって？
webpackの設定部分を記述することなく、

- Babelトランスパイルなら`mix.js()`
- .vueのコンパイルも`mix.js()`
- TypeScriptなら`mix.ts()`
- メタCSSなら`mix.sass()、mix.less()、mix.stylus()`

それぞれの引数にファイルのパスを渡すだけです。
webpackの設定を自前で作ったことのある人ならこのシンプルな記述で済むのはなかなか魅力かと思います。

## その他、用意されているメソッド
その他にもwebpackでよく使われる設定はAPIとして用意されており、使い方も基本ファイルパスを渡すだけです。

- 共通コード分割 `mix.extract('vue', 'element')` 引数に指定したモジュールはvendar.jsとして別ファイルでバンドルされます。
- バージョンの付与 `mix.version()` チェーンメソッドで指定した`.js()`や`.sass()`のあとに呼び出すことで`?#xxx`がソースパスに付与されます。
- ファイルのコピー `mix.copy(from, to)` fromで指定したファイルをtoへそのままコピーします。`*`も使用可。

その他にも、グローバルにモジュールを定義する`.autoload()`、コードを最小化する`.minify()`など通常のプロジェクトで使うベーシックなものは揃っています。

## それでもカスタマイズする必要がある場合
mecab-python3(0.996.1d)のpip installでErrorとその対応方法(google colabの場合)

@siraasagiです。
自然言語処理を中小企業経営の皆様にお役立てする為、日々勉強中です。　

#0.この記事は？
2018年11月13日に**mecab-python3**が0.996.1にバージョンアップしました。
インストールの際に前Versionの0.7と比べて**「swig」**が必要になるので注意です。
私の体験談を元に問題発生から解決まで説明いたします。

#1.Version up 直後に起きたError
いつものようにGoogle colabで形態素分析をする前準備をしていたその時！

```install.py
!pip install mecab-python3
```
なんか出ましたね。おかしい...**昨日まで動いていたし...**

```error.py
Building wheels for collected packages: mecab-python3
  Running setup.py bdist_wheel for mecab-python3 ... error
  Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-8mvddq8y/mecab-python3/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-mlhkq6i0 --python-tag cp36:
  running bdist_wheel
  running build
  running build_py
  running build_ext
  building '_MeCab' extension
  swigging MeCab.i to MeCab_wrap.cpp
  swig -python -shadow -c++ -I/usr/include -o MeCab_wrap.cpp MeCab.i
  unable to execute 'swig': No such file or directory
  error: command 'swig' failed with exit status 1
```

#2.ログを読むとswigがfailedと書いている
この部分...そういえば**swig**入れていたか不安ですね。

```errorPickup.py
error: command 'swig' failed with exit status 1
```
前処理を確認しますと...やっぱり**swig**が無いじゃないですか。これが原因。

```apt-get.py
!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git
```

#3.対応方法「swig」をinstall
２節で紹介したapt-getの後に**swig**をインストールし、その後**mecab-python3**をインストール。

``` Successful.py
!apt-get -q -y install swig      # swigをインストール
!pip install mecab-python3       # mecab-python3をインストール
```
これでOK。私の環境はgoogle colabです。

#4.pipyに書いているオフィシャルの前準備
私の前準備はなぜかpython-mecabが混入、使いませんね。
pypiのProject descriptionに書いている本家のコマンドも紹介します。


```official.py
sudo apt-get install mecab mecab-ipadic-utf8 libmecab-dev swig
```

以上です。
SQLよく使う構文まとめ【超初級】

# テーブルの構造について
データベースは、表のような形でデータを管理している。
表のことを「テーブル」と呼び、縦の列を「カラム」と呼び、横の列は「レコード」と呼ぶ。

#SELECT
```sql:SELECT
SELECT *
FROM テーブル名
```
指定したテーブルから、全てのカラムを取得する。

## WHERE
```sql:WHERE
SELECT *
FROM テーブル名
WHERE　条件
```
指定したテーブルの中から、条件に該当するカラムを取得する。

## LIKE
```sql:LIKE
SELECT *
FROM テーブル名
WHERE カラム名 LIKE "文字列"
```
指定したテーブル中から、WHEREで指定したカラムのレコードに、指定した文字列を含むデータを取得する。

## NULL
```sql:NULL
SELECT *
FROM テーブル名
WHERE カラム名 IS NULL
```
指定したテーブルの中から、WHEREで指定したカラムのレコードが、NULLのデータを取得する。

## ORDER BY
```sql:ORDER_BY
SELECT *
FROM テーブル名
ORDER BY カラム名 (DESC or ASC)
```
指定したテーブルの中から、ORDER BYで指定したカラムを、DESC(降順)かASC(昇順)に並び替えたデータを取得する。

## LIMIT
```sql:LIMIT
SELECT *
FROM テーブル名
LIMIT 数値
```
指定したテーブルの中から、データの件数を限定して取得する。

## DISTINCT
```sql:DISTINCT
SELECT DISTINCT　*
FROM テーブル名
```
重複したデータを除いて取得する。

## SUM/MAX/MIN/AVG
```sql:集計
SELECT SUM(カラム名)
FROM テーブル名
```
指定したテーブルの中から、指定したカラムのレコードの合計を取得する。(MAX,MIN,AVGも使い方は同じ)

## COUNT
```sql:COUNT
SELECT COUNT(カラム名)
FROM テーブル名
```
指定したテーブルの中から、指定したカラムの行数をカウントする。COUNT (*)とすると、NULLもカウントされる。

# INSERT
```sql:INSERT
INSERT INTO テーブル名
  VALUES('追加したいデータ')
```
VALUESの中に追加したいデータを記入する。複数のカラムに複数の値を入れたい場合は、左から順番に記入していく。

# UPDATE
```sql:UPDATE
UPDATE テーブル名
  SET カラム名 = 値, カラム名 = 値
WHERE 条件
```
指定したテーブルの指定したカラムに、値を代入する。WHEREで条件を付けなければ、全てのレコードがアップデートされるので注意。

# DELETE
```sql:DELETE
DELETE FROM テーブル名
  WHERE 条件
```
指定したテーブルの中から条件に該当するものを削除する。これもWHEREをつけなければ、全削除になるので注意する。
MySQLメモ

**MySQLとは**世界中の多くの企業が使用しているデータベース管理システムです。大容量のデータも高速に動作を行えるため、レンタルサーバーや検索エンジンでも使用されています。ここでは、MySQLの使い方とインストール方法についてまとめて見ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310210/bf29ca41-bfa4-7a75-a6f2-ea413fed6683.png)

###インストール###
1.pip install
```pip install mysql
```
2.brew install
```brew install mysql
```
3.mysqlホームページでダウンロード
https://dev.mysql.com/downloads/file/?id=480768 
**環境**
```vim ~/.bash_profile
PATH=$PATH:/usr/local/mysql/bin
```
##ターミナルでMySQLデータベースを管理##

1.Mysqlを実行する
```mysql.server start
```
```mysql -u root -p
```
2.password 入力
###データベースの管理###
1.1 create database
```create database 「データベースname」;```
1.2 show 全部のデータベースをみる
```show databases;```
1.3 use データベースを選ぶ
```mysql> use firstDB;```
1.4 今使っているデータベースを表す
```select database();```
1.5 dorp データベースを削除する
```drop database firstDB```

2.tableの管理
2.1 tableを作る
```python

create table people (
    id int AUTO_INCREMENT PRIMARY KEY,
    name varchar(20) not null,
    age int not null);```
2.2 show 全部のtableをみる
```show tables;```
2.3 desc tableの結構を表す
```desc tables;```
....
ほかの操作はSQLiteと基本的　に同じです。
自由にsql　文を使ってみまょう。

##pythonでMysqlデータベースに接続##
例：

```python

import pymysql
id = '20120001'
user ='KIM'
age = 20
# 1.データベースに接続する
db = pymysql.connect(host='localhost', user='root', password='jcg884758', port=3306, db='spiders')
# 2.かソール（cusor）を作る
cursor = db.cursor()
# 3.sql　文を作る
sql ='insert into students(id,name,age) values(%s, %s, %s)'
# 4.sql文を実行する
try:
    cursor.execute(sql,(id,name,age))
#　5.commitする
    db.commit()
except:
# ロールバックとは、データベース処理において、トランザクション処理中にエラーが発生した場合に、そのトランザクション処理を開始する前の状態までデータベースを戻すことである。
    db.rollback()
# 6.データベースを閉める
db.close()

```
Scalaハンズオンで学んだ関数型プログラミング

# はじめに
## 経緯
[Scala関西サミット2018](https://2018.scala-kansai.org/)1日目のセッションでScalaにおける関数型プログラミングについて学ばせていただきたました。
これがわかりやすかったものの、使わないと忘れるので書き残しておこう思います。

## この記事で分かるかもしれないこと
初学者の私が感じるScalaの難しいなと思うところは以下2点です。

+ Scalaの言語仕様。
+ 関数型プログラミングが何かわからない。

そのうちScalaの関数型プログラミングってどんな感じなのかというのがわかったら嬉しいです。

# 本題
## 関数とは
プログラミングに触れる以前の私が学んでいた関数は数学の関数です。
例えば、1次関数`f(x) = x + 1`
これをコードで表すならば。

```scala
def f(x : Int) = x + 1
```

そのままですね。
関数定義に`=`を使うのも、なるほど数学と一緒です。

また数学がどうだったか忘れてしまいましたが、Scalaは関数の定義に当たる式を複数の文・式で表すことができます。
`{}`で囲まれた部分を一つの式としてみなすことができます。
このとき、最後に評価された式の評価結果が関数の戻り値です。

```scala
def f(x: Int) = {
  val y = x + 1
  y * 2
}
```

## 関数型プログラミング
### 気をつけるポイント
+ 変更可能な変数を使わない
+ 再代入も使わない
+ ループなどの命令形の制御を使わない

関数型プログラミングとはこれだ!!という定義はあんまりないようですが、上で挙げた3点に気をつけると良いみたいです。

### 複雑な関数を定義する
1次関数のような簡単な関数なら簡単に定義できそうですが、もっと複雑な関数を作りたいときはどうしましょうか。
**フィボナッチ数列におけるn番目の数**を求める関数を例に説明します。

#### 法則を見つける
フィボナッチ数列の場合
f(1) = 1
f(2) = 1
f(3) = f(1) + f(2)
f(4) = f(2) + f(3)

このように書き出してみると、*最初の2数は1で、それ以降は前の2数を足した数*になりそうですね。そりゃそういう数列だものね。
パターンとして考えられるのは以下の3通り。私はプログラミングをしているの？数学をしているの？
n = 1 のとき f(n) = 1
n = 2 のとき f(n) = 1
n >= 3のとき f(n) = f(n - 2) + f(n - 1)

#### Scalaのコードに落とし込む
上で見つけた法則をコードにそのまま落とし込みます。

```scala
def f(n: Int): Int = n match {
  case 1 => 1
  case 2 => 1
  case _ => f(n - 1) + f(n - 2)
}
```

まんまじゃないか!でもこれがいわゆる関数型プログラミングみたいです。
※関数名や仮引数の名前は各々分かりやすいように変えたほうが良いと思います。

### 補足
上のコードでは再帰を使っていますが、このコードだとスタックオーバーフローを起こしてしまうそうです。
末尾再帰という書き方があるみたいなので、また調べて追記したいと思います。

# さいごに
今までプログラミングをやっていた中で、最も数学感を感じました。高校数学の漸化式みたい!って思ったところもありました。
これはこれで、仕事の息抜きにクイズ感覚でやってみると面白いかもしれません。にわかでごめんないさい。
PHP_Beautifier でソースコードを整形してみた

## 調査

* [PHP_CodeSniffer](https://pear.php.net/package/PHP_CodeSniffer/)
    * 最新の3系はPHP 5.4.0 以降に対応
    * 2系はPHP 5.1.2 以降に対応
    * PHP_CodeSniffer は、うまく動かせなかったため PHP_Beautifier を使うこととした。
* [PHP_Beautifier](http://pear.php.net/package/PHP_Beautifier/)
    * PHP 5.0 から対応っぽい(?)

## インストール

```sh
wget http://pear.php.net/get/PHP_Beautifier-0.1.15.tgz

sudo pear install PHP_Beautifier-0.1.15.tgz
```

## 使い方

`php_beautifier -h`でヘルプが見れる。

```sh
# スペース4個のインデント
php_beautifier input.php > output.php

# タブのインデント
php_beautifier -t input.php > output.php
```

----

## php-cs-fixer を使ってみた

* [PHP Coding Standards Fixer](http://cs.sensiolabs.org/)
* .php_cs : コンフィグファイル

```php:.php_cs
<?php
return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->setRules(array(
        '@PSR2' => true,
        'binary_operator_spaces' => array(
            'align_double_arrow' => true,
            'align_equals'       => true,
        ),
    ))
    ->setIndent("\t");
```

```sh:sample.phpを整形
php php-cs-fixer-v2.phar fix sample.php
```
NetCommons3のパスワード暗号化方法


下記コードは暗号化再現コード。実際にはCakePHP2の ```Security::hash()``` を使ってるのでこのとおりじゃないですが…

```php
// $salt app/Config/application.ymlにあるSecurity.salt app/Config/core.phpにあるSecurity.saltじゃないので注意。 
// $password 入力したパスワード
$encrypt = hash('sha512', $salt . $password);
```

このように ``` app/Config/application.yml``` に記述してある salt を使うのでこのファイルを上書き等で紛失すると、一切ログインできなくなります。


開発環境等でMySQLのクエリでパスワードをまとめて更新するなら下記クエリで。

```sql
UPDATE users SET `password`=sha2('{{Salt}}{{Password}}', 512);
```
C++ > SecureZeroMemory() > 最適化でコンパイラが不要と判断したときに消える ZeroMemory() の代替

```txt:動作環境
C++ Builder XE4
```

- [C++ > ::ZeroMemory()の「::」 > スコープ解決演算子 > ::ZeroMemory()とは > グローバルスコープの明示](https://qiita.com/7of9/items/534aa94fddc8d34513e4#comment-406e19bcf1ecfdb13875)

において @yumetodo 様から[コメント](https://qiita.com/7of9/items/534aa94fddc8d34513e4#comment-406e19bcf1ecfdb13875)をいただきました。
今後検索で見つけたいため、記事としてここに切出します。

ZeroMemory()は最適化で消えるというのは知りませんでした。
代わりのSecureZeroMemory()の存在も知りませんでした。

情報感謝です。

(2018/11/16追記) 
@ryoco さんの[コメント](https://qiita.com/7of9/items/53fcfc1124b38cde9da1/#comment-69a5fb987ac9a9982542)にてZeroMemory()が最適化で消える場合と消えない場合について教えていただきました。

情報感謝です。


### 関連情報

Windowsデベロッパーセンター
[SecureZeroMemory function](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366877(v=vs.85).aspx)

> Use this function instead of ZeroMemory when you want to ensure that your data will be overwritten promptly, as some C++ compilers can optimize a call to ZeroMemory by removing it entirely.

[ZeroMemory macro](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366920(v=vs.85).aspx)

> To avoid any undesired effects of optimizing compilers, use the SecureZeroMemory function.

(余談) ZeroMemory macro。マクロ? (ZeroMemory functionでなく)
php-master-changes 2018-11-13

今日は ext/soap で precision が -1 だと出ていた Fatal エラーの修正、x32 ABI でのコンパイル問題の修正、socket_write() などの len チェック追加、ext/imap のテスト修正があった！

あと 11/12 は master へのコミットのない日だった！

# 2018-11-13
## cmb69: Fix [#77141](https://bugs.php.net/bug.php?id=77141): Signedness issue in SOAP when precision=-1
- https://github.com/php/php-src/commit/f6079e3c56eabe03565faceaef9de12728d278bf
- [7.1~]
- ext/soap で、ini の [precision](http://php.net/manual/ja/ini.core.php#ini.precision) が -1 の場合に Fatal エラー（"Possible integer overflow in memory allocation"）となる問題の修正
- safe_emalloc() の size_t を受け取るところへ -1 が渡されていた形

## janekr: Fix compilation on x32
- https://github.com/php/php-src/commit/f76be1a0d682fb11c706a789cce1dfb898041f30
- [7.3~]
- [x32 ABI](https://sites.google.com/site/x32abi/) でのコンパイル問題の修正
- [PLD Linux](https://www.pld-linux.org/) のパッチから[持ってきた](https://github.com/php/php-src/pull/3665) 修正

## thiagooak: Validate length on socket_write
- https://github.com/php/php-src/commit/ec2e7a2d480cfe51e5a234354a50bb4c85fae155
- [7.1~]
- ext/sockets で、[socket_write()](http://php.net/manual/ja/function.socket-write.php)、[socket_send()](http://php.net/manual/ja/function.socket-send.php)、[socket_sendto()](http://php.net/manual/ja/function.socket-sendto.php) の len が 0 以上であることのチェックを追加
- size_t に渡されるのでオーバーフローになってた
- [#67619](https://bugs.php.net/bug.php?id=67619) の修正

## dstogov: Fixed tests
- https://github.com/php/php-src/commit/6bb94eacd72499b62bf636d1338ba0b77cdf1671
- ext/imap のテスト修正
Qiitaには「あわせて書きたい」をあわせて書きたい。「アウトプット次回予告」。 創造性のメモ帳は脳のシナプスを真似なさい。

# あわせて書きたい

最近、自分のQiita記事で「あわせて書きたい」を書くことがある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f4d9a9c3-3003-6945-64a6-8c63bb4c4e7a.png)



# 「アウトプット次回予告」。

- 「あわせて書きたい」とは？ 
  - その名のとおり、自分が次に書きたいことのノート。
  - その記事を書いていて、思い浮かんだこと、書きたくなったことを、メモしておく。

# メモでメモでないちょっとTODOリストなメモ

- 自己宣言的な効果がある。
  - 「あわせて書きたい」を書くことで、それ自体が自分の脳に刻まれる気がする。メモは人のためならず。
  - メモ兼TODOリスト的な役割を担う。
  - 「あわせて書きたい」を書いているうちに、居ても立ってもいられなくなって、新しい記事を書き上げてしまうこともよくある。

# メモは創造的な行為である

- メモを書くことそれ自体が創造的な行為だ。
- 実は「自分が書きたいこと」をメモしているのではなくて、「メモ」をしているうちに「自分が書きたいこと」が明確に浮かび上がってくる。


# 創造性のメモ帳は脳のシナプスを真似なさい。

- 「ひとつの記事から思い浮かんだこと」が関連付けられるので、ただのフラットなメモとは効用が違う。
  - 脳の神経回路がシナプスを作るのに似ている。 Has many な感じ。こいつがホット。
  - フラットなメモもあわせて使う。役割が違うので、どちらも使い分ける。


## フラットなメモの例

Qiitaネタもプライベートネタも全部入れ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/25af66e7-d15b-d804-3262-bee51e4d03b5.png)

# まだネタ帳をプライベートにして消耗してるの？

- ネタ帳を公開しようよ。
  - あんなこといいな、できたらいいな。
- もしかしたら他の人から「読みたい」という声が上がるかもしれない。上がらないかもしれない。
- ネタ帳を公開するとあとからGoogle検索することも出来るよ。
  - 自分が何かキーワードさえ覚えていれば。
  - `稲浦 Qiita あわせて書きたい` とかで検索しても良い。


# あわせて書きたい。

- フラットなメモと、ホットなメモ、脳のシナプス的メモの役割の違い。
- Qiitaで夢を叶える10の法則。「出来るエンジニア」がQiitaを使う理由。
- キャッチフレーズの教科書。Qiitaのタイトルは「本屋」「ビジネス書のタイトル」に学びなさい。



# あわせて読みたい？

- [「Qiitaのタイトルは3の魔法で決めなさい」「サザエさん三本立戦略」「 3と3をかけると9になる 」 - Qiita](https://qiita.com/YumaInaura/items/48d77d853fac57e39e89)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
C# はコンストラクタの型引数を省略できない

## コンストラクタの型引数が省略できるようでできない...

C#の型引数の省略

- メソッドの型引数が引数から明らかである場合、**省略できる**
- コンストラクタの型引数が引数から明らかであっても**省略できない**

型引数にジェネリクスの`T`を持つクラスがあるとします。

```cs
class MyClass<T> {
  public MyClass(T t) {
    this.Value = t;
  }
  public T Value { get; }
}
```

`T`は`int`型であることが明らかなので省略できる気がするが...

```cs
// コンパイルエラー
var c = new MyClass(10);
```

実際には型引数を省略することはできません。

以下のように`int`を明示する必要があります。

```cs
var c = new MyClass<int>(10);
```

また、コレクション初期化子から型引数が明らかである場合も省略できません。

```cs
// `<string, int>`を省略できない
var dict = new Dictionary<string, int> {
  ["apple"] = 100,
  ["orange"] = 150,
  ["banana"] = 200
};
```

## コンストラクタの型引数を省略するにはファクトリークラスを使う

メソッドは型引数が明らかである場合、省略することができます。

```cs
class MyClass<T> {
  public MyClass(T value) {
    this.Value = value;
  }
  public T Value { get; }
}

static class MyClassFactory {
  public static MyClass<T> New<T>(T value) => 
    new MyClass<T>(value);
}
```

以下の変数`c`は`MyClass<int>`になります。

```cs
var c = MyClassFactory.New(10);
```

ファクトリークラスでインスタンスを生成することで型引数を省略することができました。

この方法は`Dictionary<TKey, TValue>`のように型引数が多い型には時に有効です。

```cs
// Dictionary<TKey, TValue>のファクトリークラス
// クラス名を同じにするとそれっぽい（型引数あるなしでユーザー定義型として区別可能）
static class Dictionary {
  public static Dictionary<TKey, TValue> New<TKey, TValue>(
    params (TKey key, TValue value)[] tuples
  ) {
    var dict = new Dictionary<TKey, TValue>();
    foreach (var (key, value) in tuples) {
      dict.Add(key, value);
    }
    return dict;
  }
}
```

以下の変数`d`は`IDictionary<string, int>`になります。

```cs
var d = Dictionary.New(
  ("apple", 100),
  ("orange", 150),
  ("banana", 200)
);
```


## 参考

**[なぜC＃はクラスコンストラクタに暗黙のジェネリック型をサポートしていないのですか？ - stackoverflow](https://stackoverflow.com/questions/45604/why-doesnt-c-sharp-support-implied-generic-types-on-class-constructors)**
「Qiitaのタイトルは3の魔法で決めなさい」「サザエさん三本立戦略」「 3と3をかけると9になる 」

# Qiitaのタイトルは3の魔法で決めなさい

- Qiitaやブログのタイトルはどう決めるか
  - 内容が分かるタイトルを付けたい。
  - 人目を引くキャッチーな名前にしたい。
  - SEO的にヒットしやすい名前にしたい。自分が思い出して、あとから検索できるタイトルを付けたい。
- 僕の場合「タイトルにしたいフレーズ」「思いついたフレーズ」が多すぎて、毎回悩む。
  - 色々な言葉を詰め込んで、わりと長いタイトルにすることが多い。
  - 内容が詳細の詳細で長くなってしまい、整理がつかなくなることも多い。
- 数の魔法を味方にする。「三本立戦略」が良いのではないかと思った。
  - この記事のタイトルも「三本立番組」みたいに付けているのが分かると思う。

# ”サザエさんは三本立” 戦略。

- 三本立の番組名を作るみたいに、Qiitaやブログの記事タイトルを付けてみる。
- 3本という数がちょうど良い。取捨選択がやりやすい。
  - 2だと少なく、4だと多い。
  - どんな記事を書くにしても、言いたいポイントは3つぐらいある気がするから。
- 3テーマ、3キャッチフレーズをつけることで、文章構成を整理しやすい。
  - たとえば1テーマが大きくなったら「このテーマだけ独立させたい」ということも簡単になる。
  - 今このやり方を意識してみて、はじめて、文章構成の管理って難しいなと思った。サザエさん力の経験値が低い。試行錯誤。

# 3と3をかけると9になる

- 1テーマあたりも三箇条書きぐらいにする。
  - 3が3に分かれて9になる。こうやって粒度の拡散をおこなっていく。
  - 「まとめがうまい人」って、あらゆるところで「三本立戦略」を実行している気がする。
  - 僕の場合はついつい溢れがち。こうやって補足が多くなる。


# 名言ジェネレーターになろう 


- キャッチフレーズ力は使えば使うほど鍛えられる。
  - だんだんとキャッチフレーズが脳にあふれて止まらなくなる。楽しい
  - 息を吐くように名言、キャッチフレーズを生み出せるようになろう。
- 「天才とは、常にやりたいことの方が、出来ることよりも多い状態にある人のことである」(そんな言葉をどこかで見た)
  - 社会的に有名か無名かを問わず、僕らは「天才性」「創造性」を持っている。
- ああ、テーマが4個になってしまった。
  - なんとなく本来のテーマから外れた項目になってしまった。
  - こういう場合は新しい記事を書きたい。そしてそこでもまた、3分割の3分割が生まれていく。
  - 必ずしも3にこだわる必要はない。3を基本にして、2-5ぐらいの間を行ったり来たりしたい。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
すごいH本読んだからまとめ 9 「関数適用($),関数合成(.)」

## はじめに

* [すごいHaskellたのしく学ぼう](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86%EF%BC%81-%EF%BC%AD%EF%BD%89%EF%BD%92%EF%BD%81%EF%BD%8E%EF%BC%AC%EF%BD%89%EF%BD%90%EF%BD%8F%EF%BD%96%EF%BD%81%EF%BD%83%EF%BD%81-ebook/dp/B009RO80XY)を読んだのでちょっとずつまとめていきたい。まとめていきたい。

* シリーズ
  * [すごいH本読んだからまとめ 1 「関数の呼び方、関数の定義の仕方」](https://qiita.com/yumakkt/items/ce82eb3ffae874faf249)
  * [すごいH本読んだからまとめ 2 「リスト,タプル」](https://qiita.com/yumakkt/items/36d95c738a3bc17119bd)
  * [すごいH本読んだからまとめ 3 「型」](https://qiita.com/yumakkt/items/f47e8ee810679978869f)
  * [すごいH本読んだからまとめ 4 「関数の構文」](https://qiita.com/yumakkt/items/c50dcd286cf7521e31a0)
  * [すごいH本読んだからまとめ 5 「再帰」](https://qiita.com/yumakkt/items/ecb3244446de17aaa7fa)
  * [すごいH本読んだからまとめ 6 「カリー化」](https://qiita.com/yumakkt/items/e2b4379317d9ca5f94e9)
  * [すごいH本読んだからまとめ 8 「ラムダ式」](https://qiita.com/yumakkt/items/10d583e09b4586e73d89)


## 関数適用($), 関数合成(.)

### 関数適用演算子`($)`

#### どいういうものか

* 関数をそのまま実行する関数として定義されている
* ただし、この関数を実行するときの優先順位は最も低い

```haskell
*Main Lib> :t ($)
($) :: (a -> b) -> a -> b


*Main Lib> (*) 3 $ 2 + 5
21
-- $ 関数は手前の関数(*)を実行するだけなので
-- カリー化された((*) 3) 関数を実行する
-- 適用順は最遅なので先に2+5(=7)が計算される
-- ((*) 3) 7 を実行すると21になる


-- 上の関数はこれと一緒
*Main Lib> (*) 3 (2 + 5)
21
-- ()いらずに関数が書けるようになったと思えば良い模様
```

#### 複数個の($)を定義したときの実行順序

* ($)は`右結合性`を持つ
* `右結合性`とは複数の演算子が重なったときに`右側の演算子から実行される`ということ
* ($)は優先順最低の演算子なので他の関数が全て実行されたあとに右側から実行されていくと考えるとよい


下の関数を優先順位順に並べてみる 

```haskell
sum $ filter (> 10) $ map (*2) [2..10]
```

`($)` に囲まれていない関数を先に実行して結果を取得する（わかりやすさのため）

```haskell

over10 = filter (> 10) -- 結果はカリー化された関数なので値を保存

*Main Lib> map (*2) [2..10]
[4,6,8,10,12,14,16,18,20] -- mapした結果

```

最初の関数に代入する

```haskell
sum $ over10 $ [4,6,8,10,12,14,16,18,20]
```

右結合なので右側から関数を実施

```haskell
*Main Lib> over10 $ [4,6,8,10,12,14,16,18,20]
[12,14,16,18,20]
```

最後に総和を計算して計算終了

```haskell
*Main Lib> sum $ [12,14,16,18,20]
80
```

### 関数合成のための関数`(.)`

#### どういうものか

* 関数と関数を結合する関数
* 2番目の引数に与えた関数の戻り値を1番目の関数の引数に与える


```haskell
-- 最初に受け取る関数の引数は一つだけみたい
-- 
*Main Lib> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c

-- ラムダ式を使ってf.gを定義する。
f . g = \x = f (g x)

```
#### 複数個の(.)を定義した場合

関数合成も右結合なので、複数個の関数を合成することが可能

```haskell
*Main Lib> (+) 3 . (*) 5 . (+) 2 $ 3
28
-- 関数適用($)と同じく右側の(.)から関数の実行がされていく
```

#### 複数の引数を受け付ける場合


* `(.)演算子`の定義が1引数を受け取るものになっている
* その定義に合わせて関数を適用されるように`($)演算子`で調整する

```haskell

-- 4つの引数を受け取る関数を事前に定義
plus4 w x y z = w + x + y + z

-- こんな感じで実行してみる
*Main> (+) 3 . (*) 5 . plus4times 1 2 3 4
-- エラーでる
<interactive>:30:1: error:
    ? Non type-variable argument in the constraint: Num (a -> c)
      (Use FlexibleContexts to permit this)
    ? When checking the inferred type
        it :: forall c a. (Num c, Num (a -> c)) => a -> c

-- ($)演算子を使って関数が適用される順番をコントロールする。
*Main> (+) 3 . (*) 5 $ plus4times 1 2 3 4
53 -- 「(+) 3 . (*) 5」を結合したものと「plus4times 1 2 3 4」の結果を計算する

```
Windows C++で音声再生

音声再生のプログラムが意外にも少なかったのでメモ.
#開発環境
Visual Studio 2015

#用意するもの
MMSystem.h
WinMM.Lib
.wavファイル
***
まずは,Visual Studio 2015を立ち上げて,プロジェクトを作成するところから始めましょう.
Visual Studioを立ち上げたら左上の[ファイル]から[新規作成]->[プロジェクトを選択]
その後,画像のようにWin32 コンソール アプリケーションを選択.プロジェクト名などを入力したら[完了]を押します.
![スクリーンショット (97).png](https://qiita-image-store.s3.amazonaws.com/0/316006/4367b149-750a-b967-ecdc-5c3a729c73c1.png)


次に,画面右の[ソリューションエクスプローラー]の下にあるプロジェクトを右クリックし[プロパティ]を選択します.そうすると,下の画像のようなウィンドウが出てくると思います.
はじめに,一番上にある[構成]を[Release]にし,[プラットフォーム]は[x64]にしておきます.
このウィンドウの[C/C++]->[全般]の一番上にある[追加のインクルードディレクトリ]で使いたいヘッダファイルがあるフォルダを絶対パスで指定します.今回は,
**C:\Program Files (x86)\Microsoft SDKs\Windows\~\Include**
を指定します.

次に,[リンカ]->[全般]の真ん中あたりにある[追加のライブラリディレクトリ]で必要な.libファイルがあるフォルダを絶対パスで指定します.
今回は,
**C:\Program Files (x86)\Microsoft SDKs\Windows\~\Lib**
を指定します.
さらに,[リンカ]->[入力]の一番上にある[追加の依存ファイル]で必要な.libファイルを指定します.[全般]でフォルダまでのパスを指定しているので,ファイル名だけで結構です.今回必要なファイルは,**WinMM.Lib**です.
![スクリーンショット (98).png](https://qiita-image-store.s3.amazonaws.com/0/316006/54bc7290-5244-a4de-224a-091f30bb0f88.png)

***
コードを書いていきます.
 今回使用するインクルードファイルは以下3つです.MMSystem.hは,私の場合
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
の下にありました.~\Windowsの下にあるフォルダから探してみるといいと思います.

```
#include <iostream>
#include <windows.h>
#include <MMSystem.h>
```

ソースコードです.PlaySound関数はbool型で,waveファイルを再生する関数です.他の形式のものは再生されません.

```cpp:PlayAudio.cpp
int main()
{
	if (!PlaySound(TEXT("file.wav"), NULL, SND_SYNC)) {
		std::cout << "再生できません" << std::endl;
	}		

	system("pause");
	return 0;
}
```

第1引数はLPCSTR(const char*らしい...)型で、TEXT(waveファイル名)で指定すればいいです.
第2引数はデフォルトでNULLで問題ありません.
第3引数でフラグ(再生方法)を指定します.基本的にはSND_SYNC(通常再生)でいいと思いますが,SND_LOOPでループ再生させることもできます.詳しくはリファレンスを参照.(https://msdn.microsoft.com/ja-jp/library/cc428768.aspx)

SND_LOOPを使用する注意点としては,SND_LOOPを使用するだけでは,ループしてくれないということです.while文で囲んでやると,再生が終わると,新たに再生を始めてくれます.
***
Visual Studio 2017で同じことをするとどう頑張ってもエラーをはかれてしまう現象に悩まされています.といってもVisual Studio 2015でも十分使えるので問題はないですけど...
vbs初心者がiTunes COM Interfaceを使って音楽ファイルからiTunesのライブラリへ登録するscriptを作った

# プロローグ
音源ファイルを自分を管理し、iTunesへ自分で音源ファイルをドラッグアンドドロップしてライブラリを構築していた。
ある日Windowsがお亡くなりになり、再インストール。音源ファイルはあるが、iTunesのライブラリは消えてなくなってしまった。
膨大な音源ファイルからiTunesライブラリを再構築させる方法を探し求め、なんとか復活したのでその道程を記す。

# iTunes COM Interface

WindowsからiTunesを操作するAPIがある。まず、こいつの存在がなかなか知られてない。
そしてドキュメントがなかなか見つからない。
苦労して見つけたのでリンクしておく。これだけで救われる人も多いだろう・・・

[iTunes COM Interface Documentation](http://www.joshkunz.com/iTunesControl/main.html)

ただこれは公式でもなんでもなさそうで、いつ消えるか含め内容は未保証。
そもそも2009年の情報らしいし・・・

# iTunesに曲を登録するスクリプト

```visualbasic
Sub addMusic(path)
  Dim iTunesApp, iLibraryPlaylist, result

  Set iTunesApp = WScript.CreateObject("iTunes.Application")
  Set iLibraryPlaylist = iTunesApp.LibraryPlaylist
  Set result = iLibraryPlaylist.AddFile(Path)
End Sub
```

iLibraryPlaylist がiTunesのライブラリのオブジェクト。
AddFile メソッドでファイルパスのファイルをiTunesに登録してくれる。
このスクリプト実行すると勝手にiTunesが立ち上がってくる。油断してるとビビる。

# ライブラリに曲の情報を追加する

AddFile メソッドでは音源ファイルから、曲に付加できる情報は自動で付加される。たとえばファイル名から曲名をつける、など。MP3ファイルなどならファイルのタグ情報から自動で入ってくれるが、Waveファイルだとそのようなものはないので曲名しか自動で付加されない。
それをスクリプト内で付加するにはこうする。

```visualbasic
Sub addMusic(path, artist, album)
  Dim iTunesApp, iLibraryPlaylist, result

  Set iTunesApp = WScript.CreateObject("iTunes.Application")
  Set iLibraryPlaylist = iTunesApp.LibraryPlaylist
  Set result = iLibraryPlaylist.AddFile(Path)
  If Not result Is Nothing then
    Set tracks = result.tracks
    For Each track in tracks
      track.Artist = artist
      track.Album = album
      track.Genru = "J-Pop"
  End If
End Sub
```

AddFile メソッドの返り値のtracksに、メソッドで追加した曲の情報が入っているので、これを直接操作することでライブラリの曲の情報を編集できる。
ただし、この操作（ArtistやAlbumの更新など）はエラーが発生することがあるので、上記では省略しているけれども、エラー処理をしておかないと途中で処理が止まってしまう。

# スクリプトの処理速度
AddFileで1ファイルずつ登録しArtist、Album、Genruを設定するスクリプトを動かしたところ、9000曲程度で2時間弱かかった。結構時間かかる印象。でも手で登録するよりは全然楽。
AddFile は音源ファイル単体だけでなく、フォルダを指定することでそのフォルダ配下の音源ファイルをまとめて登録するという動きもするらしい（未確認）。その場合はもっと処理速度が上がるかもしれない。
Qiitaの例 – SNSを炎上させる方法。バズらせる技術。ソーシャルハッカーはお好きですか？

[全ての開発者がQiitaへのアウトプットをやめるべき理由 - Qiita](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1) がバズっている理由はなんだろう。

そこには隠された仕組みと戦略があった。

# まとめ

- SNSごとに「仕組み」があるので、うまく使う。システムなくして炎上なし。
- 自己承認欲求、議論したい欲求、矛盾を指摘したい欲求など、人間心理をうまく使う。人なくして炎上なし。

# 一、システムなくして炎上なし


## トレンドを制する者が炎上を制する

いちど波に乗れば強い。波に乗り続けよう。

- まずは10いいねを集めてマイルストーンに乗る。
  - 100いいね / 300 いいねでまたウェーブが訪れる。
- トップページのトレンドに乗るのを目指す。
  - ここに乗れるか乗れないかで、燃え具合はは全く違ってくる。

その具体的な手法は後述する。

## 通知を制するものが炎上を制する

- Qiitaの場合、コメント機能と通知機能が「強いつながり」を持っている。
  - いちどでもコメントを付けたユーザーには、別の人のコメントが通知される。
  - [Qiitaはなぜ炎上するのか。「コメント通知」の解除手段がないとどうなるか。サービス設計/UI/UX/仕組み/システム面/ユーザー行動から考えてみる。 - Qiita](https://qiita.com/YumaInaura/items/e6c60d3e80239ad48377)
- コメント機能で議論を呼ぶと、炎上、バズにつなげやすい。
- 通知は「トレンド」についで、人の注意力、アテンションを引く最大の仕組み。2大巨塔。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/61511413-e41e-dbf9-9d57-2be29dba86a2.png)


# 一、人なくして炎上なし

- 炎上は人が起こすもの。人の興味を引けたら勝ち。

## フォローを制する者が炎上を制する。

- 「自分の記事に興味を引きそうなユーザー」を大量にフォローする。
- いいねよりも「フォロー」は強力。「あ、自分に興味を持ってくれたんだ」と思って、その人の記事をチェックする。

### コミュニティ活動が盛んなユーザーの注意を引く

- @qiitadaisuki さんの「フォローリスト」を見ると、127ユーザーがフォローされているのが分かる。
  - https://qiita.com/qiitadaisuki/following_users 
  - @YumaInaura も含まれている。
- 「アカウント選別」がどれぐらい戦略的におこなわれたかどうかは不明。
  - 「コメント数の多い、コミュニティ上で活動的なユーザー一覧」みたいなリストがあれば、そのアカウントをフォローしたら効果的かもしれない。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/89c2d664-f7b6-efbe-193d-240dc42a5060.png)


### フォローがコメントにつながった実例

- @YumaInaura も「フォロー」をきっかけに初コメントを付けた。
- その時は、記事もまだ「0いいね」で「へぇ、こんな尖った記事もあるんだ」ぐらいの印象だった。
  - たぶん最初は、皆そんな感覚だろうと思う。大災害と同じ。「炎上の始まりだった」と気付くのは後になってから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fb245a50-3d3e-793e-a577-58865fbc7b93.png)

[YumaInauraのコメント](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1#comment-fc330327d0ca297060ca)

## ツッコミを制する者が炎上を制する。

- ツッコミどころをたくさん用意しておく。
  - Qiita批判の記事なのに qiitadaisuki というアカウント名だったり。
- 「さっと読んでも気付かないけど、よく読むと変だぞ」「俺は見つけた！」的なアハ体験になるとさらに良い。
  - 時間がない人はざっと読んで「同意できる」「いいね」するし、読む時間がある人は「おかしいぞ」とツッコミを入れる。いいねとコメントの両取りが出来る。

## 感情を制する者が炎上を制する。

- 炎上のターゲットが感情的になるような内容を混ぜておく。
  - ソーシャル炎上の歴史も長いので、多くの人が知るところ。
 
# ところで炎上ってそんなに悪いことなの？

- 個人攻撃にまで発展するような炎上はよろしくない。
- あくまで技術共有サイトとして使っているユーザーにとっては大迷惑。
- 自由闊達な議論がおこなわれるのは悪くないと思う。

# ソーシャルハッカーはお好きですか？

- 炎上を起こすのはソーシャルハッキングだ。
- プログラマなら「ハッカーが大嫌い」という人はいないと思う。
- じゃあ、なぜ「ソーシャルハッカー」は嫌いなのだろう。尊敬して良いぐらいだと思わないだろうか。

# あわせて読みたい？

- [Qiitaと炎上問題。ユーザー努力によるコミュニティ改善は可能だ。 - Qiita](https://qiita.com/YumaInaura/items/27a766acfb42c1203a11)

# あわせて書きたい

- Qiita炎上から見を守ろう。自衛のための5のチェックリスト。
- 「Qiitaのタイトルを考える」「サザエさんに学ぶ 三本立て戦略」「名言ジェネレーターになろう」
- この記事を三記事ぐらいに分割して、各テーマを広げてみたい。
  - 「Qiita炎上の火種」には誰も気付いていなかった。「フォローの仕組み」がうまく活用されていたのだ。
- Qiitaにおける「コメント・マイノリティ」と「いいね・マジョリティ」。
  - 炎上問題を議論しているのは、実は僕ら、コミュニティ活動が熱心な1割のユーザーだったりしないか？















<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
深夜にSlack駆動開発。眠れない夜はSlack+iPhoneで遊ぼう。分報は創造性のメモ帳である。

# 深夜に目覚めた時、あなたは何をする？

ゲームを刷るか。Youtubeを見るか。そのままベッドの中でうなされるか。

# Slackでしょ！

iPhoneなどのスマホアプリで、分報を書いてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/34d52485-b5e5-df2b-96e6-8cd67859a4b9.png)

# 深夜Slackのメリット

- うなされない。
- 最高の暇つぶしになる。
- みんな眠っているので、人の注意力を奪わない。
  - もし仮に通知であなたの分報をチェックしている人がいたら、そうとうなファンなのでそれはそれで問題ない。
- プライベートなネタを書いても怒られない。サボっていると思われない。
  - サボってないし。

# 分法とは。

- 業務報告に使うものではない。
- 遊び場。
- 自分の創造性、クリエイティブな活動のための下書きにできる。

# Slack分報は創造性の下書きである


この記事も深夜Slackから生まれた。

- iPhoneで自分の分報に好きなことを書く。
- ネタが思いつく。
- 乗ってきたらPCを開いてブログやQiitaを書く。
- 乗ってこなかったら眠る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1f6c1b84-c7ca-ffc1-53a4-1355c209f66f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/30398ba5-0b85-7afc-2af0-1adf282e4c3b.png)

# これいい！

あなたもどうぞ。

# あわせて読みたい？

- [Slack分報で下書き + Qiitaで記事公開する例。一粒で二度美味しいアウトプット術。勝手にオープン・クローズ原則。 - Qiita](https://qiita.com/YumaInaura/items/5ce501738fd59bef6526)
- [人見知りなエンジニアの人間関係・社交術・人脈術 – Slack Skype ChatWork などの社内チャットでチーム・プロジェクト・会社の人と仲良くなるコツ - Qiita](https://qiita.com/YumaInaura/items/750fb4e1a6e520cc6e33)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SequelizeのdefaultValue をNowにする方法なう

##SequelizeのdefaultValue: Sequelize.NOWは機能しない

Sequelizeの公式リファレンスで以下の例があるが、defaultValueがなぜか上手く機能しない。

```javascript

const Foo = sequelize.define('foo', {
 // default values for dates => current time
 myDate: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW 
 },
 .....

```

正しくは、Sequelizeのリテラルを用いてDBの関数を呼び出すと良い。
以下の例文はmysqlを使用している場合。

```javascript

const Foo = sequelize.define('foo', {
 // default values for dates => current time
 myDate: { 
  type: Sequelize.DATE, 
  defaultValue: Sequelize.literal('NOW') 
},
 .....

```