OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberrypiにmotionをインストールしてみた

## motionのインストール方法

```BASH
sudo apt-get install motion
```
上記を入力してmotionをインストールする

##motionをうごかしてみる
```bash 
sudo motion
```
これで起動できます。

sudo しなかった場合は
motion[2187]: [27800896] [EMG] [ALL] motion_startup: Exit motion, cannot create log file /var/log/motion/motion.log: Permission denied
というふうに権限がありませんとしかられて起動しません


対応カメラはWEBカメラをさしてみて祈りましょう。
動いた報告コメントもらえると嬉しいです。
[iBUFFALO WEBカメラ 200万画素 UVC マイク内蔵 ヘッドセット付 シルバー BSW20KM03HSV](https://www.amazon.co.jp/iBUFFALO-WEB%E3%82%AB%E3%83%A1%E3%83%A9-200%E4%B8%87%E7%94%BB%E7%B4%A0-%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88%E4%BB%98-BSW20KM03HSV/dp/B0042D84BI?SubscriptionId=1E6F08GHTJNKEQ45PY82&tag=patentic-22&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B0042D84BI)
このカメラはうごきました

##motionが動いてるかどうか確認する方法

```bash
 ps -uroot | grep motion
```

動いている場合下記のようにみえます。

```bash
 9451 ?        00:02:37 motion
```
注意：motionは重複起動してしまった場合うまくうごかない場合があります。
　　　motionが複数起動している場合はsudo pkill -f motion　などで消せますが複数常駐していた場合は一度全部けしたほうが良いです。

##画像の保存フォルダ

```bash
/var/lib/motion
```

画像は上記のフォルダにどんどんたまっていきます。
整理するのがめんどくさくなるまえにシェルで日付ごと、などに自分でふりわけるのもべんりかもしれません

```bash
#!/bin/bash
#

#日付のフォーマットを設定
HIDUKE=`date '+%Y_%m_%d__%T' | tr -d :`

# ユーザー名を入力
USER='<<ここにユーザー名を入れてください>>'

# 保存したいフォルダ
MO_DIR='/home/user/motion'

# 標準で保存されるmotionのフォルダ
DF_MOTION='/var/lib/motion'


#
#　motionの常駐をとめる　なにかが原因で複数常駐になっていたら働かないので念のため3回
#

sleep 5
sudo pkill -f motion
echo 'pkill 1'
sleep 1
sudo pkill -f motion
echo 'pkill 2'
sleep 1
sudo pkill -f motion
echo 'pkill 3'
sleep 1

#
# 指定のフォルダにmotionのフォルダをつくる
#
sudo mkdir $MO_DIR/$HIDUKE
sudo find $MO_DIR/$HIDUKE -type d -exec chmod 755 {} +
sudo find $MO_DIR/$HIDUKE -type d -exec chown  $USER:$USER {} +

#
#motionフォルダから指定のフォルダに移動
#
cd $DF_MOTION
sudo mv * $MO_DIR/$HIDUKE/

#
#指定されたユーザー用に権限書き換え
#
sudo find $MO_DIR/$HIDUKE -type f -exec chmod 644 {} +
sudo find $MO_DIR/$HIDUKE -type f -exec chown $USER:$USER {} +

#
#motionは勝手に起動しないので起動させる
#
sleep 2
echo 'start motion'
sudo motion
exit
```

素人ですがちょっとシェルを書いてみました
これをcronなどに登録して1日一回とか動かすとフォルダをつくって移してくれます。

##cron設定

```bash
sudo crontab -e
```
cronを起動して

```bash
02 8 * * * /home/user/mo
```

という感じで登録してスケジュール実行するだけです。

cron使い方
https://qiita.com/tossh/items/e135bd063a50087c3d6a

これで好きなフォルダにいれておいて参照がしやすくなります。

SCPでコピーなどすれば別のサーバーに送ることも可能ではないでしょうか
first()とget()、all()について

今回は、Laravelのクエリービルダークラスのメソッドであるfirst()とget()、all()について整理します。

このfirst()とget()、all()は、クエリービルダーやEloquent ORMで使用します。
それぞれの使い方は、下記の通りです。

first()
クエリを実行して、レコードの最初の結果を取得します。
引数はオプションで、表示するカラム名を配列で指定します。
デフォルトは全カラムです。

記述例：
//クエリービルダー
DB::table('モデル名')->first();
//Eloquent ORM
モデル名::first();


get()
クエリを実行して、レコードの複数の結果を取得します。
条件または引数を指定しない場合、全レコードが取得されます。

記述例：
//クエリービルダー
DB::table('モデル名')->get();
//Eloquent ORM
モデル名::get();

all()
クエリを実行して、レコードの全ての結果を取得します。

記述例：
//クエリービルダー
DB::table('モデル名')->all();
//Eloquent ORM
モデル名::all();


【参考サイト】
『Laravel4、テーブル操作の戻り値』
『Queryビルダークラスのメソッド一覧』
『Builder::first()メソッド』
『Builder::get()メソッド』
npm-run-allでサーバーを並列で立てるときは"race"オプションを使用する

[npm-scripts](https://qiita.com/minase_tetsuya/items/986feac7150ed74e13d8)の複数実行を可能にする[npm-run-all](https://github.com/mysticatea/npm-run-all)。

parallelオプションを使用すると、複数のスクリプトを並列で実行することができる。

これにより、例えばフロントのサーバーと、API用のサーバーを１つのコマンドで立ち上げることができるため、開発する上では非常に便利であるが、罠があった。

### "ctrl + C"でプロセスを終了するも、片方のサーバーが終了しない！？

`ctrl + C`でプロセスを終了すると、並列で立ち上げたサーバーのうち１つは終了したのだが、他のサーバーを終了させることができないという事態に陥った。

こうなってしまってはしょうがないので、["ps"コマンドで直接終了させた](https://teratail.com/questions/168197)のだが、毎回これを行うのはめんどくさいので、なんとかならないか調べた。

# "-r, --race"オプションを使おう

[raceオプション](https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md)を使うことで、並列実行した処理のうち１つを終了させた場合、すべてが終了するようになる。

まさにこれでした。やりたいのは。

これからはraceオプションをきちんと使って、「あれlocalhost動いてるんだが」と驚かないようにしよう🤐
画像を親divの中央(vertical center)に表示する方法

#imgタグを親divの真ん中垂直にさせるcss方法

##html

###before

```html

<!DOCTYPE html>
<html lang="ja">

<head>
    <style>

    </style>
</head>


<div style="border: 1px solid black;width:500px;height:300px">

    <img width="120px" src="benz.jpeg">

</div>

</html>


```

![before.png](https://qiita-image-store.s3.amazonaws.com/0/191439/4d45a556-bc91-1073-a6fb-0ef4a5e7e8cc.png)


###after


```html


<!DOCTYPE html>
<html lang="ja">

<head>
    <style>
        .centerLand {
            display: flex;
            justify-content: center;
            align-items: center;
        }
    </style>
</head>


<div class="centerLand" style="border: 1px solid black;width:500px;height:300px">

    <img width="120px" src="benz.jpeg">

</div>

</html>


```

![after.png](https://qiita-image-store.s3.amazonaws.com/0/191439/26d71fe1-54ba-2ee8-14a4-c533c6cb228d.png)



```

   display: flex;
   justify-content: center;
   align-items: center;

```

上記のcssをimgタグの親divに適応すれば、imgが垂直の真ん中に配置されます。



#vertical-alignの使い方

親
height:指定した値(200px)もしくは指定した割合(100%)
display: table;

子
display: table-cell;
vertical-align: middle;
パーミッション一覧


自分用パーミッション備忘録。

|# |権限 |
|---|---|
| 7 |rwx|
| 6 |rw-|
| 5 |r-x|
| 4 |r--|
| 3 |-wx|
| 2 |-w-|
| 1 |--x|
| 0 |---|

r=読み込み
w=書き込み
x=実行

### よく見るやつ

|#|権限|
|---|---|
|755|-rwxr-xr-x|
|644|-rw-r--r--|
|600|-rw-------|
show modal view custom size

[attributes inspector]
check "Content Size" ->  Use Preferred Explicit Size

```
if withNavigationBar {
   let navController = UINavigationController()
   navController.viewControllers = [some view controller]
   navigationController.modalPresentationStyle = .formSheet
   self.present(navController, animated: true, completion: completion
} else {
   vc.modalPresentationStyle = .formSheet
   self.present(vc, animated: true, completion: completion)
}
```
USBデバイスの抜き差しを検知する

#やりたいこと
USBデバイスが抜き差しされたタイミングで、ViewModelのコマンドを実行する。

#実装

USB抜き差し時にコマンドを実行するビヘイビアを作成する。

```c#:ビヘイビア
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop;

namespace Sample {
    public class DeviceChangeBehavior {
        private static readonly uint WM_DEVICECHANGE = 0x0219;

        public static DependencyProperty CommandProperty
            = DependencyProperty.RegisterAttached(
                "Command",
                typeof(ICommand),
                typeof(DeviceChangeBehavior),
                new PropertyMetadata(Command_PropertyChanged)
            );

        public static void SetCommand(FrameworkElement element, ICommand value)
            => element.SetValue(CommandProperty, value);

        public static ICommand GetCommand(FrameworkElement element)
            => (ICommand)element.GetValue(CommandProperty);

        private static Dictionary<FrameworkElement, ICommand> _commands
            = new Dictionary<FrameworkElement, ICommand>();

        private static void Command_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            var element = d as FrameworkElement;
            if (element == null) return;

            if (e.NewValue != null) {
                element.Loaded += FrameworkElement_Loaded;
                _commands.Add(control, e.NewValue as ICommand);
            } else {
                element.Loaded -= FrameworkElement_Loaded;
                var handle = ((HwndSource)HwndSource.FromVisual(element)).Handle;
                var source = HwndSource.FromHwnd(handle);
                source.RemoveHook(WndProc);
                _commands.Remove(element);
            }
        }

        private static void FrameworkElement_Loaded(object sender, RoutedEventArgs e) {
            var element = sender as FrameworkElement;
            if (element == null) return;

            //ロード完了後でないとハンドラを登録できない
            var handle = ((HwndSource)HwndSource.FromVisual(element)).Handle;
            var source = HwndSource.FromHwnd(handle);

            source.AddHook(WndProc);
        }

        private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
            if (msg != WM_DEVICECHANGE)
                return IntPtr.Zero;

            _commands
                .Select(x => new { ((HwndSource)HwndSource.FromVisual(x.Key))?.Handle, Command = x.Value })
                .Where(x => x.Handle == hwnd && x.Command.CanExecute(null))
                .ForEach(x => x.Command.Execute(null));

            return IntPtr.Zero;
        }
    }
}
```

#使い方

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        local:DeviceChangeBehavior.Command="{Binding XXXCommand}"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <TextBox />
    </Grid>
</Window>
```

Window以外にも指定できるが、ルート要素に指定するのが無難。
【Java + jsoup】メルカリの販売中の商品をスクレイピングする

###【概要】
メルカリのURLを指定するだけで、販売中の商品をスクレイピングして、HTML1ページに一覧表示します。
いちいちメルカリのブックマークを一つずつ表示するのは面倒だったので、自動化しました。
GitHubにあげてあります　→　[MercariScraping](https://github.com/nobu12/MercariScraping)

###【準備】
・取得したい商品のURLをテキストファイルに書き込みます。
　先頭が半角シャープ"#"の行はコメント扱いとなっています。
（今回の例では`C:\Users\nobu\Desktop\tmp\mercari_url.txt`）

```text:mercari_url.txt
# 定本 Cプログラマのためのアルゴリズムとデータ構造
https://item.mercari.com/jp/product_key/1_28384941/
# プロとしてのOracle PL/SQL入門 【第3版】
https://item.mercari.com/jp/product_key/1_33099446/
# 初めてのPerl
https://item.mercari.com/jp/product_key/1_32331276/
```


###【コード】
```java:Main.java
package scrap.main;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Main {
	public static String MERCARI_URL_FILE = "C:\\Users\\nobu\\Desktop\\tmp\\mercari_url.txt";
	public static String OUTPUT_HTML_FILE = "C:\\Users\\nobu\\Desktop\\tmp\\output_mercari.html";

	public static void main(String[] args) {

		// メルカリのURL読み込み
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(
					new InputStreamReader(new FileInputStream(MERCARI_URL_FILE), StandardCharsets.UTF_8));
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}

		String str;
		Document document = null;
		Elements element = null;
		String html = "";
		try {
			while ((str = reader.readLine()) != null) {
				// 先頭が半角シャープ"#"であるコメント行はスキップする
				if (str.startsWith("#")) {
					continue;
				}

				int pageNo = 1;
				// 販売中の商品が存在しないURLまでループする
				do {
					// ページのソースを取得、リクエストのタイムアウトは10秒に設定
					document = Jsoup
							.connect(str + "?page=" + pageNo + "#sell-items")
							.timeout(10000).get();
					element = document.getElementsByClass("entertainment-product-sell-item-content");
					html += element.outerHtml();
					pageNo++;
				} while (!element.isEmpty());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		// htmlファイル作成
		try {
			File file = new File(OUTPUT_HTML_FILE);
			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
			pw.println("<!DOCTYPE html>");
			pw.println("<html lang=\"ja-JP\">");
			pw.println("<head>");
			pw.println("<link href=\"https://item.mercari.com/jp/assets/css/app.jp.css?3062056556\" rel=\"stylesheet\">");
			pw.println("</head>");
			pw.println("<body>");
			pw.println("<main class=\" l-container clearfix\">");
			pw.println(html.replaceAll("class=\"lazyload\"", "").replaceAll("data-src", "src"));
			pw.println("</main>");
			pw.println("</body>");
			pw.println("</html>");
			pw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
```

###【実行結果】
実行すると
`C:\Users\nobu\Desktop\tmp\output_mercari.html`
が出来上がります。
画像はページの一部であり、本記事作成時点での情報です。

![メルカリ.png](https://qiita-image-store.s3.amazonaws.com/0/121997/44b760bf-e702-2b96-3f2f-c694b271fcc3.png)
日別のデータを四半期(4月〜3月)でまとめるSQL

備忘録として。

日毎のデータテーブルを四半期毎にまとめる単純な方法です。

```sql
SELECT 
(CASE 
WHEN DATE_FORMAT(`date`,"%m") = "04" THEN "1Q" 
WHEN DATE_FORMAT(`date`,"%m") = "05" THEN "1Q" 
WHEN DATE_FORMAT(`date`,"%m") = "06" THEN "1Q" 
WHEN DATE_FORMAT(`date`,"%m") = "07" THEN "2Q" 
WHEN DATE_FORMAT(`date`,"%m") = "08" THEN "2Q" 
WHEN DATE_FORMAT(`date`,"%m") = "09" THEN "2Q" 
WHEN DATE_FORMAT(`date`,"%m") = "10" THEN "3Q" 
WHEN DATE_FORMAT(`date`,"%m") = "11" THEN "3Q" 
WHEN DATE_FORMAT(`date`,"%m") = "12" THEN "3Q" 
WHEN DATE_FORMAT(`date`,"%m") = "01" THEN "4Q" 
WHEN DATE_FORMAT(`date`,"%m") = "02" THEN "4Q" 
WHEN DATE_FORMAT(`date`,"%m") = "03" THEN "4Q" 
ELSE "non" END)as Q FROM `data_tabele` 
WHERE `date` BETWEEN "2018-04-01" AND "2019-03-31" 
GROUP BY Q
```
HomebrewのFormulaで元のソフトウェアバージョンを変えずに新しいバージョンにしたい！

## やりたいこと

brewのFormulaを更新したいけど、ソフトウェアのバージョンを変更したくないときに、どうやってFormulaを更新するかについてです

## 方法

`Formula#revision`を使えば良さそう！

該当箇所のドキュメント：https://www.rubydoc.info/github/Homebrew/brew/Formula:revision

実際の例: https://github.com/Homebrew/homebrew-core/blob/277f808cfe3e87e771904dfd5c41f22fc45ff773/Formula/wget.rb#L7


こういうのずっと探してました
キーワード選定を理解するためのポイントとタスクまとめ

## はじめに、良質なコンテンツの３つの条件とは？

- その人が求めているどんぴしゃりの情報を届け、
- その人の潜在的な悩みや願望を完璧に解決させ、
- さらに１２０％満足してもらえるページ


## SEOキーワードでユーザーニーズを正確に理解するとは？

- 検索エンジンからの将来的なアクセス数
- その情報がどれぐらい求められているか

サイトのSEOの成否を大きく左右する最も大きな要素である「良質なコンテンツ」を作るために欠かすことはできない。



## 三種類のSEOキーワードを理解するとは？

-  「したい」キーワード…行動を“おこなう”ことを目的として検索されるキーワード
- 「知りたい」キーワード…何らかの情報を“調べる”ことを目的として検索されるキーワード
- 「行きたい」キーワード…特定のサイトに“行く”ことを目的として検索されるキーワード

###「したい」とは【特定の行動を行うこと】
コンバージョンにつながりやすいキーワードのためランディングページに適している。最初から上位表示を狙うのではなく、最終的にそのキーワードで検索上位に表示される価値のあるサイトを作ることで上位表示を狙う。

###「知りたい」とは【知りたい情報を得ること】
ユーザーが知りたいことが明確で、ノウハウ系コンテンツを作りやすい。そのためソーシャルメディアでシェアされるコンテンツを作りやすく集客用のブログコンテンツに最適。まずは、このキーワードを使って、記事を充実させていくことが、〜したいキーワードで上位表示されることに繋がる。

###「行きたい」とは【目的のサイトにいくこと】
YouTube や Facebook, Dropbox など特定のサイトに行くことが目的。サービスやウェブメディアの知名度が高くなるにつれて増えてくる。全てのサイトが最終的に目指すべきところだ。


#サイトを始める前に必ず行いたいコンテンツプランニングの３ステップ


##STEP１：メディアミッションを考える

「集客のため」だけにコンテンツを作ってしまうと、その姿勢は必ずユーザーに伝わる。集客だけを目的にすると、ユーザーニーズの追求、コンテンツの内容の調査ともに雑になってしまい、至るところで不親切な内容となってしまう。

- 【あなたのビジネスに関連する方たちはどのような悩みを持っている人たちですか？】…「ユーザーの視点」で価値を提供するために考えておく。

- 【そのような方たちに、現状の世の中で不足している情報はなんですか？】…「競合の視点」現状の検索結果を見て、どのような情報が不足しているかを考えておく。

- 【そのような状況の中、御社ではどのような価値を届けられますか？】…「自社の視点」わたし達が持っている情報、人的リソースの状況を加味しておく。

##STEP２：キーワードリサーチを行う

- 関連するキーワードをすべて抽出する
- サジェストツールを使って複合キーワードをすべて抽出する
- すべてのキーワードの検索ボリュームを抽出する

##STEP３：コンテンツ構造を決定する

###キーワードを分類

- いますぐキーワード…いますぐあなたの商品やサービスを求めている人が検索するキーワード
- おなやみキーワード…商品やサービスの必要性は確実に持っているけれど、どの商品が良いか決めかねている人が検索するキーワード
- そのうちキーワード…あなたの商品を欲しいと思っているが、まだ購入に至るまでの緊急性を持っていない人が検索するキーワード
- まだまだキーワード…将来的にお客様になる可能性のある潜在的見込み客が検索するキーワード

###キーワードを取捨選択する

手元に残るキーワード数が100から200程度になるまで絞り込んでいく。

- 検索ボリュームが０のものを削除する
- メディアのミッションを頭に置き必ず書くべきキーワードを選択する
- 他のキーワードと比較して特徴のあるものを選択する
- 100から200に絞り込むよう検索ボリュームが少ないものから削っていく

###実行に移してみよう

１キーワードにつき１コンテンツずつ制作する。100から200ページのサイト構造に落とし込む作業となる。

1. サイトトップ…最も重要なキーワードを設定
2. ブログトップ…次に重要なキーワードを設定
3. サイトコンテンツ…主に「まだまだキーワード」を設定する。
4. ランディングページ…「いますぐキーワード」「したいキーワード」を設定する。
5. ブログカテゴリー…「知りたい」ビックキーワードを設定する。
6. ブログ記事…「知りたい」スモールキーワードを設定する


![サイト構造.png](https://qiita-image-store.s3.amazonaws.com/0/337515/dc2e2598-0ba0-bfbe-0082-2abbff22aedb.png)


そして、これらの６つのページのそれぞれで最適なキーワードを見つけて、サイトやブログの構成を整え、それぞれのキーワードで検索するユーザーが１２０％満足するコンテンツ（=そのキーワードで上位表示される価値のあるコンテンツ）を作り、サイトのSEO効果を大きく上昇させることがキーワード選定の目的。

この中で、もっとも重要になる部分がブログ記事。良質なブログ記事はソーシャルメディアで多くシェアされやすいため。
Cypress ファイルアップロード

体裁はそのうち整える。

## Cypress とは

https://www.cypress.io/

そのうち別ページに移す。
E2Eテストツール。
npmでも提供されているが、実行ファイルのみを単体でダウンロードして使用することも可能。
Chromeが同梱されていて、各開発者のローカルPCで動かすイメージ。

テスト自体はJSで記載する。
サンプルも割と豊富にあるので、基本的な操作はあまり困らない。


## ファイルアップロード

ググるといくつか出てくるけど、、、英語ページばかりだったので備忘のため。

```javascript:command.js

Cypress.Commands.add('upload_file', (fileName, fileType = ' ', selector) => {
    cy.get(selector).then(subject => {
        cy.fixture(fileName, 'base64')
            .then(Cypress.Blob.base64StringToBlob)
            .then((blob) => {
                cy.log(blob);
                const el = subject[0];
                const testFile = new File([blob], fileName, { type: fileType });
                const dataTransfer = new DataTransfer();
                dataTransfer.items.add(testFile);
                el.files = dataTransfer.files;
            });
    });
});
```

```javascript:test.js
cy.upload_file(file_name, file_type, 'input[name=file_input]');
```
Ubuntu　Raspbian　でsuでrootユーザーになれないときの対処

##１．UbuntuとRaspbianはセキュリティーの関係上デフォルトでrootのパスワードが設定されていません。

```bash
XXXX@raspberrypi:~$ su -
Password: 
su: Authentication failure
```

sudoで使っているパスワードをつかってもこうなってしまいます。

原因：UbuntuとRaspbianはセキュリティーの関係上デフォルトで
　　　rootのパスワードが設定されていません。

##2.どうしたらよいか
対策としてはrootにパスワードを与えてあげないといけないので
passwd　コマンドをつかってrootにパスワードをあたえてください

「sudo passwd root」これを入力してね

※rootにパスワードを与えることはセキュリティーホールになるので
パスワードをつけるときは慎重にかんがえてからおこなってください。

sudoのパスワードをいれたあとにあたらしいパスワードの入力を2回もとめられるので
新しいパスワードを入力してあげてください


```bash
XXXX@raspberrypi:~$ sudo passwd root
[sudo] password for XXXX: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
XXXX@raspberrypi:~$ su -
Password: 
root@raspberrypi:~# 
```
rootになることができました。


こういう書き込みで　もとに戻すのはどーすんだ！！　というのが多いので
元に戻す方法も書いておきます。
「sudo passwd -l root」これを入力してね


```bash
XXXX@raspberrypi:~$ sudo passwd -l root
passwd: password expiry information changed.
```

これで元にもどりました。

```bash
su: Authentication failure
XXXX@raspberrypi:~$ su -
Password: 
```
rootになれないので元通りです。

##追記
コメントで内緒の指摘をいただきましたありがとうございます。

詳しく調べると
suでは現在のユーザーのカレントディレクトリや環境変数も引き継がれてつかえる
su - だと環境変数が引き継がれない

こういう違いがありました　ありがとうございました
よく使うMySQL関連Tips


## TSV出力
```bash
$ mysql -u %user_name% -p -h %host_name% -P %port% %database_name% < select.sql > res.tsv
```
 
## CSV出力
```bash
$ mysql -u %user_name% -p -h %host_name% -P %port% %database_name% < select.sql | sed -e 's/\t/,/g' > res.csv
```

--------------------------------
## スキーマ内の全カラム出力
```sql
SELECT table_name, column_name, column_type, column_comment FROM information_schema.columns WHERE table_schema = 'XXXXXXX';
```

## カラム名からテーブル名検索
```sql
SELECT table_name, column_name, column_type, column_comment FROM information_schema.columns WHERE table_schema = 'XXXXXXX' AND column_name = 'YYYYYYYY';
```

## 実行中プロセス
```sql
-- 実行中プロセスの表示
SHOW processlist \G

-- 実行中プロセスの表示（SQL全文表示のため注意）
SHOW FULL processlist \G

-- 実行中プロセスのIDを指定して強制終了
KILL %ProcessId%;
```

## クエリキャッシュ
```sql
-- クエリキャッシュの設定確認
SHOW VARIABLES LIKE 'query_cache_%';

-- クエリキャッシュの確認
SHOW STATUS LIKE 'Qcache%';

-- クエリキャッシュのクリア　※RELOAD権限が必要
RESET QUERY CACHE;
```
--------------------------------
php-master-changes 2019-01-10

今日はオブジェクトプロパティ書き込みハンドラの修正、opcache の SCCP 最適化周りの （SEGV が出る問題含む）修正、parse_str() で既存の配列へ要素を代入する際に SEGV が出る問題の修正、PDORow のコード整理とプロパティ読み出し時の挙動変更、imagescale() が失敗時に空の画像リソースを返す問題の修正、password_hash() と password_needs_rehash() の引数処理から不要な参照対応を外す修正があった！

# 2019-01-10
## nikic: Require that write_property value is not a reference
- https://github.com/php/php-src/commit/d6e32c6ba7cd6b608e32c5ddb078e688b7031547
- オブジェクトプロパティへの書き込みハンドラでの不要な参照チェックの削除
- 呼び出し前にデリファレンスしてるので不要というやつ

## laruence: Incase of invalid read
- https://github.com/php/php-src/commit/16176ad0e30ce1407c2ce546094bec5821af8c3c
- [7.3~]
- ext/opcache で、[1/8 の修正](https://qiita.com/sj-i/items/789a0057f4b9316f01e3#laruence-fixed-bug-77266-assertion-failed-in-dce_live_ranges)箇所についてループカウンタのインクリメントを後置から前置へ
- new する際のコンストラクタ呼び出し命令の位置をとる処理なのは追った
- 見つからなくてケツまで読む時に読みすぎてたのかな

## nikic: Fixed bug [#77434](https://bugs.php.net/bug.php?id=77434)
- https://github.com/php/php-src/commit/ade702a0d299f0c8967720fb4887cd1447419cd9
- [7.3~]
- ext/opcache で、一部がリテラルであるような配列の操作で SEGV が出る問題の修正、かな
- これも SCCP 周りのバグ

## nikic: Fixed bug [#77439](https://bugs.php.net/bug.php?id=77439)
- https://github.com/php/php-src/commit/5d33024a5dc40a45c986deb37282e54e80058b6f
- [7.2~]
- [parse_str()](http://php.net/manual/ja/function.parse-str.php) で、既存の配列へ要素を代入する際に SEGV が出る問題の修正

## nikic: Manually initialize PDORow handlers
- https://github.com/php/php-src/commit/32de3469d9eeebfaec8706865f10401656d60dba
- ext/pdo で、PDORow のオブジェクトハンドラを初期化する際にメンバを明示的に指定して代入するよう修正
- 何に何入れてるのか分かるように、ということみたい
- C99 だと指示初期化子とか使える系だけれども、あれも C++ 的にこう……

## nikic: Use serialize_deny handler in PDORow
- https://github.com/php/php-src/commit/5f7b934f8b80af499f459dbcb6fae76eab9a136d
- ext/pdo で、独自定義のハンドラのかわりに serialize_deny でシリアライズを禁止するよう修正

## nikic: Return only debug props in PDORow
- https://github.com/php/php-src/commit/a0d0cb847fb623f1f64abe7ff42f5a6e6c4bfb8c
- ext/pdo で、PDORow のプロパティ読み出しが PDOStatement のプロパティを返したりしていたのを var_dump() などデバッグダンプ用関数のみで返すよう修正、かな？
- あんま読めてないけど実際そうならその挙動に依存してて困る人もいそうな

## cmb69: Fix [#77272](https://bugs.php.net/bug.php?id=77272): imagescale() may return image resource on failure
- https://github.com/php/php-src/commit/772b1cb245ebe19e220a2552d1e2b700d15f2c68
- [7.2~]
- [imagescale()](http://php.net/manual/ja/function.imagescale.php) が失敗時に空の画像リソースを返す問題の修正
- バンドル版の libgd 利用で起きる

## nikic: Remove unnecessary Z_PARAM_ZVAL_DEREFs
- https://github.com/php/php-src/commit/e88a08164198c11612f7764c70e3ec5bda7ab67e
- 無駄に Z_PARAM_ZVAL_DEREF だったのを Z_PARAM_ZVAL へ修正
- [参照じゃ](http://php.net/manual/ja/function.password-hash.php)、[ないでしょ](http://php.net/manual/ja/function.password-needs-rehash.php)、みたいな
グラフ > Y軸の最大値に対するtick間隔の計算 > ExcelとGoogleスプレッドシート (2019-01-11時点)

```txt:動作環境
Excel Office 365
2019-01-11現在のGoogle スプレッドシート
```

## 比較

Y軸の最大値を与えた時に自動計算されるtick間隔(主目盛間隔)を調べてみた。
（下記の表示はGoogle スプレッドシート上にてグラフとしている。）

Excel Office 365 (2019-01-11最新版)
![2019-01-11_09h27_28.png](https://qiita-image-store.s3.amazonaws.com/0/32870/543bf89a-906e-025e-a442-e5aef78b1888.png)

横軸の最左端は100。
Ymax増加に対して、Ytickは単調増加。

Googleスプレッドシート (2019-01-11最新版)
![2019-01-11_09h27_49.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f12900bc-9f3b-37e4-13a8-dae8886f3e5b.png)

Ymax増加に対して、Ytickも増加するが、下がる点もある。


### 関連

- [Python3 > Y軸の最大値に対するtick間隔を計算](https://qiita.com/7of9/items/54eddd1e61cbe8a27010)
とあるエンジニアが就職したい会社の条件。スーツ着用は絶対無理！という個人的な心の叫び。

とあるエンジニアが就職したい会社の条件。スーツ着用は絶対無理！という個人的な心の叫び。

仮に僕が人生をやり直して、就職先を選ぶとしたならの妄想。

# とあるエンジニアが就職したい会社の条件。

- スーツを着なくて良いか、
- 忍者を許容しているか。
-  子供を許容しているか。 

![image](https://user-images.githubusercontent.com/13635059/51005599-d7163780-1582-11e9-9e13-bc8da32c67d8.png)

http://twitter.com/YumaInaura/status/1083518220730920960

# 最近の服装

- 最近ジージャンや革のブーツを捨てて、本当に動きやすいモコモコのフリースを着ている。
- これがコスパが最強で、どこに行くにも動きやすいし、寝る時もこの格好のまま眠ることができる。
- とあるエンジニアはとにかくコストを嫌うので、子供みたいな格好をしていても、怒られないことが切実に大事。

http://twitter.com/YumaInaura/status/1083518603230699520

# 子供？忍者？

- これを子供みたいだと考えるか、忍者みたいだと考えるが、人によって賛否両論だと思う。本当に(?
- 子供は発想力豊かだけど、スーツを着ることなんか本当に嫌うぞ。堅苦しい事はご法度である。
- 忍者は動きやすい格好を好むので、スーツを着ると死んでしまうかもしれないぞ。エネミーに斬られて。 

http://twitter.com/YumaInaura/status/1083519131784114176

# いんまいおぴにおん

- 要するにもし僕が仮に人生をやり直して就職先を選ぶとしたら、まず真っ先にスーツを着る会社は除外するであろう。
- そのぐらい人によってスーツを着なければいけないと言う事はおそらく苦痛なのだ。何にも変えがたいぐらい。
-  あ、個人的目線ですいません。スーツは一生着たくない。心の叫び。 


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/327








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MVVMでMessageBoxを使用する

#やりたいこと
ViewModelからメッセージボックスを表示する。

#実装
メッセージボックスを表示するトリガーアクションを作成する。

```c#:トリガーアクション
using Prism.Interactivity.InteractionRequest;
using System.Windows;
using System.Windows.Interactivity;

namespace Sample {
    public class MessageBoxAction : TriggerAction<FrameworkElement> {
        protected override void Invoke(object parameter) {
            var args = parameter as InteractionRequestedEventArgs;
            if (args == null)
                return;

            var confirmation = args.Context as MessageBoxNotification;
            if (confirmation != null)
                confirmation.Result = MessageBox.Show(
                    confirmation.Message,
                    confirmation.Title,
                    confirmation.Button,
                    confirmation.Image,
                    confirmation.DefaultButton
                );

            args.Callback();
        }
    }
}
```

```c#:通知クラス
using Prism.Interactivity.InteractionRequest;
using System.Windows;

namespace Sample {
    public class MessageBoxNotification : Notification {
        public string Message { get; set; }
        public MessageBoxButton Button { get; set; }
        public MessageBoxImage Image { get; set; }
        public MessageBoxResult DefaultButton { get; set; }
        public MessageBoxResult Result { get; set; }
    }
}
```

#使い方

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject="{Binding OpenMessageBoxRequest, Mode=OneWay}">
            <local:MessageBoxAction/>
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <TextBox />
    </Grid>
</Window>
```

```c#:ViewModel

using Prism.Interactivity.InteractionRequest;
using System.Windows;

namespace Sample {
    public class MainViewModel {
        public InteractionRequest<MessageBoxNotification> OpenMessageBoxRequest { get; }
            = new InteractionRequest<MessageBoxNotification>();

        private MessageBoxResult OpenMessageBox(string title, MessageBoxImage icon, MessageBoxButton button, MessageBoxResult defaultButton, string message) {
            var notification = new MessageBoxNotification() {
                Title = title,
                Message = message,
                Button = button,
                Image = icon,
                DefaultButton = defaultButton
            };
            OpenMessageBoxRequest.Raise(notification);

            return notification.Result;
        }
    }
}
```
初心者がエラー対処にミスって、正月休みが溶けた話

#きっかけ
Phalconのインストールで散々ハマりまくり、正月休みの最後の3日間が消滅しました。
~~来年は惰眠を貪りたいので自分への戒めにします。~~
初心者の方が知っていると、役に立つことも書けると感じたので、そこに焦点を合わせた記事を書こうと思います。

##導入
####筆者の自己紹介
2019年1月からエンジニアとして働き始めた新米。~~エンジニア力たったの5か…ゴミめ…~~
2018年9月末に前職の派遣コールセンターを退職し、3ヶ月もの間、華のニート生活をエンジョイ。
心も身体もだらけきった年末年末を過ごしていたが、未経験の開発業務が始まってしまうため、入社先で使っているフレームワークを嫌々触り始めたのだった…
~~こいつはくせえッー！インストールでドハマるにおいがプンプンするぜッーーーーッ！！~~

####そもそもPhalconとは？
・数あるPHPフレームワークで、処理速度最速に君臨。
・MVCモデルが採用され、シンプルなディレクトリ構成で、ぱっと見でもわかりやすくフレームワーク全体の見通しが良い。
・ソースコードの構成も自由が効き、色々なところで機能を実装しても動く。

####でも、いいことばっかりじゃないんでしょ？
・英語圏ではそこそこ人気があるが、日本では活発に使用されておらず、ドキュメントがところどころ日本語に訳されいない。
・自由なソースコード構成が可能な反面、しっかりとした設計にして開発をしないとクソコードが量産される。~~そう、筆者のようにね~~
・ドキュメントには必要最低限のことしか書かれていない。良くも悪くも中上級者向け。


##今回の事象で学んだ大切なこと
・インストールには必要な要件、必要な設定があるため、<b>読み飛ばしてはいけない</b>
・エラーが出たら、<b>何が</b>エラーを出して、<b>どんなことが</b>原因で出ているのか把握すること
・自分が扱っているソフトのコマンドを多少なりとも知っておくこと
・自分のやってる作業の出力は逐一見ること
・<b>詳しい人達にさっさと聞く</b>~~身もふたもないけど~~

後ほど改めてまとめます。


#如何にしてPhalconのインストールに失敗したのか

###環境
OS：macOS Mojave 10.14.2
パッケージマネージャー：Homebrew
PHP：7.3.0

###やりたかったこと
PhalconとPhalcon Devtoolsをインストール。ターミナルでバージョンを表示させること。

##ハマるまでの雑な回想
さーていっちょPhalconインストールして、なんか動かしてみるか〜
↓
公式ドキュメントのインストールページを雑に見る
↓
え〜っとMacは…あったあった。お、Homebrewでインスコできんのか！コマンド叩こ！
↓
5個並んでる…？PHP72書いてるけど7.3やし動くやろ！
↓
さ〜終わったし、Phalcon Devtools入れるやで。
↓
お、今度はGitリポジトリからCloneしてコマンド叩くんやな。おっけーおっけー
↓
ERROR: Phalcon extension isn't installed, follow these instructions to install it: https://docs.phalconphp.com/en/latest/installation
↓
うひゃあ〜〜〜〜〜〜〜〜（腰を抜かす
↓
ここに来て公式のインストールドキュメントを見返し、brewのコマンドに「brew install php72-phalcon」であったことを思い出す
↓
てことはPHP7.2じゃなきゃ動かん言うこと…？入れ直さな…
↓
お、brewでPHP7.2入れられるやん入れたろ
↓
PHP入れ直したで、動いてくんろ〜
↓
ERROR: Phalcon extension isn't installed, follow these instructions to install it: https://docs.phalconphp.com/en/latest/installation
↓
（白目
↓
公式を再度読み直し、php.iniに設定を書き加える必要があることに気がつく
↓
設定し直したから、動いてね？
↓
ERROR(ry
↓
…もう一度公式読も…
↓
ここで必要条件のところに拡張機能が指定されていることに気がつく
↓
拡張機能…なんだそれ…
↓
様々調べ、PHPには拡張機能があると知る
↓
拡張機能を有効化しようとしたところエラー
↓
PHPにはビルドが存在し、そもそも拡張機能を付帯させるかどうかも決められるため、ビルドからやろうと思い至る
↓
ビルドでエラー地獄

…今見返しても酷い。

##解決した方法
結果だけ書きますと
・<b>エンジニアの方々がいらっしゃるSlackコミュニティで質問</b>
・もっと簡単にできるはずとアドバイスをもらう
・一旦真っ白な状態に戻すため、brewでインストールしたPHP7.2を削除
・`php -m`コマンドを教えてもらい、必要な拡張機能が有効化されていることを確認
・`find / -name *phalcon.so`のコマンドを教えてもらう
・php.iniに`extension=/*findコマンドで出てきたパス*/phalcon.so`と記載
<b>インストール成功！</b>

3日悩んでましたが、Slackで質問して、状況が把握できた後は20分くらいで作業が終了しました。

##まとめ
上記でも少し触れましたが、今回の失敗の発端は、インストールの公式ドキュメントを雑に読んだことが始まりでした。
インストールには必要な条件、細かく設定が必要な場合があるので、ググってわからない場合はさっさと聞くのが良いでしょうね。
（今回はかなり遠回りしましたが、ググってわかる場合も多々あります）
また、それらのインストールに必要とされるソフトウェアだったりOSなりは、便利なコマンド群があるので、十二分に調べて活用しましょう！というお話でした。

####参考記事
公式ドキュメント
(https://phalconphp.com/ja/)
MVVMでウインドウを閉じる

#やりたいこと
ViewModelからウインドウを閉じる。

#実装
ウインドウを閉じるアクションを作成する。

```c#:アクション
using System.Windows;
using System.Windows.Interactivity;

namespace Sample {
    public class CloseWindowAction : TriggerAction<FrameworkElement> {
        protected override void Invoke(object parameter)
            => Window.GetWindow(AssociatedObject).Close();
    }
}
```

#使い方

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject="{Binding CloseWindowRequest, Mode=OneWay}">
            <local:CloseWindowAction/>
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <TextBox />
    </Grid>
</Window>
```

```c#:ViewModel
using Prism.Interactivity.InteractionRequest;
using System.Windows;

namespace Sample {
    public class MainViewModel {
        public InteractionRequest<Notification> CloseWindowRequest { get; }
            = new InteractionRequest<Notification>();

        private void CloseWindow()
            => CloseWindowRequest.Raise(null);
    }
}
```
Githubの無料プライベートリポジトリに移行してみる

これまでGithubの無料枠では誰でも見れてしまうパブリックなリポジトリしか使えませんでしたが、2019年1月8日にプライベートリポジトリが無償で作成できるようになりました🙌

これまでGithubのプライベートリポジトリ有償なので、GitlabやGitbucketを使っていたという開発者も多かったと思います。これは開発者にとって朗報です（ありがとうGithub、ありがとうマイクロソフト！）

これを機に個人で開発しているサービスなどバージョン管理していたリモートリポジトリをGithubに移行してみたいと思います。その手順をまとめてみました。

※ この記事はGithubに接続できる前提になっています。接続(ssh、https)ができない場合は下の記事を参考にするといいとうまくいくかもしれません。

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce) @shizuma

[Githubに接続できない時の対処法
](https://qiita.com/nyanchu/items/32d65c4c36315b876d38) @nyanchu

## Githubでリモートリポジトリを作る

### リポジトリ作成

まずGithubにログインしてヘッダーの「New repository」をクリックします。

<img width="915" alt="スクリーンショット 2019-01-10 21.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/0fd8bfce-d4d2-6753-de0e-7c029e20c9dc.png">

「New repository」を押下後に、「Repositoryname」を入力した後に、リポジトリを「Private」にします。その後「Create repository」をクリックします。これでプライベートなリモートリポジトリが完成です。

<img width="744" alt="スクリーンショット 2019-01-10 21.53.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/85df6784-8f56-ffae-2e42-1d033dd7c8a4.png">

完成したらhttpsかsshのプロトロコルをコピーします。これで下準備は完了です。

<img width="1024" alt="スクリーンショット 2019-01-10 21.53.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/36c600d2-75ec-b86a-2cf1-4f203035c0b5.png">


## 作業リポジトリをプッシュ

* 既存のリモートリポジトリを確認

```
$ git remote -v
origin ssh://example@example.ne.jp/home/example/www/git/hoge (fetch)
```

* 既存のリモートリポジトリを削除

```
$ git remote rm origin 

$ git rmeote 
# 何も表示されないはず
```

* Githubのリモートリポジトリを追加

```
$ git remote add origin https://github.com/FujiyamaYuta/example_project.git

# Githubのリモートリポジトリを確認
$ git remote -v
origin	https://github.com/FujiyamaYuta/example_project.git (fetch)
origin	https://github.com/FujiyamaYuta/example_project.git (push)
```

* Gtihubのリモートリポジトリへpush
※ 適宜pushするブランチを選んでください。

```
$ git push origin master
```

## 確認

Githubの管理画面を確認してみます。
ソースがpushされているのが確認できます。

<img width="1067" alt="スクリーンショット 2019-01-11 8.05.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/bf375273-d5fd-8d66-38c9-f39386bba286.png">

contributions（草）の方も引き継がれるのはうれしいですね！
（ただ、おそらくですがgit configに設定されているメールアドレスとGithub側に登録しているメールアドレスが同じでないと、contributions引き継がれないっぽいです）

<img width="785" alt="スクリーンショット 2019-01-11 8.13.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/100c9005-dd40-207a-6a16-52b6a7ff36cd.png">


##  まとめ

Githubの無料枠プライベートリポジトリはとても嬉しいですね。ただ、全ての機能が使えるわけではないので、移行するかどうかはきちんと見極めたいところですね。個人的には無料枠でプライベートリポジトリを使ってみて、よければ課金してみたと思っています。

## 参考

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce) @shizuma 

[Githubに接続できない時の対処法
](https://qiita.com/nyanchu/items/32d65c4c36315b876d38) @nyanchu
【MySQL】5.7からは実行中のクエリのEXPLAINが取れるんです！

# MySQL5.7以降では実行中のクエリのEXPLAINが取れる

誰かさん(人じゃないかもしれないけど)が非常に重いクエリを流してたとする。
しかもそれは処理が終わってないとスロークエリに出ないので、EXPLAINで実行計画確認したくても5.6まではできなかった。
(PROCESSLISTのInfoはクエリの全体は見えないことが多いから)

### でも、5.7からは取れるんです。

## 取り方
#### SHOW PROCESSLIST;
で実行中のクエリのIDを取得しましょう。

![1枚目(モザイク).png](https://qiita-image-store.s3.amazonaws.com/0/136073/cf932ad7-ff4f-e6ee-ea9c-3ec490f954c7.png)

(※社内DBの情報部分についてはぼかして表示しています)

上の例だと **1670163** ですね。

#### EXPLAIN for connection \<ID>
で今実行中のクエリのEXPLAINが取れるんです。

`EXPLAIN for connection 1670163`

と入れて実行すると以下のように実行計画が確認できます。

![2枚目(モザイク).png](https://qiita-image-store.s3.amazonaws.com/0/136073/453cd869-5ac9-bd0b-1d65-b449fdd4b54c.png)


上の例だとインデックスは利いてるんだけど一行目にあるテーブルが刈り込まれてないんだなー、ということが分かります。

### ちなみに
ここで少し残念なのは **Visual EXPLAINで表示できない** ことですかね。

### とはいえ、
もし、実行中のクエリがshow processlistで見つかって、そのMySQLのバージョンがMySQL5.7以上ならぜひ使ってみてください。

# 参照
https://dev.mysql.com/doc/refman/5.7/en/explain-for-connection.html
https://dev.mysql.com/doc/refman/8.0/en/explain-for-connection.html
PowerApps でConnpass簡易受付アプリを作る #03

昨年2018年12月22日に開催された「Power BI 勉強会#11」で利用していた、PowerAppsで作成したConnpass簡易受付アプリの作り方をStep by Stepで紹介しています。第3回目は、データを一覧へ表示して、検索ができるように設定します。

#前回まで
[＃01](https://qiita.com/yamad365/items/9b005f58bb9db32a75d9)
[＃02](https://qiita.com/yamad365/items/c0ece19ab5919b934a0e)

# ギャラリーコントロールへデータ ソースを指定
1. データソースの追加
該当コントロールを左ペインのツリーから選択 ＞ プロパティより［フィールド］選択 ＞ データソースの箇所で［∨］ ＞ ［データソースの追加］押下
![01.png](https://qiita-image-store.s3.amazonaws.com/0/215892/4c6be3c8-824c-0c7b-bb30-98f867674d21.png)

2. ［新しい接続］を選択
既に一覧へ表示されている場合は、そちらを選択いただいても構いません。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/215892/aae2967f-7d9d-f9fb-c639-a366cec171b1.png)

3. OneDrive for Business（ODfB）を選択
![03.png](https://qiita-image-store.s3.amazonaws.com/0/215892/916a1d8e-4441-09da-3568-7a99b829fd0b.png)

4. 該当のExcel内テーブルを指定
![04.png](https://qiita-image-store.s3.amazonaws.com/0/215892/99a46502-95f2-1db5-eb9a-97d042d6625f.png)
これで指定したデータソースの内容がギャラリーコントロールに表示されるハズです。

5. 一覧の表示内容を変更
下イメージのようにデータソースから［受付番号］、［ユーザー名］になるよう設定変更。また、イイ感じに両方が横並びになるようデザインを変更してください。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/215892/77fe7098-c405-dbb3-f5f8-971bf4f12906.png)

これで、ギャラリーコントロールへデータソースが指定できたので、一覧が表示されるようになりました。

# 検索の実装
画面上に一覧でデータが表示できるようになったので、このデータに対して検索を可能にしていきます。

1. 該当コントロールを選択 ＞ ［Items］プロパティを選択
![07.png](https://qiita-image-store.s3.amazonaws.com/0/215892/cad214f9-4d0b-e596-196d-edf143866707.png)

2. 下記を［Items］プロパティへ設定

```Gallery1.Items
Search(Search(UserList,TextInput1.Text,"受付番号"),TextInput2.Text,"ユーザー名")
```

検索用の受付番号キーワードで検索した結果を、さらにユーザー名キーワードで検索している、と表現すれば伝わるでしょうか？（ここらへんのロジックを文章で伝えるのは非常に難しい・・・。全ては上記ソース≒関数 で明示されているので、それを超える説明は無い気がするｗ）
業務アプリでよくある「検索ボタンを押下したら絞り込まれる」という動作ではなく、検索用のテキスト入力コントロールへ値が入力された瞬間に絞り込まれます。

 ■参考URL
  [PowerApps の Filter、Search、および LookUp 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-filter-lookup)

# 動作イメージ
この段階での動作はこんな感じです。
![メディア1.gif](https://qiita-image-store.s3.amazonaws.com/0/215892/738020c6-85c7-95a6-6f53-9193cdcfe2b4.gif)
［受付番号］と［ユーザー名］で曖昧検索が実施されます。入力された値にマッチした場合は、ギャラリーコントロールの一覧が絞り込まれているのがお分かりいただけるかと思います。

これで参加者が受付番号、またはユーザーIDを提示してくれたタイミングで絞り込みが可能になりました。次は、受付の処理など仕上げに入っていきます。

[＜＜前回＃02](https://qiita.com/yamad365/items/c0ece19ab5919b934a0e)
[次回＃04＞＞](https://qiita.com/yamad365/items/2e0a71e3b2e92c5fb259)
【Redmine】チケットIDの変更

#### チケットIDを変更する

```sql

mysql> select auto_increment from information_schema.tables where table_name = 'issues';
+----------------+
| auto_increment |
+----------------+
|            540 |
+----------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql>
mysql> alter table db_redmine.issues auto_increment = 600;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> select auto_increment from information_schema.tables where table_name = 'issues';
+----------------+
| auto_increment |
+----------------+
|            600 |
+----------------+
1 row in set (0.00 sec)

```
関数定義におけるmutableなデフォルト引数 ~python学習1.02~

#デフォルト引数
mutableなデフォルト引数は気を付けないといけないことがあるらしい

##デフォルト引数とは
関数定義にて、デフォルト値(初期値)を与えておくというものです。
デフォルト引数を用いることにより、関数で定義している引数よりも少ない引数で関数を呼び出すことができます。

```qiita1.py
>>> def sample(self, number1=10, number2=20):
...     print(self, number1, number2, sep=", ")

>>> sample("sampleString")
sampleString, 10, 20
```

ここで、デフォルト引数にあたる引数は第二引数と第三引数です。

##デフォルト値は1度しか評価されない
気を付けなければならないのは、デフォルト値が1度しか評価されない点。
どういう場面で問題が起きるかというと

```qiita2.py
>>> def f(name, L=[]):
...     L.append(name)
...     return L

>>> print(f('吉岡里帆'))
['吉岡里帆']

>>> print(f('吉高由里子'))
['吉岡里帆', '吉高由里子']

>>> print(f('のっち'))
['吉岡里帆', '吉高由里子', 'のっち']
```

第二引数のLは[]でデフォルト値が設定されているが、2回目のf()関数呼び出し時に吉岡里帆が残っている。
同様に、3回目のf()関数呼び出し時には吉岡里帆と吉高由里子が残っている。

公式ドキュメントにある警告文には、

"デフォルト値は 1 度だけしか評価されません。デフォルト値がリストや辞書のような変更可能なオブジェクトの時にはその影響がでます"

とありました。


これを解決するためには以下のようにコーディングするらしい。

```qiita3.py
>>> def f(name, L=None):
...    if L is None:
...        L = []
...    L.append(name)
...    return L

>>> print(f('吉岡里帆'))
['吉岡里帆']

>>> print(f('吉高由里子'))
['吉高由里子']

>>> print(f('のっち'))
['のっち']
```
何が変わったかと言うと、デフォルト値が[]からNoneに代わりました。
[]をデフォルト値とすると、Lは変更可能なリストオブジェクトとなりますが、
Noneをデフォルト値とすると、Lは変更可能なオブジェクトではなく、Noneオブジェクトとなり、解決されています。

Noneとは、Javaでいうnullみたいなものらしいです(厳密にはちがう？)。

##疑問
デフォルト値は１度のみの評価であるのに、なぜ２回目の呼び出し時にLはNoneオブジェクトを保持しているのか。
・L=[]で、仮引数であるLの参照がNoneオブジェクトから新規作成されたLのリストに移っている...？
・Pythonのスコープがわからないので疑問のまま...

#開発環境
Windows10 64bit
Python 3.7.1
PyCharm 2018.3.2


#参考資料
学習に用いているものとして、以下の２つがメインです。
・[詳細! Python 3 入門ノート](https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0-Python-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-%E5%A4%A7%E9%87%8D-%E7%BE%8E%E5%B9%B8/dp/4800711673/ref=sr_1_1?ie=UTF8&qid=1546995770&sr=8-1&keywords=%E8%A9%B3%E7%B4%B0%21Python3%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88)
・[Python公式ドキュメント](https://docs.python.jp/3/tutorial/index.html)
基本情報技術者は取得しても意味がないと言う人にメリットを伝えたい

# 初めに
エンジニアの世界では、
「基本情報は持ってても業務に役立たない」
とよく言われますが、
基本情報技術者試験に合格できるだけの知識を身に着けた結果、
実業務にどのような影響があったのか書いていこうと思います。

# 著者について
2018年に未経験でこの世界に入ってきた新卒1年目のエンジニアです。
普段はJava（フレームワークはSpring）を使用したPJTの保守業務を行なっています。

入社した春に基本情報、秋に応用情報を取得しました。
その結果結構メリットあったなーと思ったので、
まだ基本情報技術者資格を持っていない若手のエンジニアに向けて情報共有してみようと思って投稿することにしました。

# 基本情報技術者試験で求められる知識
基本情報技術者試験で求められる知識は一言で言えば、
「とても広く、とても浅い」です。
例えば、FILO「First in Last Out」という単語の意味は答えられるようにならないといけないですが、
どのような条件でこれを使うべきかまでは知らなくても良いということです。
基本情報に合格しようと思ったら、ひたすら過去問をといて単語を覚えていくのが最短ルートであるため、
「○○？　あー△△のことでしょ。(なんのためにあるのかわからないけど)」
という半端な知識が大量に生まれます。
このような知識をいくら持っていても業務で役立つわけないので、
冒頭の「基本情報は持ってても業務に役立たない」に繋がるわけです。

#ではメリットは？
この記事では、会社から報奨金がーとか言わないですよ笑
僕が基本情報を取得してよかったなと思った経験を書いていきます。

メリット①
「上司の話が理解しやすくなる」
研修を終えて、現場に配属された時に既に基本情報をもっていました。
同じ現場に配属された同期は取得していなかったため、一歩リードしている感覚でした。
しかし、蓋を開けてみると、同じように現場で何もできないんですね。
ただ唯一の違いは、
上司からの説明を聞いている時に「あっこの単語聞いたことある。基本情報でやったやつだ！」
となり、点でしかなかった基本情報の知識が線となって繋がります。
一方、基本情報の勉強をしていないと、説明の中で知らない単語が多々出てきて、
その度に頭の中に「？」が浮かぶので理解がそこで止まります。

メリット②
「知識を積み上げていきやすくなる」
情報技術は横の繋がりが強く、データベースに関して知らないことは何もない。
だけど、ネットワークについては何も知らないみたいなことにはならないので、
関係無いと思われる分野の勉強をしていても、基本情報でやった勉強が思いのほか役に立ちます。
これはピラミッドの一段目に基本情報の知識があるイメージですかね。
何も無い状態から、特定の分野だけピラミッドの最上段まで知識を高めることはできません。
土台が大事ですね。

メリット③
「低レイヤーの技術を身につけるきっかけになる」
高い技術力を持ったエンジニアになるには、
プログラミング力だけでなく、低レイヤーの技術からしっかり身につけていく必要があります。
書籍などで勉強してく必要がありますが、
低レイヤーの技術について書かれている本を読むと一つ目のメリットでお話した、
「点の知識が線で繋がる」がよく分かると思います。

#まとめると
基本情報は取得しただけだと確かに役立つ場面は少ないと思いますが、
知識を積み上げていくための土台として、
キャリアの初めに勉強するメリットはとても大きいと思います。
エンジニアとして共に咲きましょう。
【defaults】スクリーンショットによりDesktopが汚れることを防ぐ設定[macOS]

#**はじめに**
スクリーンショットを撮ることでデスクトップが汚れてしまうことが嫌な方は、下記のように設定することで**デスクトップが散らかるのを防ぐ**ことができます。

設定の前にMacでのスクリーンショットに関して簡単に言及しておきます。

#**スクリーンショット**
個人的にはスクリーンショットを撮る目的は次の２つであると考えています。
1. **画面を断片的にシェアしたいとき（対コミュニケーション）**
2. **情報を保存しておきたいとき（対自己メモリ）**

それぞれの目的別のショートカットキーは次のようになります。

###**ショートカットキー**
- 画面を断片的にシェアしたいとき（対コミュニケーション）
    - `command + shift + control + 4`
- 情報を保存しておきたいとき（対自己メモリ）
    - `command + shift + 3`

**controlを付与することで、clipboardに保存することができる**ので、シェア目的にスクリーンショットを撮るときには重宝します。また、**3ではなく4を利用することでキャプチャ画面の保存を防ぐこと**ができます。

#**設定の流れ**
##**1. フォルダ作成**
デスクトップにスクリーンショット画像を保存しておくためのフォルダを作成します。名前はなんでも構いません。

```
$ mkdir ~/Desktop/screencapture
```
##**2. 設定ファイルへの書き込み**
mac内部の設定を変更するには`defaults`コマンドを使用します。
`defaults`は**plist**と呼ばれるアプリやシステムの設定ファイルに、設定値を追加、変更、削除、検索することができるコマンドです。

`defaults write`コマンドによって、**設定値を追加・変更**することができます。
ここでは設定項目として**location**を指定しています。

```
$ defaults write com.apple.screencapture location ~/Desktop/screencapture
```
##**3. 設定を確認**
`defaults read`コマンドによって、**設定ファイルの内容を表示**することができます。

問題なく設定されたか確認しましょう。
**注：defaultsコマンドは /Library/Preferences以下のplistファイルを参照します。**
そのため、コマンドを実行するカレントディレクトリはどこでも構いません。

```
$ defaults read com.apple.screencapture.plist
{
    location = "/Users/furukawatakuya/Desktop/screencapture/";
}
```

#**おわりに**
ファイルシステムをハックすべく精進していきたいと思います。

こちらの記事が役に立ったという方はいいね、お願いします(^^)
TwitterをIFTTTでSlack連携。四個チャンネルを作成。自分のツイートだけ or リプライ込み。テキストだけ or リンクありの全バージョン。

TwitterをIFTTTでSlack連携。四個チャンネルを作成。自分のツイートだけ or リプライ込み。テキストだけ or リンクありの全バージョン。

# メリット



# Twitter

![image](https://user-images.githubusercontent.com/13635059/51001634-f063b780-1573-11e9-86c9-27eb6e120d9f.png)

https://twitter.com/YumaInaura/status/1083486779322228736

# Slackで四個のチャンネルを作って一斉に連携中

どれがいいかためす。もしくは全部使い続ける。

# 自分のツイートのテキストだけ

- ブログなどに簡単にコピペできる
- 短時間での投稿はまとめられて、複数のツイートをひとかたまりに扱える
- テキストとしての扱い安さがある
- Twitterで自分へリプライをつなげてチェーンする場合も、こちらに入ってくるっぽい、助かる

![image](https://user-images.githubusercontent.com/13635059/51001690-1b4e0b80-1574-11e9-93ae-35860eace504.png)


# 自分のツイートのテキスト+リンク

- ブログなどに簡単にコピペできる
- 自分のツイートを記録するには良い感じ

![image](https://user-images.githubusercontent.com/13635059/51001674-0ffae000-1574-11e9-9781-e5d12cbfdeac.png)

# Slack リプライ込み + テキストだけバージョン

- リプライから着想が湧く場合もあるので、ブログ書く用に参照できるようにしておく

![image](https://user-images.githubusercontent.com/13635059/51001743-53ede500-1574-11e9-97ca-f8230afd2288.png)

# Slack リプライ込み +  リンクつきバージョン

- とにかく全部記録する、参照できるようにしておく

![image](https://user-images.githubusercontent.com/13635059/51001719-39b40700-1574-11e9-9c13-eb113580a08b.png)

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Unicodeの丸数字（①とか）でやられた件

:::note warn
記事の内容上、機種依存文字を使用しているため、
環境によっては文字が読みづらい状況となっていますがご了承くださいm(_ _)m
:::

# はじめに
みなさん、丸数字というもの使っていますか？？
`①`みたいに数字をまるで囲んであるやつです。ちなみに`㊿`まで存在します。

そんなに進んで利用することも少ないと思いますが、
今回要件でリストの上から順番に丸数字を振ってほしいとリクエストが有りました。

「ただ連番降るだけっしょ！」と取り掛かったのですが、
考えていた実装と異なる内容になったのでよかったら参考にしてください。

# 実装
まず`㊿`までしかないです！ってことで、`㊿`までで良いとお許しをもらえました。
とりあえず一安心:relaxed:

## 実装その①

`①`のコードを取得して順に足していけば、それっぽくなるだろうという考えから
↓のようなコードを書きました（JavaScriptです）

```javascript
function toCircled(num) {
  const base = '①'.charCodeAt(0);
  return String.fromCharCode(base + num - 1);
}
// 入力チェックは省略
```
それっぽい関数もできたのでいざ動作確認

```javascript
for (let i = 1; i <= 50; i++) {
  console.log(toCircled(i));
}

// ①
// ②
// ③
// ...   いい調子！
// ⑲
// ⑳
// ⑴    ！？
// ⑵    ！！？？
```

`⑳`から先で違うパターンの数字が出てきたー:scream:
`㉑`から別の場所にあるのか...

### コード値を調べてみる

```javascript
'①'.charCodeAt(0); // -> 9312
'⑳'.charCodeAt(0); // -> 9331
'㉑'.charCodeAt(0); // -> 12881
```
だいぶ飛んでる。
２０で条件分岐するようにします！

## 実装その②

２１以上の場合は`㉑`を基準にするように変更しました。

```javascript
function toCircled(num) {
  if (num <= 20) {
    const base = '①'.charCodeAt(0);
    return String.fromCharCode(base + num - 1);
  }
  const base = '㉑'.charCodeAt(0);
  return String.fromCharCode(base + num - 21);
}
```
いざ動作確認

```javascript
for (let i = 1; i <= 50; i++) {
  console.log(toCircled(i));
}

// ①
// ...
// ⑳
// ㉑    よっしゃ！！
// ㉒
// ...
// ㉞
// ㉟
// ㉠    ！？
// ㉡    ！！？？
```

３６にまた見えない壁があったのか...
ここでようやくGoogle先生にご相談　
Wikipadiaにまさに[丸数字のページ](https://ja.wikipedia.org/wiki/%E4%B8%B8%E6%95%B0%E5%AD%97)が！！！

最初に２０で躓いたときに見るべきでした:weary:

## 実装その③ （最終版）

```javascript
function toCircled(num) {
  if (num <= 20) {
    const base = '①'.charCodeAt(0);
    return String.fromCharCode(base + num - 1);
  }
  if (num <= 35) {
    const base = '㉑'.charCodeAt(0);
    return String.fromCharCode(base + num - 21);
  }
  const base = '㊱'.charCodeAt(0);
  return String.fromCharCode(base + num - 36);
}
```
これで動くはず...っ！！


```javascript
for (let i = 1; i <= 50; i++) {
  console.log(toCircled(i));
}

// ①
// ...
// ㉟
// ㊱    やったー！
// ㊲
// ...
// ㊿
```

# あとがき
２,３行で終わると思っていたので、ここまで大きくなるとは思っていませんでした。
そして最初につまずいた段階で「他にもあるのでは...?」という疑問を持てなかったことが今回の敗因です。

もし何かの参考になればと思います( ˘꒳˘  )

おしまい
rqtのpluginでステートマシンのグラフを表示する

# はじめに
ROSでステートマシンを作るのに[smach](http://wiki.ros.org/smach)ライブラリが使用される。

状態を可視化するために[smach_viwer](http://wiki.ros.org/smach_viewer)
がある。

smach_viewerは独立した画面で起動してくるが、rqt内で呼びたくなったので、rqt内で動かす手順を解説する。

# rqt_smach
rqt_smachというパッケージで実現できる。

## インストール方法
[gistの解説](https://gist.github.com/matt3o/88bced95dba37a8932a51904d0734dff)の通りにインストールする。

使っているcatkin workspaceで以下を実行する。
ここでは、~/catkin_wsだとすると

```
cd ~/catkin_ws/src
git clone https://github.com/matt3o/xdot.git
git clone https://github.com/jbohren/executive_smach.git
git clone https://github.com/matt3o/executive_smach_visualization.git
cd ~/catkin_ws
catkin_make
```

これで、rqt_smachが使用できるようになっています。

# 使い方
1. 直接rqt_smachを起動する

```
rosrun rqt_smach rqt_smach
```

2. rqtを起動してから、プラグインを選択する(画像参照)

```
rqt
plugins→control→smach
```
![rqt_smach](https://qiita-image-store.s3.amazonaws.com/0/99189/385e9fef-c7a3-b6f6-b389-a1e4c7b09907.png)
Ubuntu上で、Django開発

[Vagrantで立ち上げた仮想マシンの中にあるプロジェクトをAtomエディタで編集する方法](https://bake0937.hatenablog.com/entry/2017/02/28/012502)

参考になりました。

pipのインストールと、バージョンに詰まった。

[pipに--userをつけた時のインストール先を変える](https://qiita.com/ronin_gw/items/cdf8112b61649ca455f5)

```bash
$ sudo apt install python3-pip
```

https://www.python.jp/install/ubuntu/pip.html
麻雀の点数判定アプリを作る#5

#YOLOの環境構築
YOLOにはv2とv3のバージョンが存在します．今回はv2を使うことにします．

まずはgitからローカルにクローン．

```
git clone https://github.com/pjreddie/darknet.git
```

DarknetはC言語で書かれた機械学習フレームワークで，YOLOはこのフレームワークで実装されています．

```
cd darknet
gedit Makefile
```
`darknet`ディレクトリに移動し，`Makefile`を編集．
1行目と3行目の`GPU=0` `OPENCV=0`を`GPU=1` `OPENCV=1`に変更します．
これは学習を行う際に`GPU`を使い，また検出した物体に対してバウンディングボックスを描画する際に `OPENCV`を使うことを表しています．
変更が完了したら保存してコンパイル．

```
make
```
あらかじめ用意されたサンプルでYOLOを使ってみます．

```
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
```
`detect`はモードをしており，学習の場合は`train`とします．
`cfg/yolo.cfg`はコンフィグファイルで，ハイパーパラメータを記述します．
`yolo.weights`は学習済みモデルで，既に20個のクラスが学習済みとなっています．
`data/dog.jpg`は検出に用いる画像ファイル．
![130.jpg](https://qiita-image-store.s3.amazonaws.com/0/335220/698787c0-faee-6d5b-a84d-113e7702f419.jpeg)
出ました．犬と自転車と車．バチッと検出されています．

#カスタムデータで学習するには
任意の物体を検出するには，新たに学習を行う必要があり，特にその下準備が肝となるようです．

- 
データベース
 - 各データには物体のクラスと位置を与えるアノテーション(ラベル)が必要．手作業で行わなければなりません．

- コンフィグファイル
 - 前述の通り，クラスの数やハイパーパラメータを記述します．

- クラスファイル
 - クラスを記述します．

- パス指定ファイル
 - 教師データ，学習データ，クラスファイル，バックアップのパスを指定します．

- 重みの初期値データ
 - 初期値に適当な重みを与えると学習が収束しやすくなるそうです．

参考:
YOLOv2を使って自前のデータを学習させて認識させるまで。
http://shibafu3.hatenablog.com/entry/2017/08/24/124826
YOLOオリジナルデータの学習
http://takesan.hatenablog.com/entry/2018/08/16/013452
YOLO V3：オリジナルデータの学習
http://demura.net/misc/14458.html


#【次回】方針が立ったので，作業あるのみ
次回より，麻雀牌の画像を使ってデータベースを作成します．
準備ができてしまえば，あとはマシンに任せるだけです．