OmniAICreator/Qiita-1.07M huggingface dataset:
C++ 幅優先探索（BFS）

深さ優先探索では**スタック**
幅優先探索では**キュー**

```c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)

const int INF=1001001001;
char maze[100][100];//迷路を表す文字列の配列
int N,M; 
int sx,sy; //スタート位置
int gx,gy; //ゴール位置
int d[100][100]; //各点までの最短距離の配列
int dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}; //移動の4方向ベクトル

int bfs(){
    queue <P> que;
    //全ての点をINFで初期化
    REP(i,N) REP(j,M) d[i][j]=INF;
        
    //スタート地点をキューに入れ、その点の距離を０にする
    que.push(P(sx,sy));
    d[sx][sy]=0;
    
    //キューが空になるまでループ
    while(!Q.empty()){
        //キューの先頭を取り出す
        P p=que.front(); que.pop();
        //取り出してきた状態がゴールなら探索を止める
        if (p.first==gx && p.second==gy) break;
        //移動4方向をループ
        for (int i=0; i<4; i++){
            //移動した後の点を（nx,xy）とする
            int nx=p.first+dx[i],ny=p.second+dy[i];
            //移動が可能かの判定と既に訪れたことのあるかの判定
            if(0<=nx && nx<N && 0<=ny && ny<M && maze[nx][ny]!='#' && d[nx][ny]==INF){
                que.push(P(nx,ny));
                d[nx][ny]=d[p.first][p.second]+1;
            }
        }
    }
    return d[gx][gy];
}

void solve(){
    int res=bfs();
    printf("%d\n",res);
}
```

例えば...
**幅優先探索問題**
https://atcoder.jp/contests/abc151/tasks/abc151_d

```c++
#include<bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
typedef long long ll;
const int dx[4] = { 0, -1, 1, 0 };
const int dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
using namespace std;
typedef pair<int,int> P;

int main() {
	int h, w; cin >> h >> w;
	char s[21][21];
	REP(i, h) REP(j, w) cin >> s[i][j];
	int ans = 0;
	int d[21][21];

	REP(i, h) {
		REP(j, w) {
		    queue <P> Q;
			//全ての点をINFで初期化
			REP(k, 21) REP(l, 21) d[k][l] = INF; 
			//スタート地点をキューに入れ、その点の距離を０にする
			if (s[i][j] == '#')continue;
			Q.push({ i,j });
			d[i][j] = 0;
			
			//キューが空になるまでループ
			while (!Q.empty()) {
			    //キューの先頭を取り出す
				int y = Q.front().first;
				int x = Q.front().second;
				Q.pop();
				for (int k = 0; k < 4; ++k) {
					int ny = y + dy[k];//const int dy[4] = { -1, 0, 0, 1 };
					int nx = x + dx[k];//const int dx[4] = { 0, -1, 1, 0 };
					if (0 <= ny && ny < h && 0 <= nx && nx < w && s[ny][nx] == '.' && d[ny][nx] == INF) {
						Q.push({ ny,nx });
						d[ny][nx] = d[y][x] + 1;
					}
				}
			}
			REP(k, h) {
				REP(l, w) {
					if (d[k][l] == INF)continue;
					if (s[k][l] == '#')continue;
					ans = max(ans, d[k][l]);
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}

```
NuxtのasyncDataとdataの使い分け方

NuxtにはasyncDataがあります。Vueはdataのみが使えますが、NuxtはasyncDataとdataどちらも使えます。

では、asyncDataとdataはNuxtでどう使い分ければ良いのか？

これが疑問でしたので、asyncDataとdataの違いについて調査してみました。結論から言うと、私はasyncDataのみを使い、mountedでwindowやdocumentにアクセスする方針に決めました。

なおfetchはasyncDataと似た挙動をしますが、コンポーネントに値をセットすることはできません。fetchはVuexに値をセットする目的で使用されます。

以下は私の調査結果と、考察になります。間違いがあればご指摘をお願いいたします。

## asyncDataとdataのに違いについて調査してみた
#### async/awaitについて調査
まずはなぜasyncDataが必要なのかを調べるために、dataをasync functionにして非同期処理を含めてみました。
すると、dataが実行されていることは確認できましたが、コンポーネントに値がセットされていませんでした。

dataはawaitなしで実行され、asyncDataはawaitつきで実行されているようです。
今回のケースでは、dataはPeomiseを返していたため、コンポーネントに値がセットされていなかったということです。

#### SSR時の実行順序について調査
サーバーでasyncDataの呼び出し→
サーバーでdataの呼び出し→
クライアントでdataの呼び出し

となりました。クライアントでasyncDataは実行されないので、windowやdocumentにアクセスできるのは**dataだけ**となります。(サーバーでアクセスしないように、process.clientがtrueかチェックする必要あり)
**SSRする初回アクセス時に、windowやdocumentにアクセスできるのがdataの唯一のメリット**といえそうです。

#### SPAページ遷移時の実行順序について
クライアントでasyncDataの呼び出し→
クライアントでdataの呼び出し

となりました。
#### それぞれがreturnしたオブジェクトの上書きについて
コンポーネントへ値をセットすることに関しては、**asyncDataの値が優先されます。**
ややこしいことにdataの方が後に実行されるのですが、同じプロパティについてはasyncDataの値が優先されます。

## 結論
**asyncDataだけで良さそうです。**繰り返しになりますが私はasyncDataのみを使い、mountedでwindowやdocumentにアクセスする方針に決めました。

好みの問題ですが、非同期処理のみをasyncDataに書いて、それ以外をdataにするセマンティックを重視した方針もあるかと思います。

asyncDataとdataうまく使い分けたところで、ページの表示が大幅に速くなることはなさそうです。



## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Webpack+Babelでbabel.config.jsを使う

# 1. はじめに

こんばんは。Webを勉強している学生のTakuyaHanadaです。

Webpack + BabelでPoryfillを設定しようと思ったときに、`babel.config.js`を作成してもうまくいかず、ネットで調べても有力な情報がなかったため、記事にします。

間違いなどありましたら、教えていただけると勉強になります。

# 2. 環境

- Node v12.14.1
- Webpack v4.41.5
- Babel v7.8.3

# 3. つまずいた点

> Webpackを使うとき、`babel.config.js`を使えない。

実際は使えました。

ネットで色々調べてみたのですが、有力な情報がありませんでした。（ここに載ってるよとかありましたら、教えて下さい！）

そこで、ドキュメントなどを見ていろいろ試したところ、Webpackの設定ファイル`webpack.config.js`の中にBabelの設定を書いていると、`babel.config.js`は使われないことがわかりました。

なので、`options`の部分をBabelの設定ファイル`babel.config.js`に移すとうまくいきました。

```js:webpack.config.js
const path = require('path')

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          // ↓ここの部分を削除して、babel.config.jsに移す
          // options: {
          //   presets: [
          //     [
          //       '@babel/preset-env',
          //       {
          //         useBuiltIns: 'usage',
          //         corejs: 3
          //       }
          //     ]
          //   ]
          // }
        }
      }
    ]
  }
}
```

# 4. おわりに

なんとか動くようになってよかったです。

もっと良い方法があるよって方は教えていただけると助かります！

卒論やんなきゃ、、、
分数の足し算を整数÷整数にしようとしたら余計な工夫だった Codeforces Round #614 Div2 B.JOE is on TV!

https://codeforces.com/contest/1293/problem/B

# 反省
分数の演算に対して、誤差が怖かったので工夫しようとしたところ、工夫は不要でありTLEした件。

# 題意

```
最初、あなたちn人の人がいてゲームをしている。このゲームは何ターンかに分けて勝負をおこなう。
あなたは絶対ゲームに勝つ。
毎ターン、残っているs人のうちt人が負けることになるが、そのたびにあなたは(絶対勝つので)t/sドルをもらえる。(毎ターンのtは毎回変えても良い)
制約: 1<= n <= 100000
誤差は10^-4まで許容される
```

# 考え方
この問題は、紙に書いてみるとわかるが、毎回1人ずつ敗退するのが良い。例えば4人いるなら、
$$ \frac{1}{4} + \frac{1}{3} + \frac{1}{2} + \frac{1}{1} $$
となるのが良い。

# (誤った)解法: 
これをn=100000で行うと、
$$ \frac{1}{100000} + \frac{1}{999999} + ... + \frac{1}{2} + \frac{1}{1} $$
となり、小数の誤差が大きくなることを恐れた。このため、n=4とすると、

```math
\frac{1}{4} + \frac{1}{3} + \frac{1}{2} + \frac{1}{1} =
\frac{(3\times 2\times 1) + (4\times 2\times 1) + (4\times 3\times 1) + (4\times 3\times 2)}{4\times 3\times 2\times 1}
```

のように、1回の整数÷整数にしようと思い、以下のようにしたがTLE。

```Python
import math
n = int(input())
base = math.factorial(n)
ab = 0
for i in range(1, n + 1): 
    ab += base // i # baseはn!なのでiを割ればn!/iと同値
print(ab / base)
```

調べてみると、

```Python
import math
%%time
math.factorial(1000)
> Wall time: 0 ms
math.factorial(10000)
> Wall time: 6.95 ms
math.factorial(100000)
Wall time: 421 ms # 階乗の計算だけで500ms
len(str(math.factorial(100000)))
> 456574 # 45万桁の整数
%%time
math.factorial(100000)//2 
Wall time: 401 ms # 100000! // 2の1つの式ですら400ms
```
https://codeforces.com/contest/1293/submission/69160191

の通り、100000!の階乗はとても大きな数になり、計算に大きな時間が必要になる。

# 解法: 
`誤差は10^-4まで許容` がすべてのポイントで上記のように無駄な工夫をせず、単純に計算すればよかった。

```Python
n = int(input())
res = 0
for i in range(1, n+1):
    res += 1 / i
print(res)
```
https://codeforces.com/contest/1293/submission/69189165
sympy,wolframalphaで「センター試験2020 数学II第1問 配点30[1] (1)(2)」(三角関数) をやってみたい

何かいい方法ないですか?

(参考)数学II・数学Ｂ問題
https://www.asahicom.jp/edu/center-exam/shiken2020/pdf2c49z2id/suugaku2_01.pdf
(参考)センター試験解答速報2020＜予備校の東進 ＜「基本的な内容である。」そうです。
https://www.toshin.com/center/sp/

#wolframalphaでやってみたい
アイウ=====================
?

エ=======================
?

オカキク================
sin(x)>sqrt(3) cos(x - π/3),0<=x<2*π
https://www.wolframalpha.com/input/?i=sin%28x%29%3Esqrt%283%29+cos%28x+-+%CF%80%2F3%29%2C0%3C%3Dx%3C2*%CF%80&lang=ja
--->(2 π)/3<x<(5 π)/3

ケコサシ===============
25*c**2-35*c+k=0,25*s**2-35*s+k=0,c**2+s**2=1,0<=c<=1,0<=s<=1
https://www.wolframalpha.com/input/?i=25*c**2-35*c%2Bk%3D0%2C25*s**2-35*s%2Bk%3D0%2Cc**2%2Bs**2%3D1%2C0%3C%3Dc%3C%3D1%2C0%3C%3Ds%3C%3D1&lang=ja
--->c = 3/5, k = 12, s = 4/5
--->c = 4/5, k = 12, s = 3/5
--->c = 1/sqrt(2), k = 35/sqrt(2) - 25/2, s = 1/sqrt(2)

25*c**2-35*c+12=0,25*s**2-35*s+12=0,c**2+s**2=1,0<=c<=1,0<=s<=1,s>=c
https://www.wolframalpha.com/input/?i=25*c**2-35*c%2B12%3D0%2C25*s**2-35*s%2B12%3D0%2Cc**2%2Bs**2%3D1%2C0%3C%3Dc%3C%3D1%2C0%3C%3Ds%3C%3D1%2Cs%3E%3Dc&lang=ja
--->c = 3/5, s = 4/5

ソ=====================
25*cos(t)**2-35*cos(t)+12=0,25*sin(t)**2-35*sin(t)+12=0,0<=t<=pi/2,sin(t)>=cos(t)
wolframalpha.com/input/?i=25*cos%28t%29**2-35*cos%28t%29%2B12%3D0%2C25*sin%28t%29**2-35*sin%28t%29%2B12%3D0%2C0<%3Dt<%3Dpi%2F2%2Csin%28t%29>%3Dcos%28t%29&lang=ja
--->t = 2 tan^(-1)(1/2)

2 tan^(-1)(1/2)*180/pi
https://www.wolframalpha.com/input/?i=2+tan%5E%28-1%29%281%2F2%29*180%2Fpi&lang=ja
--->53.130....

180/4
--->45

180/3
--->60


#Sympy onlineでやってみたい
(参考)SymPy Live
https://live.sympy.org/

アイウ==================================
simplify(sqrt(3) *cos(x - pi/3)-sin(x)) 
print(expand(sqrt(3) *cos(x - pi/3), trig=True))
--->3*sin(x)/2 + sqrt(3)*cos(x)/2

エ======================================
simplify(sqrt(3) *cos(x - pi/3)-sin(x)) 
print( simplify(sqrt(3) *cos(x - pi/3)-sin(x)) )
--->sin(x + pi/3)

オカキク=================================
solve(sin(x + pi/3)<0)
print(solve(sin(x + pi/3)<0))
--->(2*pi/3 < x) & (x < 5*pi/3)

ケコサシ==================================

ソ========================================



#Sympy pythonでやってみたい
作業中
bundle update（undefined method `new_ostruct_member' for #<Config::Options> (NoMethodError)のエラー発生時）

###事象
```rails 6.0``` ```ruby2.7```の環境
setting.ymlに定数を定義して```rails s ```したところ
以下のエラーが発生
（ユーザ名）/.rvm/gems/ruby-2.7.0/gems/config-2.1.0/lib/config/options.rb:180:in method_missing': undefined method new_ostruct_member' for #<Config::Options> (NoMethodError)

###対応
```
bundle update
```
→config 2.2.1 になればOK

###参考
https://github.com/rubyconfig/config/issues/259
cmdでpowerline風の表示にする方法

#環境

```
CPU :Intel Celeron N3160 Quad Code(1.60Ghz)
GPU :Intel HD graphics 400
OS  :Microsoft Windows 10 Home(1909)
```

# 大まかな流れ
- powerline対応のフォントをいれて、cmdに適応
- promptコマンドをスタートアップとかにいれる

# 方法
## フォント導入
https://github.com/pomutemu/milly/blob/master/Myrica-MM.ttf
をDLしてください
そのあと、このmyrica-mm.ttfをダブルクリックしてインストールしてください
筆者は、インストールしてしまっているので画像を見せることはできません
## cmdへの適応
まず適当にcmdを開いてください
次に、適当にタイトルバーで右クリックしてください、そして限定地を押してくださいそれでフォントタブに切り替えてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397553/9c7d63b3-8f58-ebd0-0dee-dbf48c6ff652.png)
このような感じだと思います
それでMyricaMMに切り替えてください
たいていの場合、Consolasの下の下の・・・にあると思います
そしたらOKを押してください
## promptコマンド

```
prompt $E[1m$E[46m$E[37m$P$E[m$E[40m$E[36m$E[m$E[m$_$$$S
```
Powerline対応フォントを導入しているので、このコマンドでたぶん、powerline風になると思います

#ちょっと番外変
適当に、batファイルを作成して
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Command Processor\Autorun
にbatファイルへのパスを入れとくとそのbatファイルが自動実行されます
なので、このbatファイルに先述した、promptコマンドを入れとくと起動したらすぐpowerlineになります
ほかにもpath通したりすると便利かもしれませんね
という僕は、AutoRun使ってません
TelloをUnityでC#するときWifiでまとめたかった@EDU

EDU版だとWifiに紐付けらるようなので、やって見たメモ
やりたかったことはほぼ失敗で。。

###理想的にはWifiルータで接続をまとめたかった。。

- バッファローのWifiルータを使ってローカLANを用意（AP設定でインターネット接続）
![NoName_2019-11-13_14-53-24_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/def4008e-fc7f-87ad-5254-667227b0c74b.png)
![NoName_2019-11-13_14-52-35_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/e0f72b81-3ddf-da94-710f-691250d073ea.png)

- TelloEDUにWifi接続を設定
https://qiita.com/mmt/items/d2f3005d0b140679dc23
- EDUは通信の準備OKなオレンジ点滅するが、Wifiの管理画面にはIP割当されない、、
- Wifi管理画面から、MACアドレス入れてIP割り振りでも表示されない状態。。

- 社用のルータにした場合はIP割り振りされて動作ができた


Wifiルータの設定が悪い　OR　機器の相性が悪い　が原因かも
ルータの設定を調べる時間ないので、ドングル接続を試みる

###最終的にはWifiドングルで接続

ドングルでWifi直接アクセスで通信するようにしました。。
【Ruby】３文字の時だけ「遊☆戯☆王」みたいに出力されるアルゴリズム

# はじめに
最近、遊戯王のゲーム実況をみながら寝落ちするのが日課です。
ある日、Rubyいじってたら、な　ぜ　か　「遊☆戯☆王」みたいに文字の間に☆入れたいなーって思ったんです。
こんなことをアルゴリズムの記事とか言って書いている自分のアルゴリズム、コレガワカラナイ。

# 問題のソースコード
```ruby
keywords = ["遊戯","海馬","木馬","羽蛾","城之内","本田","杏","エクゾディア"]

keywords.each do |keyword|
    sleep 0.2 # １行だすごとに一旦休憩する（なんとなく）
    if keyword.length == 3 #３文字であればの判定をしている
        k = keyword.chars #1文字ずつ分割する
        puts k.join("☆") #文字を☆でつなぐ（オサレ）

    else
        puts keyword #３文字出ない場合はそのまま表示
    end
end
```
出力するとこんな感じになります。

```console
遊戯
海馬
木馬
羽蛾
城☆之☆内
本田
杏
エクゾディア
```
３文字の城之内くんだけが☆入っていますね。

# 他の文字列でもやってみました
![c6ca66de06b258395b100fc7e578dfd5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/b5ec0d8c-e1f7-a664-2af3-75af8013337f.gif)

151匹を出力してみました。
名前が３文字のポケモンだけ☆が入っていますね。
**ポ☆ッ☆ポ**、**ピ☆ッ☆ピ**はパワーワードに見えますね。

たくさんの文字列精査して☆入れたいときには、CSVに入れるのが便利です。

## CSVから文字列を持ってくるときのソース

```ruby
require "csv" #csvを使用する場合はこのコードを書く

keywords = []

# csvから情報を持ってきて配列に入れる
CSV.foreach("keywords.csv") do |keyword|
    keywords << keyword[0]
end

keywords.each do |keyword|
    sleep 0.2
    if keyword.length == 3
        k = keyword.chars #1文字ずつ分割する
        puts k.join("☆") #文字を☆でつなぐ（オサレ）
    else
        puts keyword
    end
end

```
※コメントにてスッキリした書き方教えていただきました！

``keywords.csv``は同階層に置き、そのCSVのA列を上から順に読み込んで、３文字チェックをかけています。
この```keyword[0]```の部分でどの列から持ってくるかを判定しています。

|/|A|B|
|:-----------------|:------------------:|:------------------:|
||[0]|[1]|
|1|フシギダネ|くさ・どく|
|2|フシギソウ|くさ・どく|
|3|フシギバナ|くさ・どく|
|4|ヒトカゲ|ほのお|
|5|リザード|ほのお|
|6|リザードン|ほのお・ひこう|

上記のような感じで、```[０]```はA列、```[1]```はB列から情報を持ってきます。
タイプを文字数判定したかったら```keyword[1]```として引っ張ります。

## 参考記事
[RubyでCSVファイルの読み込み・書き込みをする](https://uxmilk.jp/19202)


# 文字数をうまく判定できないときには
CSVファイルに、見えないけれど存在する、封印されし文字列が入っている可能性があります。
そのため、下記の方法でCSVファイルから封印されし文字列を墓地へ送りましょう。

## 参考記事
[UTF-8 のファイルから BOM を削除する方法](https://support.sugutsukaeru.jp/ja/tutorials/installation/214.html)
Python用QualityForward SDKを使ってテストフェーズを作成する

[QualityForward](http://bit.ly/37wevTW)はクラウドベースのテスト管理サービスです。APIを公開しており、テスト管理に関するデータのCRUD操作ができるようになっています。SDKとしてはNode.js、Python、そしてGoogle Apps Scriptを作成中です。

Python SDKについてはデータの取得系は一通り実装されています。今回はデータの追加、テストフェーズの作成について紹介します。

## QualityForward用Python SDKを使う

Python SDKは[goofmint/qualityforward-py: QualityForwardのPythonライブラリです](https://github.com/goofmint/qualityforward-py)にて公開しています。まだpipなどでは公開していません。

## 初期化

初期化はAPIキーを適用して行います。

```py
q = QualityForward("0aa...340") # APIキー
```

## テストフェーズの作成

まずテストフェーズオブジェクトを作成します。

```py
tq = q.TestPhase()
```

## 値を設定する

次に値を設定します。プロジェクトID、名前、開始日、終了日は必須です。

```py
tq.set('project_id', 748)
tq.set('name', 'Redmine連携テストフェーズ')
tq.set('start_on', '2020-01-18')
tq.set('end_on', '2020-03-21')
```

さらに例えばBTS連携としてRedmineを用いる場合には次のように登録します。

```js
tq.set('bug_tracking_system', 'redmine')                   // redmineまたはjiraを指定
tq.set('redmine_base_url', 'https://example.com')          // ベースURL
tq.set('redmine_issues_url', 'https://example.com')        // バグ曲線、グラフデータ取得用URL
tq.set('redmine_latest_issues_url', 'https://example.com') // 最近のインシデント取得用URL
```

## テストスイートバージョンを登録する

テストフェーズと連携するテストスイートバージョンを指定します。これは複数登録可能です。

```js
ts = q.TestSuiteVersion();
ts.set('id', 13290);
tq.add_test_suite_version(ts);
```

## 保存する

最後に保存します。問題があればエラーが発生するので、try〜exceptで捕捉できます。

```js
tq.save()
print(tq.id)
```

## まとめ

既存のシステムからテストケースを移行する際にAPIを利用できます。入力が面倒な場合、APIを使えば一気に処理できますので、Pythonを社内システムで使っている場合には試してみてください。

[QualityForward](http://bit.ly/37wevTW)
Oracle Database XE導入手順纏め

#####【導入環境】
Oracle Linux 7
###・Oracle Database XE取得
(取得先)
https://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/index.html
ここでは、oracle-database-xe-18c-1.0-1.x86_64.rpm取得を想定
###・プレインストール取得(OL7用)
プレインストール導入プログラム
\# curl -o oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm
###・プレインストール導入
\# yum -y localinstall oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm
###・Oracle Database XEインストール
\# yum -y localinstall oracle-database-xe-18c-1.0-1.x86_64.rpm
###・Oracle Database XEデータベースインスタンス作成
\# /etc/init.d/oracle-xe-18c configure

必要入力項目：

- SYS, SYSTEM and PDBADMINパスワード
- ホストアドレス、ポート番号
- CDB,PDB名

###・DB起動停止(OL7用)
(起動)
\# systemctl start oracle-xe-18c
(停止)
\# systemctl stop oracle-xe-18c
(再起動)
\# systemctl restart oracle-xe-18c
ArchLinuxでNTFSの読み書きを行う

# パッケージ入れる

```bash
sudo pacman -S ntfs-3g
```

# fstab書く
typeのところに`ntfs-3g`と書く。
これは読み書きを行うため。

optionの最後に`uuid=1000`と書く。
これはゴミ箱を使うため。

# こうなった
UUIDなどは環境依存です。

```/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sdb5
UUID=08dd01ce-222f-4fa7-b4f2-338b38380b6c	/         	ext4      	rw,relatime	0 1

# /dev/sdb6
UUID=1b311a66-9ece-4245-95b5-e133881454a4	none      	swap      	defaults  	0 0

# Swapfile
/swapfile                               	none      	swap      	defaults  	0 0

# UUID=1ED82F72D82F477D /mnt/Windows10 ntfs-3g nosuid,nodev,nofail,x-gvfs-show 0 0
# UUID=01D4C6937BFB5CB0 /mnt/HDD-1 ntfs-3g nosuid,nodev,nofail,x-gvfs-show 0 0


UUID=1ED82F72D82F477D /mnt/Windows10 ntfs-3g nosuid,nodev,nofail,x-gvfs-show,uid=1000 0 0
UUID=01D4C6937BFB5CB0 /mnt/HDD-1 ntfs-3g nosuid,nodev,nofail,x-gvfs-show,uid=1000 0 0
```
【画像処理100本ノックに挑戦】Q.36. JPEG圧縮 (Step.1)離散コサイン変換

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)

# Q.36. JPEG圧縮 (Step.1)離散コサイン変換
> imori.jpgをグレースケール化し離散コサイン変換を行い、逆離散コサイン変換を行え。

問題文に示されている式だとうまく出来なかったので自分でWikipediaのDCT-II、DCT-IIIの式を用いて計算しました。問題文ではグレースケール化して、とのことでしたが、正解画像はカラーであることからRGBそれぞれについてDCT/IDCTしました。

```c++
std::vector<std::vector<double>> dct2d(const std::vector<std::vector<double>>& x, int M, int N)
{
	std::vector<std::vector<double>> ret(M, std::vector<double>(N));
	for (int m = 0; m < M; m++)
		for (int n = 0; n < N; n++)
		{
			ret[n][m] = 0;
		}
	for (int k = 0; k < M; k++)
		for (int l = 0; l < N; l++)
		{
			for (int m = 0; m < M; m++)
				for (int n = 0; n < N; n++)
				{
					ret[k][l] += x[m][n] * cos(pi / M * (m + 0.5) * k) * cos(pi / N * (n + 0.5) * l);
				}
		}
	return ret;
}

std::vector<std::vector<double>> idct2d(const std::vector<std::vector<double>>& x, int M, int N)
{
	std::vector<std::vector<double>> ret(M, std::vector<double>(N));
	for (int m = 0; m < M; m++)
		for (int n = 0; n < N; n++)
		{
			ret[n][m] = 0;
		}
	for (int k = 0; k < M; k++)
		for (int l = 0; l < N; l++)
		{
			double a, b;
			for (int m = 0; m < M; m++)
				for (int n = 0; n < N; n++)
				{
					if (m == 0) a = 0.5;
					else a = cos(pi / M * m * (k + 0.5));
					if (n == 0) b = 0.5;
					else b = cos(pi / N * n * (l + 0.5));

					ret[k][l] += x[m][n] * a * b / (M * N / 4.);
				}
		}
	return ret;
}

int main()
{
	PPM ppm("imori.pnm");
	int M = ppm.Get_width();
	int N = ppm.Get_height();

	char c[3] = { 'r','g','b' };
	PPM ppm2(M, N);

	for (int color = 0; color < 3; color++)
	{
		std::vector<std::vector<double>> f(M, std::vector<double>(N));
		for (int j = 0; j < N; j++)
			for (int i = 0; i < M; i++)
			{
				f[i][j] = ppm(i, j, c[color]);
			}

		std::vector<std::vector<double>> f2(M, std::vector<double>(N));
		int w = 8, h = 8;
		for (int I = 0; I < M / w; I++)
			for (int J = 0; J < N / h; J++)
			{
				std::vector<std::vector<double>> in(w, std::vector<double>(h));
				for (int i = w * I; i < w * I + w; i++)
					for (int j = h * J; j < h * J + h; j++)
					{
						in[i - w * I][j - h * J] = f[i][j];
					}
				auto out = dct2d(in, w, h);
				auto in2 = idct2d(out, w, h);
				for (int i = w * I; i < w * I + w; i++)
					for (int j = h * J; j < h * J + h; j++)
					{
						ppm2(i, j, c[color]) = in2[i - w * I][j - h * J];
					}
			}
	}
	ppm2.Flush("in.pnm");
	return 0;
}
```
![imori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/7ab58889-fe7a-3527-ed3e-1ccb9e292a89.png) ![in.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/1d97cde1-426e-0940-6e8f-49453931c81a.png)
phpbrewでCatalinaにPHP v7.0.xをインストールする

PHP 7.0系でしか動かないシステムをmacOS Catalinaで動かすためにphpbrewでv7.0をインストールしたかった

```
brew install bzip2 zlib openssl@1.1
phpbrew install 7.0 +default+zlib=$(brew --prefix zlib)+openssl=$(brew --prefix openssl@1.1)
```

macOSの `openssl version` のデフォルトがLibreSSLになってるので、7.0のコンパイルエラーが出る。`openssl@1.1` を指定する。

```
❯ phpbrew list 
* (system)
  php-7.0.17 
```

```
❯ phpbrew use php-7.0.17
❯ php -v                                                                                                                             PHP 7.0.17 (cli) (built: Jan 20 2020 19:12:39) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
```

php-7.0.17 が使えることを確認
書籍「15Stepで踏破 自然言語処理アプリケーション開発入門」をやってみる - 2章Step03メモ「形態素解析とわかち書き」

# 内容
[15stepで踏破 自然言語処理アプリケーション入門](https://www.amazon.co.jp/dp/4865941320) を読み進めていくにあたっての自分用のメモです。
今回は2章Step03で、自分なりのポイントをメモります。

# 準備
- 個人用MacPC：MacOS Mojave バージョン10.14.6
- docker version：Client, Server共にバージョン19.03.2

# 章の概要
MeCabの動作を理解し、チューニングしてみる。
また、MeCab以外の形態素解析器についても確認する。

# 03.1 MeCab
## 辞書
MeCabによるわかち書きは、辞書に基づいて行われる。
辞書にはMeCabを使った形態素解析から得られる情報は、辞書にどのような情報が登録されているかに依存し、辞書によって登録されている情報が異なる。

|辞書名  |内容  |
|---|---|
|IPAdic  |・MeCabが公式に推奨している辞書<br>・IPAコーパスというデータに基づく  |
|UniDic  |・UniDicというデータに基づく<br>・分割される単位が小さく、厳密な「形態素解析」に近い  |
|jumandic |・MeCabとは別のJUMANという形態素解析器で使われている辞書のMeCab移植<br>・京都コーパスというデータに基づく<br>・代表表記などのメタ情報が付与されている |
|ipadic-NEologd |・IPA辞書を元に、単語の数を大幅に拡張<br>・インターネットから単語をクローリングして語彙を頻繁に拡張しており、新語への対応力がとても高い<br>・**正規化を前処理として行うことが推奨されている** |
|unidic-NEologd |・ipadic-NEologd同様、UniDicを元に単語拡張を施した辞書 |

## ipadic-NEologdのインストールと実行
IPAdicとipadic-NEologdの違いとしては、例えば「Deep Learning」（割と新しい単語）という単語の解析が異なる。

- IPAdic：「Deep」と「Learning」で分割される
- ipadic-NEologd：「Deep Learning」の1単語で扱われる

## MeCabの形態素解析の動作
辞書が保持しているのは実行結果のような形態素に関する情報だけでなく、下記の様々な情報を保持している。

- 各単語の生起コスト
- 各単語の左文脈ID
- 各単語の右文脈ID
- 文脈IDの各組み合わせの連接コスト

与えられた文章に対して、生起コストと連接コストの組み合わせが最小になる組み合わせを解析結果とする。（下記の例では「東大阪 大好き」と分割した際のコストが（最）小さいので、これが解析結果となる）

```bash:例）「東大阪大好き」
# 「東大阪 大好き」と分割する場合
文頭と「東大阪」の連接コスト
「東大阪」の生起コスト
「東大阪」と「大好き」の連接コスト
「大好き」の生起コスト
「大好き」と文末の連接コスト

# 「東大 阪大 好き」と分割する場合
文頭と「東大阪」の連接コスト
「東大」の生起コスト
「東大」と「阪大」の連接コスト
「阪大」の生起コスト
「阪大」と「好き」の連接コスト
「好き」の生起コスト
「大好き」と文末の連接コスト
```

# 03.2 MeCab辞書の改造
既存の辞書だけで期待した結果が得られない場合は、自分で辞書をチューニングする。

- 新語の追加
- 形態素解析の調整

## MeCab辞書のビルド
```bash
# ソースファイルのエンコードをUTF-8に変換
$ nkf --overwrite -Ew ./mecab-ipadic-2.7.0-20070801/*

# 辞書をビルド
$ mkdir build
$ $(mecab-config --libexecdir)/mecab-dict-index -d ./mecab-ipadic-2.7.0-20070801 -o build -f utf8 -t utf8
$ cp mecab-ipadic-2.7.0-20070801/dicrc ./build/. # dicrcをコピー
```
nkfは「Network Kanji Filter」の略。

# 新語の追加
```bash:ソースファイルのディレクトリにcsvファイルを作成する
# 表層形、左文脈ID、右文脈ID、生起コスト、品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用型、活用形、原型、読み、発音

# 自然言語処理を追加したい場合
自然言語処理,1288,1288,0,名詞,固有名詞,一般,*,*,*,しぜんげんごしょり,シゼンゲンゴショリ,シゼンゲンゴショリ
```

# 形態素解析の調整

1. 連接コストを調整する
    2. .csvから対象単語の文脈IDを探す
    3. matrix.defで対象文脈IDの連接コストを修正する
2. 生起コストを調整する
    3. .csvの対象単語の生起コストを修正する

ただし上記コストを修正する場合は、**意図した部分以外の結果にも影響を与えかねないので注意**する。

コストを自動調整する手法も用意されているようだが、**修正したい部分のコストをピンポイントで手動で調整する方が、影響範囲を小さく抑えられる**傾向がありそう。

# 03.3 様々な形態素解析器
MeCab以外の形態素解析器について概要を把握しておく。

|形態素解析器 |内容 |
|---|---|
|MeCab |・辞書に基づく<br>・辞書には、単語と生起コスト、連接コストの情報が含まれる<br>・実行速度が速い<br>・辞書が外部ファイル化されているので、必要に応じてカスタマイズできる |
|JUMAN++ |・ニューラルネットワークを利用した比較的新しい形態素解析器<br>・文法的な正しさだけでなく、単語の意味を考慮<br>・ある語の前にある全ての語の情報を考慮<br>・表記ゆれに対応<br>・MeCabより優れている点が多いが、実行速度は劣る |
|KyTea(キューティー) |・ある文字と次の文字の間が単語の区切りであるかどうかを、その前後数文字を元にSVMで予測する<br>・Pythonラッパーがサードパーティから提供されている |
|Janome |・Pythonのみで書かれている<br>・IPA辞書が組み込まれていたり、Pythonから扱えるAPIが提供されている<br>・実行速度が遅い<br>・辞書の選択肢が限定される |
|SudachiPy |・Java用形態素解析SudachiのPythonバインディング<br>・2019年5月時点では正式リリースはま[(もう正式リリースされた？)](https://github.com/WorksApplications/SudachiPy) |
|Esanpy(Kuromoji) |・KuromojiはJavaで実装された形態素解析器<br>・Pythonから使う場合、Esanpyを通す<br>・EsanpyはElasticsearch（全文検索エンジン）を内部で利用するテキスト解析ライブラリ |
CSSで文字をもっと読みやすく工夫しませんか！？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237833/42be7a5d-d14c-3781-63bd-8c15325653e8.png)


## 一番重要なのは“文字の読みやすさ”

Webサイトやブログ、様々なサイトがインターネットのなかには溢れていますが、その中でもやはり一番みられるのは文章だと思っています。

書籍では文字は一番の重要度であったため、様々な工夫が凝らされていたように、Webでもその点を重要視してみるのは、原点に立ち返ることにも含まれるのではないでしょうか？

## 日本語ベースに考えるフォント

Webでは、大体のベースが英字になっているため日本語に置き換える必要があります。

例えばフォント。Windowsがその最たる例ですが、確実に日本でシェアを獲得しているのに、日本語のフォントを基本的に重要視していない気がします。ここでCSSで指定することが重要です。

僕のよく使っている font-family はこれです。

```css
font-family:
     -apple-system,BlinkMacSystemFont,Helvetica Neue,Segoe UI,Hiragino Kaku Gothic ProN,Hiragino Sans,ヒラギノ角ゴ ProN W3,Arial,メイリオ,Meiryo,sans-serif;
```

基本的なOSごとのフォントを抑えたシンプルなものになっています。

Windowsとmacには游ゴシックが搭載されていますが、文字のデザイン上読みにくい気がして、導入していません。しかもmacとWindowsの游ゴシックは同じものではなく、デザインもベースラインも異なる全く別物なため、使おうとすると相当なテコ入れが必要です。

### フォントをこだわるなら「Adobe Typekit Webフォント」

よく、Webで日本語フォントを使う際にGoogle Fontsからインポートする例がありますが、日本語フォントは英字フォントと異なり、容量が大きすぎるため、モバイルでの動作や、ユーザビリティを考えると使ってはいけない代物です。

そこで、Adobeが提供しているWebフォント、「Typekit Webフォント」をお勧めします。

[https://fonts.adobe.com/typekit](https://fonts.adobe.com/typekit)

Typekitの日本語フォントのほとんどでは、JavaScript経由で表示されている文字のみのフォントを読み込む「ダイナミックサブセット」を導入しているため、非常に軽量にフォントを適用することができます。

**ダイナミックサブセットと Web フォント提供**

[https://helpx.adobe.com/jp/fonts/using/dynamic-subsetting.html](https://helpx.adobe.com/jp/fonts/using/dynamic-subsetting.html)

## CSSでカーニング

Webでは、和文フォントは等幅で表示されています。

書籍では文字の間手動で修正するのが一般的ですが、Webでは一般化する必要があるため、手動でのカーニングをすることはできません。

ですが、CSSでも字間を修正する方法は存在します。

画面に対する文字の大きさで調整する必要がありますが、今回は例として私のポートフォリオで使用しているものをご紹介します。

```css
font-feature-settings: "palt" 1;
letter-spacing: .11em;
```

### font-feature-settingsについて

font-feature-settingsは、OpenTypeフォントの機能を使うことができるようになるCSSプロパティです。

詳しい内容については省略しますが、この機能を使うことによってOpenTypeに内蔵されているフォントの字間情報を制御する「プロポーショナルメトリクス」を使用して、カーニングを自動的に行うことができるというわけです。

詳しい内容についてはこちらの記事がとても参考になります。

[https://ics.media/entry/14087/](https://ics.media/entry/14087/)

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237833/7ce60188-8877-f4b1-0fb2-9d2e41ab6a55.png)

>**出典**：文字詰めできるCSSのfont-feature-settingsが凄い！日本語フォントこそ指定したい自動カーニング

[https://ics.media/entry/14087/](https://ics.media/entry/14087/)

## まとめ

フォント、カーニングを意識することによって、あなたのブログやサイトをもっと、読みやすく、一つグレードの高くなったサイトへと変貌させられるはずです。

これを期に、文字を再意識してみませんか？

---

話題のNotion Blogで作ったブログの方にも掲載しているので、ご確認いただくとありがたいです！！
[https://blog.yahiro.me/css-readable-text](https://blog.yahiro.me/css-readable-text)

---
このような記事をどんどん作っていきたいと思っているので、
**Twitterのフォロー**をしていただけるとありがたいです！！
[Twitter @Yahimotto](https://twitter.com/Yahimotto)
Codeforces Round #614 Div2 A.ConneR and the A.R.C. Markland-N

https://codeforces.com/contest/1293

# 反省

問題を読んでおらず、必要な実装(解法2)に対して、明らかに重い実装(解法1)をしてしまったので自戒。

# 題意
問題はとてもシンプルだが、まとめると以下の通り。

```
n階建ての建物があり、すべての階にはレストランがある。
あなたのオフィスはs階にある。
ところが、k個の階でレストランが工事中である。
一番近い回転中のレストランとは何フロア離れているか？
※1: k <= 1000
```

In/Outの例を見ると、

```
n,s,k = 100 76 8
kの配列 76 75 36 67 41 74 10 77
```

100階建ての建物があり、オフィスは76階であり、工事中の階は(sortして) `10 36 41 67 74 75 76(オフィス) 77` 。
オフィスの上の階で一番近いのは78階、下で近いのは73階になるので、78階に向かえばよく、`2`が答えになる。

# 解法1: ソート済みの配列を前後に探索

単純に上記で述べた実装をする。以下の図がイメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/80b6b5bf-1370-64b7-8b82-967d1b96dfec.png)

```
1. kの配列をソートし、sの位置を知る。
 　　尚、sが存在しない場合、答えは`0`(移動しなくていい)である。)
2. 配列を左方向に見る。差が1である限り左に進んでいく。
3. 差が1よりも大きい場合、その間のレストランはすべて開いているので、一番sに近い階が下に降りた場合に最も近いレストランである。
　　（図では76から下り、74の次は67であるため、68-73階のレストランは空いている）
4. 2,3において、下に降りても開いているレストランが存在しないことがある。
　　(例えば、2階にオフィスがあり、1,2階のレストランが閉まっている場合、下に答えはない)
5. 上記を同様に右方向（上側）にも探索する
6. 上にも下にも候補となるレストランがあるならminをとり、片方がしか候補がないならそれを答えとする
```

これを実装したものが以下。

```Python
q = int(input())
for qq in range(q):
    res = -1
    n, s, k = map(int, input().split())
    dat = list(map(int, input().split()))
    dat = list(set(dat)) # 題意的にある階がリストに複数回含まれる時の対策 [2,2,3]等
    dat.sort()
    if s not in dat: # もし、sがリストにないなら、sの階のレストランは開いている
        print(0)
        continue
    ind = dat.index(s) # sの入っているインデックスを取得
    r = l = -1 # 下方向(l)も上方向(r)も見つかっていないことにする
    # 上方向の探索
    for i in range(ind + 1, len(dat)): # sの一つ上のインデックスから最上階まで探索
        if (dat[i] - dat[i - 1]) != 1: # もし、差が1出ないなら
            r = dat[i - 1] + 1 # 上向きはその区間の一番低い階が候補
            break
    if r == -1 and dat[-1] != n: # もし、連続した階しかなく、しかし、リストの最後が最上階でないなら
        r = dat[-1] + 1 # リストの一番上の階の上が候補となる

    # 同様の処理を下方向にも行う
    for i in range(ind - 1, -1, -1):
        if (dat[i + 1] - dat[i]) != 1:
            l = dat[i + 1] - 1
            break
    if l == -1 and dat[0] != 1:
        l = dat[0] - 1
        
    if r == l == -1: # 題意より開いているレストランがないことはない()
        print("ERROR")
    elif r == -1: # 上方向に候補がないなら
        print(s - l) # 答えは下方向
    elif l == -1: # 下方向に候補がないなら
        print(r - s)
    else: # 上も下も候補があるなら差が小さいほう
        print(min(s - l, r - s))
```
https://codeforces.com/contest/1293/submission/69184081

# 解法2: ソートもせずに単にリストを探索する
この問題の説明に書いたが、そもそもこの問題でレストランが閉じているリストの最大値は1000である(※1の通り)。
このため、sを中心に500階分リストに存在するか確認すればよい。

1000要素のリストに対する500回程度の探索なので、ソート＆二分探索もいらない。ということで、以下でAC。

```Python
q = int(input())
for qq in range(q):
    n, s, k = map(int, input().split())
    dat = list(map(int, input().split()))
    res = 0 # オフィスの位置からのdelta
    while True:
        if (s + res) not in dat and (s + res) <= n: break # 上方向
        if (s - res) not in dat and (s - res) >= 1: break # 下方向
        res += 1
    print(res)
```
https://codeforces.com/contest/1293/submission/69186624
[WPF/xaml] 上にかぶせたTextBlockを通り抜けて下のボタンがClickイベントを取れるようにする(IsHitTestVisible)

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
何かのコントロールの上にTextBlockをかぶせて文字を表示させるが、TextBlockを素通りしてその下のコントロールのClickイベントなどを受けたい。

例えば、なにかエラーメッセージを半透明のTextBlockで表示はするが、その下のコントロールではいつも通りClickイベントやらドラッグイベントやらを取りたい。
(＝上にかぶせたらその部分だけ押せなくなる、というのを回避したい)

# やり方

コントロールの`IsHitTestVisible`をfalseにしてやる。
そうすると、そのコントロールのクリックやドラッグなどのイベントが起きなくなり、クリックしたときにはその下のコントロールのイベントが起きるようになる。
(文字だけ見えて実体がないような、幽霊な感じになる)

```MainWindow.xaml
<Window x:Class="WpfApp39.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp39"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid Background="Azure">
        <!-- ボタン(押したらMsgBox出すようにButton_Clickに書いている) -->
        <Button Margin="100" Content="ボタン" Click="Button_Click" FontSize="50"/>

        <!-- IsHitTestVisibleをtrue/falseにしたTextBlock -->
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <!-- IsHitTestVisibleがtrue → あたり判定あり → 下のボタンは押せない -->
            <TextBlock Text="IsHitTestVisible = true" FontSize="50" Background="#66990099" IsHitTestVisible="True"/>
            <!-- IsHitTestVisibleがtrue → あたり判定なし → 下のボタンはを押せる -->
            <TextBlock Text="IsHitTestVisible = false" FontSize="50" Background="#66990000" IsHitTestVisible="False"/>
        </StackPanel>
    </Grid>
</Window>

```

上の`IsHitTestVisible`をtrueにしたTextBlockはイベントをとるため、TextBlockを押してもその下のボタンを押したことにはならない。

下の`IsHitTestVisible`をfalseにしたTextBlockはイベントを素通りするため、TextBlockを押すとその下のボタンをおしたことになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/e4a1da72-e0f9-868d-57a5-fb72fb96c591.png)
codecommitのPullRequestをredmineのチケットに連携する

概要
---
[これのシリーズもの](https://qiita.com/turbo5522mame/items/d5a7e126f993eb185d29)
codecommitでpullrequestしたときに、関連するredmineのチケットのコメントに通知を出したくてごにょごにょした記録。
手順にはなってませんが、ヒントにはなるかな、と。
こんな感じで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251329/0166898c-fe7e-8260-e997-edbebc4e1401.png)



やりたい構成図
---
ざっくりこんなかんじ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251329/4198e024-7d14-81a2-593a-81ff811cf828.png)



やったこと概要
---
### 前提
codecommitでブランチを切るときに必ずredmineのチケット番号を記載する運用ルールにしていたので、更新対象のチケット番号はブランチ名からとってくることにした

### redmine側の設定
##### APIを有効にする
- adminで入って「管理」→「設定」から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251329/11f3b5d6-a301-c7e0-0be2-f02d58a364bf.png)


  
  
### AWS側の設定
##### Lambdaの設定をする

- snsから通知されたメッセージを拾ってredmineのrestAPIをたたくpythonを書く
- [python_redmine](https://python-redmine.com/)を使えるようにLambdaLayerを設定した
- 参考にさせて頂いたサイトは[こちら](https://qiita.com/t_okkan/items/394a15577bd1aad46ec3)
- 宛先がオンプレサーバのためVPC経由で通信できるようにする必要があり、LambdaがVPC起動できるようにする

##### codecommitに通知ルールを設定し、codecommit上で何かイベントがあったときにSNSにメッセージが飛ぶようにする
- 今回は以下の設定とした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251329/deba179c-9e86-1aaa-bf17-ca7adad07b9e.png)



苦労した点
---
- snsから受け取ったデータ(jsonフォーマット)の中の"Message"はcodecommitが発したjsonだと思われ、ここから必要なものをredmineに投げたかったのだが、これを取得するのに難儀した。
- 以下のようにしたらいけた
※ここについていい方法やメカニズムがわかればぜひ教えてください

```python

    # このような取り出しをしたら「TypeError: string indices must be integers」になった
    # eventName = event['Records'][0]['Sns']['Message']['detail']['event']

    # どうも"Message"は単なるstringみたいなので、
    # 仕方ないので一度json形式に変換して必要なキーを取り出した

    Message_str = event['Records'][0]['Sns']['Message'] 
    Message = json.loads(Message_str)
    eventName = Message['detail']['event']
```



Lambdaのコード
---

```python
import json
from redminelib import Redmine
import re

def lambda_handler(event, context):
    
    # SNSのメッセージからcodecommitのメッセージを抜き出す
    # ただしstringになってしまうので、最後にjson.loadsをする
    Message_str = event['Records'][0]['Sns']['Message']
    Message = json.loads(Message_str)
    # print("Message " +str(Message))
    
    # redmineに投げるリクエストに必要な要素を取り出す
    branchName = Message['detail']['sourceReference'].split('/')[2]
    eventName = Message['detail']['event']
    notificationBody = Message['detail']['notificationBody']

    #print("branchName " +str(branchName))
    #print("eventName " +str(eventName))
    #print("notificationBody "+str(notificationBody))


    # redmineを更新する
    
    # 対象チケット番号をブランチ名から取得する
    m = re.search(r'#\d+', branchName)
    issueNo_str = str(m.group())
    
    # もしも対象チケット番号がなかったら処理しない、あったら処理する
    if issueNo_str:
        issueNo = int(issueNo_str[1:])
    
        redmine = Redmine('http://<redmineurl>/', username='admin', password='xxxxxx')
        issue = redmine.issue.get(issueNo)
        issue.notes = notificationBody
        issue.save()

        #print(issue)
        #print(issue.notes)
    


```
Docker MySQLのバージョン変更する方法

## はじめに

Docker MySQLのバージョンを **8.0** から **5.7** に下げる際に苦戦したので、一連の流れをまとめました。

[Laradock](https://laradock.io/)を用いてDocker上でLaravelを動かす環境を作成しました。

![docker-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367615/6f7abec3-2b08-37ca-a5b0-6939c02e7a03.png)


## MySQLバージョンを変更する一連の流れ


**laradock**にあるファイルのMySQLのバージョンを **5.7** に変更します。

```:.env
### MYSQL #################################################
MYSQL_VERSION=5.7
```

コンテナを停止し、**status** が **exited** になっているのを確認。
mysqlのコンテナを削除。

```

$ docker-compose stop
$ docker ps -a
$ docker rm コンテナID（mysql）
```
MYSQLのバージョンを変更する場合は、 **DATA_PATH_HOST** で設定したフォルダを削除して、イメージを作成し直す必要があるらしい。
そのフォルダは下記コマンドで参照出来る。

```
$ cat .env | grep DATA_PATH_HOST

DATA_PATH_HOST=~/.laradock-アプリ名/data (人によってバラバラ。)
```

そのフォルダを削除。

```
$ rm -rf ~/.laradock-アプリ名/data
```

次にイメージを削除するのだが、
「dataが削除されますがよろしいですか？」　的な確認文が恐らく出てくるので良ければ **y** で enter。


```
$ docker images
$ docker rmi イメージID(laradock_mysql) -f
```

キャッシュを消し再度ビルド。

```
$ docker-compose build --no-cache mysql
```

最後に　**status** が **up** になっているか。
なっていれば　**mysql** のバージョンを確認し **5.7系**になっていればOK。

```
$ docker ps -a
$ docker-composer exec mysql mysql --version
```

以上で、動くはずです。

Dockerを勉強し始めたばかりで、説明が大雑把なので
わかりにくい箇所や、疑問点など。
また、勉強する上で参考になったサイトや技術書など教えていただけると幸いです。
PyTorchのエラーメッセージ(エラーの原因を言うとは言ってない)

皆様PyTorchは使っていますか?
普段は便利ですが、たまに(ピー)したい時、ありますよね?

そう、エラーが出た時です。
そのエラーメッセージで検索するのが通例ですが、解決しない場合も往々にしてあります。

そんな不一致!(時のオカリナ風)を紹介、原因(のひとつ)を紹介したいと思います。


## RuntimeError: CUDA error: device-side assert triggered

たまに見ませんか?
githubからコードを持ってきて、別のデータセットとかで試してみると出る時があります。
「CUDAのエラーなんか直せない」?
違う原因の場合もあります。

このエラーメッセージより前に、なんか変なメッセージが大量に出てきませんか?

```
int, DstDim = 2, SrcDim = 2, IdxDim = -2, IndexIsMajor = true]: block: [117,0,0], thread: [92,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 2, SrcDim = 2, IdxDim = -2, IndexIsMajor = true]: block: [117,0,0], thread: [93,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 2, SrcDim = 2, IdxDim = -2, IndexIsMajor = true]: block: [117,0,0], thread: [94,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 2, SrcDim = 2, IdxDim = -2, IndexIsMajor = true]: block: [117,0,0], thread: [95,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
```

このようなエラーが見えたら、何かしらの上限値、あるいは下限値を調べてみましょう。
例えば、cross_entropyのクラス数よりも多い出力を用意していないでしょうか(1敗)?
入力、あるいは出力が想定したデータより長い事はないですか(1敗)?
nn.Embeddingの入力で想定したクラス数よりも大きい数字が入ってませんか(1敗)?


```python:test_error.py
# 注意! このコードはエラーが起こります。
# ご使用は自己責任でお願いいたします。
import torch                                                                                                                                                                                                                                
import torch.nn as nn                                                           
                                                                                
emb = nn.Embedding(2,1).cuda()                                                  
input_var = torch.tensor([4]).cuda().long() # 4 > (2+1)                                  
                                                                                
output = emb(input_var)
```

```
/pytorch/aten/src/THC/THCTensorIndex.cu:308: void indexSelectSmallIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 1, SrcDim = 1, IdxDim = -2]: block: [0,0,0], thread: [0,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
```


順次更新予定
Vue.js CSSプロパティを要素に付与する方法

この記事は初心者向け Vue.jsで複数のclassを付与する方法について記述した自分用メモになります。
誤っている点がありましたらご指摘をお願いいたします。

この記事は以下の方向けの記事となっております。

推定読者：
・v-bindの使い方は分かるが複数のclassを要素に付与する方法が分からない方

#CSSプロパティを付与する方法は２つある
複数のプロパティを付与する方法には以下の２つがあります。

・要素に直接複数のプロパティを指定して付与する
・予めvue側で用意したオブジェクト型を用いて付与する（推奨）

##要素に直接複数のプロパティを指定して付与する
以下、基本的な書き方

```
<p :class={クラス名: true(もしくはfalse), クラス名: true(もしくはfalse)}
```
「trueもしくはfalse」は、「指定したクラスを付与する（true）かしない(false)か」を指定しています。
実際にこのやり方で記述した例が以下になります。

```html

<h4 :class="{ textcolor: false, 'bg-color': true}">テキストカラーが赤(falseなので適用されない)、背景カラーがスカイブルー（trueなので適用）</h4>
```

```css
.textcolor {
    color: red;
}
.bg-color {
    background-color: skyblue;
}

```

実行結果
![directSelector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/41da26c9-31ff-a736-9f8c-2b81b2d77446.png)



また上記の方法はtrue falseでクラスを付与したり外したりする事を可能としています。
もし取り外す必要がない場合や同じプロパティで別のものを指定したい場合などは以下の方法もあります。

以下、基本的な書き方

```
<p :style="{セレクタ名: 変数名, セレクタ名: 変数名}"></p>

<script>
new Vue({
    el: '#app',
    data: {
       変数名: '具体的な値',
       変数名: '具体的な値',
 }
})
</script>
```
上記の例では{プロパティ名：変数名}としていますが、直接具体的な値を直接記述することもできます。（例：{color: 'red'}）
実際にこのやり方で記述した例が以下になります。

```
<h4 :style="{color: textColor, 'background-color': bgColor}">テキストカラーが赤、背景カラーがスカイブルー</h4>

<script>
new Vue({
    el: '#app',
    data: {
       textColor: 'red',
       bgColor: 'skyblue',
 }
})
</script>
```

実行結果
![indirectSelector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/39bd1124-c3ef-bffe-1ad6-64ce9cf12321.png)


##予めvue側で用意したオブジェクト型を用いて付与する（推奨）
以下、基本的な書き方

```html
<h1 :class="classObj"></h1>
    
new Vue({
    el: '#app',
computed: {
   classObj() {
     return { textcolor: true, 'bg-color': true}
     }
  }
})

```

```css
.textcolor {
    textcolor: red;
}
.bg-color {
    background-color: skyblue;
}

```

実行結果
![objectSelector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/d35ea5d9-2dd1-f762-27a9-d8c303dca130.png)


##おまけ Object型を二つ付与する方法
以下、基本的な書き方

```
<p :style="[オブジェクト名, オブジェクト名]"></p>
<script>
  new Vue({
     el: '#app',
     data: {
        オブジェクト名: {
            セレクタ名: '指定する値', 
            セレクタ名: '指定する値'
       },
        オブジェクト名: {
            セレクタ名: '指定する値'
      }
    }
})
</script>    

```
実際にこのやり方で記述した例が以下になります。

```
<h4 :style="[styleObj, pxObj]">Object型を二つ付与する</h4>

<script>
  new Vue({
     el: '#app',
     data: {
        styleObj: {
            color: 'red', 
            'background-color': 'skyblue'
       },
        pxObj: {
            fontSize: '100px'
      }
    }
})
</script>    
```

実行結果

![objectsSelector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/e7d0b1ac-4d12-d9b5-896a-1c9ee13982af.png)
Contact Form 7 Database Addon – CFDB7でexportするcsvを取り急ぎ日本語化する

WordPressのプラグインで有名なcontactform7をDBで管理できるようにするプラグイン「Contact Form 7 Database Addon – CFDB7」は大変便利なんですが、出力されたcsvがutf-8になり、そのままでは日本語のExcelでは文字化けします。
【ontact Form 7 Database Addon – CFDB7】
https://ja.wordpress.org/plugins/contact-form-cfdb7/

日本語対応している人いないかな、と思ったのですが、なかなかいらっしゃらないようなのでWindowsのExcelでも読み込めるように修正しました。

```wp-content/plugins/contact-form-cfdb7/inc/export-csv.php
$this->download_send_headers( "cfdb7-" . date("Y-m-d") . ".csv" );
$df = fopen("php://output", 'w');
ob_start();
# この１行を追加
stream_filter_prepend($df,'convert.iconv.utf-8/cp932');

for( $p = 0; $p <= $total_query; $p++ ){
```

ただ、これは場当たり的な修正で、本来このように修正すべきではありません。プラグインのアップデートがあれば元に戻ってしまいます。
WordPressではこのような場合どうすべきかわからないのですが、いずれ調べてうまいことやりたいですね。
Q13.開いているブックを保存するには？

ブックを保存する方法を考えていきます。
今回は、今開いているブックのバックアップを取るというシーンを想定して、マクロを作っていきます。
具体的には、今のファイル名に_yyyymmddというかたちで日付を付与して、カレントディレクトリに保存するマクロを作っていきましょう。


###■ポイント
まずは、ワークブックの保存です。これは簡単にできます。
ActiveWorkbook.SaveAs filename:="C:¥excelsample¥test.xls"

こうすると上記パスにtest.xlsという名前で保存することができます。
ただし、拡張子には注意してください。
マクロ有効ブックなのに、.xlsで保存しようとするとエラーになります。

また、同じ名前で保存しようとすると上書き確認されますが、Noを答えると、
エラー処理を書いていない場合は、エラーとなります。


次に、今のファイル名の取得。これは単純にActiveWorkbook.Nameで
取得することができます。

日付の取得は、過去記事参照してみてください。
[➡Q12.今日の日付をyyyymmdd形式で取得するには？][1]
[1]:https://qiita.com/guren111/items/562ffa45c4f7dce60df5


###■回答
```VB
Sub Q13_Answer()
    Dim book1 As Workbook
    Dim Fileobj As Object
    Dim FileName As String
    
    'ファイルシステムを扱うオブジェクトを作成
    Set Fileobj = CreateObject("Scripting.FileSystemObject")
    Set book1 = ActiveWorkbook
    
    '拡張子無しのファイル名を取得
    FileName = Fileobj.GetBaseName(book1.Name)
    book1.SaveAs FileName:=FileName & "_" & Format(Date, "yyyymmdd") & ".xlsm"
    Set objFileSys = Nothing
    Set book1 = Nothing

End Sub

```

###■解説
ファイル名_yyyymmdd.xlsmという形式を付けるには少し手間を加える必要があります。
というのも、普通にActicveWookbook.name & フォーマット関数だと、
.xlsm__yyyymmddとなり、ファイル形式がおかしくなってしまいます。

ファイル名から拡張子をのぞいてやる方法はいくつかあるんですが、
今回はファイルシステムオブジェクトを扱う方法でのぞいています。
ファイルシステムオブジェクトの.GetBaseNameプロパティから
拡張子をのぞいたファイル名を取得することができます。

あとはこれにフォーマット関数と正しい拡張子を&で付与してあげるだけです。
JUCE=>VST3 : JUCE_VST3_CAN_REPLACE_VST2 を 0 にすれば書き出せる

FAUST=>JUCE=>AU/VSTという流れでお手軽にプラグインを作って使っている者です。

久しぶりにVSTプラグインを作ってやろうと思ったら、あれ?できない?前にできたやつもできなくなってる?
ってことで調べたら、VST2.xがもう作れなくなったらしいことがわかり、しょうがないからVST3でも作ってやるかとVST3にチェックを入れて書き出してみるも、Xcode上で失敗。なぜ?

さらに ググって、JUCE_VST3_CAN_REPLACE_VST2 を 0 にすれば書き出せるらしいということがわかったので、

+ Xcode上で `JUCE_VST3_CAN_REPLACE_VST2` を検索して、
+ `#define JUCE_VST3_CAN_REPLACE_VST2 1`をかたっぱしから`#define JUCE_VST3_CAN_REPLACE_VST2 0` に変更

したら、コンパイルが通って無事VST3プラグインができました。&ちゃんと使えてます。

こんなやりかたでよかったのかな? 詳しい方がいたらご教授願いたい。

*せっかく作ったのに ちょっと前のDAWだとVST3が使えないということにあとから気がつきショック...というオチでした。

##追記： 自己解決。Preprocessor Definitionsに `JUCE_VST3_CAN_REPLACE_VST2=0`と書きこめばよい

こういうことか

<img width="976" alt="スクリーンショット 2020-01-21 11.00.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/fa45bdac-48d8-d439-a0d3-1a594abd08c3.png">
windows10の重さを改善できた...SSD交換とメモリ増設

###経緯

DELLのデスクトップPCを１年くらい使っていて、起動の遅さと起動後の動作のもっさり感が気になっていたので動作を速くしたいと思ったことがきっかけ。

![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/aa0f3a30-2b7c-1ea3-9727-c8d1b1404bbf.jpeg)





PCスペック
メーカー：DELL
OS:Windows10
メモリ:4GB
CPU:core i5-2400

###やったこと
（１）SSD交換
以前、ノートパソコンのSSD(128GB)を取り外し、SSD(512GB)に交換しました。
そのときにフリーになった、SSD(128GB)が家にあったので、今回の遅いPCのHDDと交換した。
HDDはデータ保存用として、生かしておいて、SSDにOSデータをインストールした。
SSDの設置場所まで、既存のSATA電源ケーブルでは届かなかったため、延長ケーブルを購入した。
このDELLパソコン内部は非常に混みあっていて、空きスペースがほぼなく、SSDを設置する場所で悩んだ。
悩んだ挙句、DVDリーダーを取り外して、その空いたスペースに設置するようにした。
DVDリーダーはほとんど使わないし、使いたいときはUSBで外部接続すれば問題ないと思ったので。。。
固定方法はテープ（笑）
デスクトップPCは持ち歩きもしないので、蓋が閉まれば、よし！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/648cc8bd-4a5a-1cfc-5ad2-b994d2a75cc6.png" width="500px">

SSDを交換しただけで、起動時間が圧倒的に速くなった。
PC起動を待つストレスがなくなった。起動後も動作は軽快で、起動後すぐにブラウザなどを立ち上げても、一瞬で起動できる。
SSD交換で効果がなかったら、CPUをI7にでもしようかと思っていたが、予想以上に問題が解消されたので、その必要はなくりました。

費用
SATA電源延長ケーブル　500円
2.5インチHDDマウンタ　300円

**SATA電源延長ケーブル**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/e914a6b1-bf1f-7017-6f3e-0bfaed437f1e.jpeg" width="300px">
**2.5インチHDDマウンタ**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/3dce4dc3-c5ba-ba57-8d1e-84bd06d67ef7.jpeg" width="300px">


（２）メモリ増設
メモリは4GBとちょっと心もとなかったので、+4GB増設しました。
もともと、4GBが1枚刺さっており、空きスロットは残り3つでした。
中古の電気屋でpc3-10600の4GBメモリを探して買ってきました。
空きスロットに挿入して、PC起動すると、以下のエラーが出ました。

```
「Alert! The amount of memory has changed.」
```

調べたところ、メモリ増設時はALERTメッセージが出るので、無視していいとの事だったので、安心した。

システム画面でメモリが認識されているか確認したところ、無事8GBと表示されていた。

費用
デスクトップ用メモリ4GB(PC3-10600) 2000円

（３）掃除
PCボックス内にホコリが溜まっていたので、ついでに掃除しといた。
エアダスターと除電ブラシでホコリを除去。
PCボックスなんて、滅多に開けないので、この機会にやっておいた。

費用
エアダスター　500円
除電ブラシ　600円

以上
出会って2秒で 画像を重ね合わせる

画像を重ね合わせるのにイラレとかフォトショップ開くのは面倒なんだけど！

#TL;DR
ImageMagickを使います
同じ大きさの画像ならば下のコマンドで即です

```bash:画像を重ね合わせる
convert -size 1024x1024 xc:none \
        layer01.png -geometry +0+0 -composite \
        layer02.png -geometry +0+0 -composite \
        result.png
```
[Ruby] Hash で Value を昇順にする時 Key も昇順にする

# どういう並べ替えをする方法なの？

value を昇順に並べ替えた上で、 同じ value を持つ key についても昇順にする方法です。

具体的には、

```ruby:
# これを
{3: 10, 2: 20, 1: 10}

# こうする
{1: 10, 3: 10, 2: 20}
```

方法です。

# 方法

**追記**

コメントでこちらの方が簡単だと教えていただきました。

```ruby:
hash.sort_by{ |k, v| [v, k] }.to_h
```

---

仕組みはよく分かりませんが、いろいろ試した所出来たので投稿します。

```ruby:
# いったん Array に変換
array = hash.to_a

# key value を同時に昇順に変換
array.sort_by! {|x| [x[1], x[0]]}

# Hash に戻す
hash = array.to_h
```

参考：[Rubyでの安定したソート| 8番目の光](https://8thlight.com/blog/will-warner/2013/03/26/stable-sorting-in-ruby.html)
標準入力のあるプログラムを delve でデバッグしたい

Goで開発していて delve は便利なデバッグツールですが、標準入力のあるプログラムはそのままではデバッグができません
標準入力をプログラム本体に入力することができないためです

# 対処法

まず、プログラムを一度コンパイルし、
コンパイルしたプログラムを実行します

```sh
$ go build  -gcflags="-N -l" hoge.go
$ ./hoge
```

で、 **新しい** ターミナルを開き
このプロセスに対してdlvをアタッチします

```sh
$ dlv attach $(pgrep -fn hoge)
```

`dlv attach` コマンドは、引数に pid を渡すことで、その Go プログラムのデバッグを開始します


これで無事にデバッグができるようになります。
プログラム本体側のターミナルで標準入力ができますし、dlv側のターミナルでデバッグコマンドが使えます

めでたしめでたし
Qiita API v2 の惜しいところ

# はじめに
先日Qiita API v2を用いて，macOS用の便利ツールを作ろうと試みたのですが，欲しい機能を実装できそうになかったため開発を断念しました．Qiita API v2の印象としては，**痒いところに手が届かないAPI**と言ったところでしょうか．

【参考】
- [Swift：OAuthSwiftを使ってQiita API v2をいじる](https://qiita.com/Kyome/items/be7b2cdd321fbab2a0db)
- [Qiita API v2ドキュメント](https://qiita.com/api/v2/docs#%E3%83%A6%E3%83%BC%E3%82%B6)

# 何が惜しいのか
- 認証済みユーザの未読通知リストを取得できない
- 認証済みユーザの下書き記事を取得できない
- ユーザのプロフィール画面で閲覧できるタグの割合データを直接取得できない
- 日ごとのコントリビューション・フォロワー数の折れ線グラフのデータを直接取得できない

今の所Qiita API v2は，Qiita全体の記事（コンテンツ）に対するクローリングや特定の記事に対する「いいね」と「ストック」などのリアクションの自動化には向いていますが，ユーザ個人の情報取得や操作は簡単にはできない（あるいは全くできない）もののようです．

通知を確認したり下書きに対する追記を行ったりできるツールを作ろうとしていたので，現状かなりがっかりです．

ユーザのプロフィールに関する情報は，認証などせずともユーザのプロフィールページさえ読み込んでHTMLをパースすれば取得できるので，いくつかの課題はカバーできますが，認証後であればユーザ情報をもっと引っ張ってこれると嬉しいですね...

# 蛇足
Googleで「Qiita API 〇〇」と検索すると，Qiita APIの記事ではなく，何かのAPIに関するQiitaの記事ばかり検出されて欲しい情報になかなかたどり着かなくて厄介ですね．技術情報共有サイト故の問題ですね．
Raspberry Pi 3でカメラ接続してみる

# モチベーション
ラズパイを買ったまま、半年ほど放置していました。先日「ラズパイとカメラでディープラーニングをやってみよう」というイベントに参加して興味が沸いたので、自作してみようと思います。今回のゴールは、ラズパイ専用カメラモジュールでキャプチャするところまでです。

# 準備するもの
- Raspberry Pi 3+　Amazonで購入
- Cameraモジュール Amazonで購入

# ラズパイにカメラモジュールを取り付ける
カメラモジュールをラズパイの専用バス（MIPI CSI-2）に接続します。
カメラコネクタの両脇のツメを引き上げて、フレキシブルケーブを差込み、カメラコネクタの両脇のツメを押し下げてケーブルを固定します。

# ラズパイでカメラモジュールが認識できるように設定する
カメラモジュールを有効にするため、画面「Menu → 設定 → Raspberry Pi」と選択し、表示されたダイアログのインタフェースタブを選択して表示されたカメラの項目を、次のように「有効」にします。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565739/6183e5bb-8e0d-214f-8a16-27dc9e9efdf2.jpeg)


# 静止画をキャプチャしてみる
カメラモジュールの接続および動作を確認します。consoleからraspistillコマンドで静止画を取得します。

```
$ raspistill -o test.jpg
```

静止画「test.jpg 」が保存されます。今回利用したカメラが赤外線対応なのでこのような感じになってます。
![test.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565739/3092aa68-1027-3621-b918-3ddf79242ef0.jpeg)



今回はここまで。次回はPythonを使ってみたいと思います。