OmniAICreator/Qiita-1.07M huggingface dataset:
Windows で rsync を利用する（cwRsync）

#はじめに

Linuxでパス同士を同期をするためによくRsyncを使ったりすると思いますが、これをWindowsで使いたいなと思ったのでしらべてみた覚書です

#同期手段について

Windowsにてパスを同期する方法として有名なのは、いろいろあります。

- xcopy

標準のコマンドなので、これを使っている人も多いかと。

```
xcopy e:\from f:\to\ /D /S /E /H /C /Y /R
```

※UNCパス(\\192.168.0.100\public みたいな)も指定できるので、NAS/ファイルサーバ/リモートPCとの同期も可能

- robocopy

同じくWindows標準コマンドで、こちらは255文字以上のファイル名に対応しているで、日本語ファイル名などがある場合はこちら

```
robocopy e:\from\ f:\to\ /S /E /XO /NP /NDL /R:0 /XO /XD "e:\$RECYCLE.BIN" "e:\from\hogehoge" /LOG:c:\copy.log
```

※同じくUNCパス(\\192.168.0.100\public みたいな)も指定できるので、NAS/ファイルサーバ/リモートPCとの同期も可能

- Bunbackup

個人から商用にいたるまで、知名度はかなり高いフリーウェアの1つかと思います。
http://nagatsuki.la.coocan.jp/bunbackup/
正直なところ、こだわりがなければこれでも問題ないのですが…UNCパスも指定できますし。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114928/1ac5c43d-a893-d193-79c3-7c27439cf2cb.png)

- cwRsync 

cwRsync は Windows で Rsync を動作させるための Cygwin 環境をパッケージしたソフトウェア。
ssh などのプログラムも含まれているので、cwRsync パッケージをインストールするだけで rsync をひと通り使うことができる。
cwRsyncの利点はLinux や Mac の rsync コマンドと同じ書式で使うことができること。くらい。

製作元はこちらですが、現在Freeware版のリンクが切れている
https://www.itefix.net/home

入手方法
Cocolareyを使ってインストールする。
https://chocolatey.org/packages/rsync/5.5.0.20180618

```
choco install rsync
```

大まかな使い方は、Rsyncと同じ、cygwinがベースなのでドライブレターが/cygdrive/ドライブ/になるところに注意をするくらい
インストール先はchocoを使った場合任意の設定になるので環境変数CWRSYNCHOMEはそれに合わせる。

``` cwRsync.bat
@ECHO OFF
SETLOCAL
SET CWRSYNCHOME=C:¥cwRsync
SET HOME=%HOMEDRIVE%%HOMEPATH%
SET PATH=%CWRSYNCHOME%¥bin;%PATH%

rsync -av -e ssh foo@192.168.1.2:/home/vagrant/source /cygdrive/c/Users/vagrant/dest

rsync -rv --delete ^
--exclude "./svn/*" ^
--log-file "/cygdrive/c/Users/vagrant/rsync.log" ^
rsync://192.168.1.2/home/www ^
/cygdrive/c/inetpub/wwwroot

pause
```

#さいごに

正直、標準コマンドならrobocopyを使えばいいですし、WSL環境ならUbuntuのrsyncが使えます。なので、わざわざ苦労してrsyncコマンドを個別に入れなくてもいいのでは・・・と、これを書きながら思ったのですが、覚書として残しておくのは悪くないかなと…Windows7や古いWindowsを使っているところも少数ながらありますので(言い訳
・・・誰かの参考になれば幸いです
release の単位に対して git tag を切る

release の単位に対して git tag を切る

- コミット単位ではなく、 release に対して git 的な履歴を取る
- deploy のたびに git tag を切って remote に push しておく  Githubとか
- Jenkins で適当に git コマンドを叩いたりして自動化

---

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 -->
macのterminal設定 (iterm2 & zsh、テーマはIceberg)

新しいmacを買ってterminalの設定(iterm & zsh、テーマはIceberg) をし直したのでメモ

# iterm2のインストール&設定
## インストール
https://www.iterm2.com/
ダウンロードしてアプリケーションフォルダに突っ込む。以上。

##  iterm2のテーマ変更
[Iceberg](https://github.com/Arc0re/Iceberg-iTerm2)
GitHubのReadmeにしたがってインストール

ついでに、[Iceberg作成者作成のterminalへの適用手順](https://cocopon.me/blog/2014/04/iceberg-for-terminalapp/?p=4862)を参照してターミナルのテーマも変更しておいた。

# Homebrewのインストール
[Homebrew](https://brew.sh/index_ja.html)をインストール

```bash:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# zsh&zplugをインストール
## zshインストール
[参考記事](https://qiita.com/akashima/items/bdcde778644086533ade)

```bash:
brew install zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting colordiff reattach-to-user-namespace tmux
```

## zplugインストール
zshのプラグイン管理ツールの[zplug](https://github.com/zplug/zplug)をインストール

```bash:
brew install zplug
```

zshrcに以下追加(brew install時にメッセージで教えてくれた）

```zsh:.zshrc
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh
```

##.zprofile .zshrcの設定
.zshの設定ファイルの種類と詳細は[こちら](https://qiita.com/muran001/items/7b104d33f5ea3f75353f)参照

今回は以下を設定

```zsh:.zprofile
# 補完機能
autoload -U compinit
compinit

# コマンド履歴
HISTFILE=~/.zsh_history
HISTSIZE=6000000
SAVEHIST=6000000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data

# コマンド履歴検索
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# alias
alias diff="coloddiff"
```

```zsh:.zshrc
# zplugの設定
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh

# syntax
zplug "chrissicool/zsh-256color"
zplug "Tarrasch/zsh-colors"
zplug "zsh-users/zsh-syntax-highlighting"
zplug "ascii-soup/zsh-url-highlighter"

# 未インストール項目をインストールする
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi

# コマンドをリンクして、PATH に追加し、プラグインは読み込む
zplug load --verbose

# zplugの設定ここまで
```

```bash:
source ~/.zprofile
source ~/.zshrc
```

## ログインシェルをbashからzshにshell変更
システム環境設定からユーザとグループを選択し、鍵のチェックを外す。
該当ユーザに対し、副クリック(Control+クリック)で、詳細オプションを表示し、
ログインシェルを/bin/bashから/usr/local/bin/zshに切り替える。

# プロンプトをpureに変更
## pureって？
[pure](https://github.com/sindresorhus/pure) 
「きれい」「最小限」「早い」が売りのzsh向けプロンプトテーマ

## node.jsのインストール
pureのインストールの為、node.jsをインストール

### nodebrewのインストール
[nodebrew](https://github.com/hokaccha/nodebrew)

homebrewを使ってインストール

```bash:
 brew install nodebrew
```

パスを通す zshrcに以下追加

```zsh:.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

nodebrewのセットアップ

```bash:
source .zshrc
nodebrew setup
```

### Node.jsインストール

```bash:
nodebrew install-binary stable
nodebrew use stable
```

インストールできた事を確認

```bash:
node -v #v10.15.0
npm -v #6.4.1
```

## pureのインストール
[pure](pure https://github.com/sindresorhus/pure)

```bash:
npm install --global pure-prompt
```

.zshrcに以下追加

```zsh:.zshrc
autoload -U promptinit; promptinit
prompt pure
```

```bash:
source ~/.zshrc
```
BitbucketのPIPELINEを使ってHerokuにも同時pushする方法（最新版？）


BitbucketのPIPELINEを使ってHerokuにもpushしようと思ったら、
躓いたのでメモまとめ。

まず、公式のページを確認してみると、
「ステップ1：Heroku APIトークンとアプリ名を環境変数として追加する」らしいが、
PIPELINESの箇所に「Environment variables」がないんだもの。。
https://confluence.atlassian.com/bitbucket/deploy-to-heroku-872013667.html

場所は変わっていないけど、
名前が変わって「Deployments」という箇所がそれらしい。

なので、ここにAPIトークンとアプリ名を登録します。
Deploymentsには「Test・Staging・Puroduction」があるので適宜選択します。
今回はTestに入れました。

```
// Bitbucket > 設定 > PIPELINES > Deployments

Name: HEROKU_API_KEY
Value: APIトークン

Name: HEROKU_APP_NAME
Value: アプリ名
```


トークンとアプリ名の確認方法

```
// HEROKU_API_KEY
$ heroku auth:token

// HEROKU_APP_NAME 一覧が出てくるので登録したいアプリ名を確認
$ heroku apps
```

このままページ下部にある「Edit YAML configuration」で設定の編集をします。
参考と、オンラインバリデーターが用意されているので、
こちらを使います。

bitbucket-pipelines.yml
https://confluence.atlassian.com/bitbucket/deploy-to-heroku-872013667.html

Validator for bitbucket-pipelines.yml
https://bitbucket-pipelines.prod.public.atl-paas.net/validator

```
// Bibucketを参考に、こんな感じにしました。
clone:
  depth: full
pipelines:
  default:
    - step:
        deployment: test
        script:
          - git push https://heroku:APIトークン@git.heroku.com/アプリ名.git HEAD
```
出来上がったbitbucket-pipelines.ymlをherokuにpush。
これで、次回からBitbucketにpushするだけでherokuにもpushされる仕組みです。
やったー！

Bitbucketにpushした後、
PipelinesのページでStatusが確認できます。

ただ、heroku loginを忘れてpushしてしまった時や、
何かの拍子でAPIトークンが変更されてしまうようで、、、
その度にBitbucketに登録し直しになってしまいました。。
なんか、2回pushした方が早い気がする。。

どなたか解決方法を知っている方がいらっしゃれば、ご教授お願い致します。。
gulpでの独自の関数を実行する

gulpで独自の処理をいれたい時がありますよね。
そんな時の覚書。

#through2
https://qiita.com/morou/items/1297d5dd379ef013d46c
上記記事がとてもわかりやすく書いてありました！
これを参考にプラグインは作成できましたが、そんな大層なものは不要なときはthrough2を使って記述しましょう。


```js:gulpfile.js
const through = require('through2');

gulp.task('deploy', (cb) => {
  gulp.src(['src/**'], { base: '.' })
    .pipe(through.obj((file, enc, callback) => {
      if (file.isNull()) {
        // 何もしない
        return callback(null, file);
      }
      if (file.isStream()) {
        // ストリームの場合はエラー
        this.emit('error', new Error('Streams not supported!'));
      }else if (file.isBuffer()) {
        // ファイルの内容をcontentsに読み込み
        let contents = String(file.contents);
        // 独自の処理を記述する
        // ・・・
        return callback(null, file);
      }
    }));
});
```

このようにthrough.objを使用すれば処理が記述できます！
Mac OS High Sierra / Mojaveアップデートによるgitエラー「xcrun: error: invalid active developer path」

# エラー
```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

# 解決方法
ターミナル上でコマンドを叩き、インストールしますかというポップアップが表示されるので、インストールするだけ。

```
$ xcode-select --install
```
PowershellDSCでスケジューラータスクを更新する際の注意点

powershellDSCでスケジューラータスクを登録しようとしたときに

```
No mapping between account names and security IDs was done.
(43,4):UserId:
    + CategoryInfo          : NotSpecified: (PS_ScheduledTask:) [], CimException
    + FullyQualifiedErrorId : HRESULT 0x80070534,Register-ScheduledTask

```
こんなエラーが発生しました。


なので一部抜粋したコードですが、下記のように、ユーザーIDを指定してあげると無事に登録できました。
 
```

$Action = New-ScheduledTaskAction -Execute $Execute -Argument $JoindArgs
$Trigger = New-ScheduledTaskTrigger -AtStartup 
$Settings = New-ScheduledTaskSettingsSet -DontStopIfGoingOnBatteries -RestartCount 999 -StartWhenAvailable 
$Settings.RestartInterval="PT1M"
$Settings.ExecutionTimeLimit="PT0S"
    
$userinfo = [System.Security.Principal.WindowsIdentity]::GetCurrent()
Register-ScheduledTask -TaskPath \ -TaskName $TaskName -Action $Action -Trigger $Trigger -Settings $Settings -User $userinfo.Name -Force

```

通常のPSでもPSRemotingでもエラーが出なかったもので
Django 覚書 〜その１〜

# Django覚書に関して
色々覚えながら開発しているので、使い回す技とか仕様とかはここでメモしたい思う。

##環境
開発機のOS: macOS Mojave 10.14.2
Python: python3（anaconda0
Django: 2.1.5

##フォルダ構成
```
Application（ほかのチュートリアルではmysiteになってるやつ）
|-Conf（setting.pyやwsgi.pyがあるやつ、チュートリアルではmysiteになってるやつ別の名前にしないとややこしい）
|  |- urls.py　（ここで各アプリケーションのurls.pyをインクルードしてる）
|  |- ・・・・
|
|-app01（アプリケーション本体,startappコマンドで作ったやつ）
|      |- __init__.py
|      |- views.py （ビュー）
|      |- urls.py （App01自身のurl.py)
|      |- apps.py 
|      |- forms.py (フォームモデル）
|      |- models.py (モデル）
|
```

```python:Conf/urls.py
from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
  path('admin/', admin.site.urls),
  path('app01/', include('app01.urls'), #app01のurls.pyを読み込むのだ
]
```

```python:app01/urls.py
from django.urls import path
from . import views

app_name = 'app01'
urlpatterns = [
  path('index_view/<int:pk>/', views.index_view, name='index_view'),
]
```
/\<int:pk\>/はのちに渡す変数がここに入るよ、ということを示したいる。

## ボタンやリンクでGETパラメーターを送ってview.pyで受け取る
どのページでも使うと言っていいこの技術。ここに書いて覚えていきたい。

####前提
~~app01のGETパラメーターでapp01/views.pyに定義したhensuに値を渡したい。~~
テンプレート内から変数などをviews.pyに渡すときに一番簡単そうな方法として、urlに組み込んで渡す方法がある。
「app01/（渡したい数字などがここに入る）/」という風にurlが生成される。
[例]
pkという変数に1を入れると、「app01/1/」のようになる。

[記事修正]
GETパラメーターではなく「app01/　渡したい数字など/」のようにする方法でした。Getパラメーターは別の方法です。
app01/urls.pyにも修正も修正しました。


```python:views.py
class App01IndexView(View):
   def get(self, request, pk):
     hensu = pk

index_view = App01IndexView.as_view()
```
pkはapp01.pyでurlsで書いた\<int:pk\>の部分が反映されていると思われる。
####実行
1.まずテンプレート内でのボタンとリンクはこんな感じになる。
もちろん、どちらか一つでいい。
~~GETパラメーター~~<font color="Red">url</font>に渡す値をjorkerとする

```jinja:テンプレート側
<input type="button" onclick="location.href='{% url "app:appview" jorker %}'" value="ボタンだよ">
<a href="{% url "app01:appview" jorker %}">リンクだよ</a>

```
{% %}で囲ってurlの後に""内で
*app01/urls.pyで定義したapp_name
*app01/urls.pyで定義したpath関数内の名前付き引数name=に指定した名前
の二つを:でつなげる。
そしてその後に渡したい値を半角スペースの後に入力。すうじでもいいものと思われる。
すすと、jorkerはApp01IndexView(View)内のgetメソッドの第一引数に引き渡されるのでhensuに入力されることになる。
【Nuxt.js】共通で使用したいcssを読み込む

nuxt使ってる時に各テンプレート内で必ず使用するcssをグローバルで適用させたいなーと思ったので、nuxtのレイアウトファイルにimportを書くことによって対応しました。

```vuejs:layouts/default.vue
<template>
  <div>
    <nuxt/>
  </div>
</template>

<script>
  import '@/assets/css/common.css'
</script>
```

・・・が、この方法だと新しいレイアウトファイルを作成した場合、
それぞれにimportを書く必要があることに気づいて発狂しかけたので調べたところ、公式ドキュメントにちゃんと解決策が書いてありました。(良い子のみんなはちゃんと公式ドキュメントも読もうね!)
[cssプロパティ](https://ja.nuxtjs.org/api/configuration-css/)

てなわけで`nuxt.config.js`に下記のようにcssプロパティを追加して事なきを得ました。

```javascript:nuxt.config.js
module.exports = {
  css: [
    '@/assets/css/style.css',
  ],
}
```

やったぜ。
SonarQubeの Java 11 対応状況

※ 2019/1/15 時点での情報です。

## プラットフォームとしてのサポート
SonarQube実行環境のJavaとしては Oracle JRE 8 or OpenJDK 8のみがサポート対象となっている。
ただし、Java analyzer(SonarJava)自体はこのバージョンに関係なく、
あらゆるバージョンのソースコードを分析できる。

**Prerequisites and Overview**
https://docs.sonarqube.org/latest/requirements/requirements/

> * The only prerequisite for running SonarQube is to have Java (Oracle JRE 8 or OpenJDK 8) installed on your machine.
> * The SonarQube Java analyzer is able to analyze any kind of Java source files regardless of the version of Java they comply to. 

## プラグイン(SonarJava)としてのサポート
SonarJava 5.8 で正式に Java 11に対する分析がサポートされている。

**Make SonarJava officially support Java 11**
https://jira.sonarsource.com/browse/SONARJAVA-2862


## SonarQube 各バージョンとの互換性
7.0、7.1 および 7.2 は SonarJavaのバージョンがJava 11正式サポート前の5.6となっている。
6.7(LTS) または 7.3 以降であれば SonarJava 5.9.2 と互換性がある。

|SonarQube Version |6.7(LTS) |7.0 |7.1 |7.2 |7.3 |7.4 |7.5 |
|---|---|---|---|---|---|---|---|
|SonarJava|5.9.2  |5.6  |5.6  |5.6  |5.9.2  |5.9.2  |5.9.2  |


**Plugin Version Matrix**
https://docs.sonarqube.org/display/PLUG/Plugin+Version+Matrix
Swift：macのスリープ/復帰の通知を受ける

# はじめに
macOSアプリ作成時，アニメーション処理をスリープした時に一時時に止めたくなった．
Swiftでのスリープと復帰の通知の受け方を調べた．

参考：[Mac OS Xでスリープ、復帰時の通知を扱う](https://qiita.com/tfunato/items/b4b47ed36ea8ebd057a0)

# ソース
AppDelegateに以下のように通知を登録する．

```swift:AppDelegate.swift
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    private let nc = NSWorkspace.shared.notificationCenter
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        setNotifications()
    }
    
    func applicationWillTerminate(_ aNotification: Notification) {
    }
    
    func setNotifications() {
        nc.addObserver(self, selector: #selector(AppDelegate.receiveSleepNote),
                       name: NSWorkspace.willSleepNotification, object: nil)
        nc.addObserver(self, selector: #selector(AppDelegate.receiveWakeNote),
                       name: NSWorkspace.didWakeNotification, object: nil)
    }
    
    @objc func receiveSleepNote() {
        Swift.print("go to sleep")
    }
    
    @objc func receiveWakeNote() {
        Swift.print("wake up")
    }
    
}
```
Node.jsでデスクトップ通知（gulpもね）

gulpでdeploy作業を行なっているのですが、処理に時間がかかるので、なんか通知みたいなのできないかなと思い、調べてみると良いモジュールがあったのでそのメモ。

#node-notifier
node-notifierを使うとNode.jsでデスクトップ通知ができるようです。
https://github.com/mikaelbr/node-notifier
さっそくインストールしてみます。

```sh
$npm install --save-dev node-notifier
```

package.jsonに追加されます。

```json:package.json
"devDependencies": {
  "node-notifier": "5.3.0",
}
```

#node-notifierを使用する
使用するときは以下のように使います。

```js
const notifier = require('node-notifier');
notifier.notify({
  title: 'タイトル',
  message: 'メッセージ',
});
```

アイコンやサウンドも設定できるようです。

```js
const notifier = require('node-notifier');
const path = require('path');
notifier.notify({
  title: 'タイトル',
  message: 'メッセージ',
  icon: path.join(__dirname, '/images/hogehoge.png'), //　画像
  sound: 'Funk', // Basso, Blow, Bottle, Frog, Funk, Glass, Hero, Morse, Ping, Pop, Purr, Sosumi, Submarine, Tinkから選択
                 // trueだとデフォルトのBottle
});
```

他にも色々オプションがあるようです。

#gulpと組み合わせる
gulpで完了したときとエラー発生したときに通知送りたいなと思いまして、組み合わせてみました。

#成功時の通知
まずはタスクが成功したときの処理。
そのままでは使えないっぽいので、gulp-notifyを使用します。

```sh
$npm install --save-dev gulp-notify
```

gulp-notifyがインストールされました。

```json:package.json
"devDependencies": {
  "gulp-notify": "^3.2.0",
}
```

成功したときの通知はタスクの最後にpipeで繋げることにします。

```js:gulpfile.js
const gulp = require("gulp");
const gulpnotify = require('gulp-notify');
const path = require('path');

gulp.task('deploy', (cb) => {
  gulp.src(['src/**'], { base: '.' })
    // 本処理
    .pipe(hogehoge())
    // 処理の最後に通知する
    .pipe(gulpnotify({
        title: 'deploy完了しました',
        icon: path.join(__dirname, '/images/hogehoge.png'),
        sound: 'Funk',
    }));
});
```

これで処理が完了した時に通知されるようになりました。

#失敗時の通知
失敗したときは通知はgulp-plumberと組み合わせます。
gulp-plumberを使用すればgulpのエラーハンドリングができます。

```sh
$npm install --save-dev gulp-plumber
```

```json:package.json
"devDependencies": {
  "gulp-plumber": "^1.2.1",
}
```

エラー処理を記述し、gulp-plumberでエラー時に実行させます。

```js:gulpfile.js
const gulp = require("gulp");
const gulpnotify = require('gulp-notify');
const path = require('path');
const plumber = require("gulp-plumber");

gulp.task('deploy', (cb) => {
  gulp.src(['src/**'], { base: '.' })
    // gulp-plumberでエラーハンドリング
    .pipe(plumber({errorHandler: (error) => { // エラー処理
      // エラー処理を記述
      hogehogeError();
      // エラー通知
      notifier.notify({
        title: '実行エラー',
        message: error.message,
        icon: path.join(__dirname, '/images/hogehoge.png'),
        sound: 'Funk',
      });
      cb(error);
    }}))
    // 本処理
    .pipe(hogehoge())
    // 処理の最後に通知する
    .pipe(gulpnotify({
        title: 'deploy完了しました',
        icon: path.join(__dirname, '/images/hogehoge.png'),
        sound: 'Funk',
    }));
});
```

これでエラー時にも通知が届くようになり、deploy中に他の作業が気兼ねなくできるようになりました！
tailしているときに\nがエスケープされずに改行してくれないとき

`tail -f logfile`などで流れているログを見ているときに`\n`がエスケープされずにそのまま表示されてしまうことがあった。
流れるログが改行されないので非常に見づらかったため、`tail`コマンドに`sed`をつなげて改行されるようにした。

そのコマンドが下記です。

```
tail -F logfile | sed -e 's/\\n/\n/g'
```

以上
データサイエンティストのスキルレベル ～統計数理基礎～

# はじめに
標題の通り、どんなスキルレベルがあるのか確認
https://www.datascientist.or.jp/common/docs/skillcheck.pdf

#統計基礎
|No|スキルカテゴリ|スキルレベル|サブカテゴリ|データサイエンス力|チェック項目|必須スキル|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1 |統計数理基礎|★|統計数理基礎|1+4+9+16+25+36をΣを用いて表せる| ◯|
|2 |統計数理基礎|★|統計数理基礎|loga（x） の逆関数を説明できる| ◯|
|3 |統計数理基礎|★|統計数理基礎|順列と組合せの式をP、C、ｍ、nを用いて表せる| ◯|
|4 |統計数理基礎|★|統計数理基礎|条件付き確率の意味を説明できる |◯|
|5 |統計数理基礎|★|統計数理基礎|平均（相加平均）、中央値、最頻値の算出方法の違いを説明できる| ◯|
|6 |統計数理基礎|★|統計数理基礎|母集団データ（3,4,5,5,7,8）の分散と標準偏差を電卓を用いて計算できる| ◯|
|7 |統計数理基礎|★|統計数理基礎|母（集団）平均が標本平均とは異なることを説明できる| ◯|
|8 |統計数理基礎|★|統計数理基礎|標準正規分布の分散と平均がいくつかわかる |◯|
|9 |統計数理基礎|★|統計数理基礎|相関関係と因果関係の違いを説明できる |◯|
|10|統計数理基礎|★|統計数理基礎|名義尺度、順序尺度、間隔尺度、比例尺度の違いを説明できる| ◯|
|11|統計数理基礎|★|統計数理基礎|一般的な相関係数（ピアソン）の分母と分子を説明できる |◯|
|12|統計数理基礎|★|統計数理基礎|代表的な確率分布の特徴を5つ以上説明できる| ◯|
|13|統計数理基礎|★|統計数理基礎|変数が量的、質的どちらの場合の関係の強さも算出できる |◯|

#おわりに
統計検定とか勉強したら身につきそうだと思いました。
responder on dockerしようとしたら、hello worldできなくて焦った話

pythonのフレームワーク経験があまりないので、せっかくだからモダンフレームワークから覚えてイケエンジニアになろうと思ってたら甘くはなかった....:sob:

結論から言うと、dockerでapi.runする際は`api.run(address="0.0.0.0")`という話です。
理由が分かったひとは解散。

# responderって...?

以下の記事を読むと楽しいです。
https://blog.ikedaosushi.com/entry/2018/12/01/195512

# hello worldしようとするとserverからreplyが返らない。
すでにresponder先駆者の日本語記事があったので、以下の参考に実装させて頂いておりました。感謝:bow_tone1:
https://qiita.com/nskydiving/items/b98d5cea5a52459cb183

## 事象

しかし、dockerに載せると......replyを返してくれないだと....

```
curl http://127.0.0.1:5042/
curl: (52) Empty reply from server

```

原因を切り分けるためにコンテナに入って叩いてみると、ちゃんと返してくれる。なんぞ？？

```
$ docker exec -it python_application bash                                                                                                                                         
root@6e256b0bdfc6:/usr/src/app# curl localhost:5042
hello, world!
```

## 解決に至るまでの格闘

事象でぐぐってみると、それっぽい記事が。
[Dockerで、ホストからcurlでアクセスするとEmpty reply from serverがでてしまう | mokelab tech sheets](https://tech.mokelab.com/infra/docker/tips/empty_reply_from_server.html)

> コンテナ内で起動しているサーバーがlocalhost指定でListenしている可能性があります。

サーバーがlocalhost指定でListenするなんてことがあるのですね。
そこでresponderのドキュメントを読んでみました。

https://python-responder.org/en/latest/quickstart.html#run-the-server

> Note: you can pass port=5000 if you want to customize the port. The PORT environment variable for established web service providers (e.g. Heroku) will automatically be honored and will set the listening address to 0.0.0.0 automatically (also configurable through the address keyword argument).

怪しいので、さらにsourceの中身まで読んでみました。

https://python-responder.org/en/latest/_modules/responder/api.html#API.serve

```
        if address is None:
            address = "127.0.0.1"
        if port is None:
            port = 5042
```

おお、`127.0.0.1`がめっちゃ怪しいですね。dockerのホストからのリクエストは、localhostとは別のIPのものと解釈されるらしいので、これが原因になることは有り得そう。

# 解決

`address="0.0.0.0"` を指定したら、hostからのアクセスでもreplyを返してくれました!

```
if __name__ == '__main__':
    api.run(address="0.0.0.0")
```

# 補足

Flaskでも常識だったようですね。精進します:baby:
[Flaskのサーバーはデフォルトだと公開されてない - Qiita](https://qiita.com/tomboyboy/items/122dfdb41188176e45b5)
【CPUの創りかた】74HC138メモ

# メモ

『CPUの創りかた』を読んでいて、デジタルICの使い方がよく分からなかったので、メモ

データシート2pの論理図
http://akizukidenshi.com/download/ds/toshiba/TC74HC138AP.pdf

を読むと、
- G1
- G2A
- G2B

をHLLにすることでデジタルICが使えるようになる？ぽいので、それをまず接続。
今回はY0を「Selecte Output(L)」にするので、入力（A,B,C）はすべてLとする。

物理的な配線位置は1pの図を参照する。

※以下図はテスターをLEDの絵で表現（fritzingでテスターの絵がどこにあるか分からなかった）
![74hc138.png](https://qiita-image-store.s3.amazonaws.com/0/50690/81fdcb00-ca53-e92f-95fd-211c53047a11.png)

実際に配線すると、Y0のみがL（0V）となり、他の出力はH（電源の電圧）となる。

![IMG_6008.JPG](https://qiita-image-store.s3.amazonaws.com/0/50690/a266c9ae-66fd-c9fc-5e78-7ea16d75cf91.jpeg)
仕事に集中できない？注意散漫？MacBookのタッチパッドとか、ミニホワイトボードに世界にひとつだけのタスクを書いて、眼の前のやることに集中するハック。

仕事に集中できない？注意散漫？MacBookのタッチパッドとか、ミニホワイトボードに世界にひとつだけのタスクを書いて、眼の前のやることに集中するハック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d53fc933-7965-bd59-c356-5478bcaf6590.png)

# Trouble

- PR一覧とかが雑然としていると、綺麗になるまで仕事が手につかない
- とにかく目の前の状況を整理して、スッキリとした環境づくりをしないと一歩も動けないタイプ
- だけど目の前のやること、優先順位さえしっかりとしておけば、それに集中すれば良いだけだよね？他のことは放置して

そんな話を他のエンジニアとしていた。





---

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 -->
Proxy内環境でWindows10にWSL開発構築する手順

#前提
* Windows 10 Pro
* Proxy配下のLANでの環境セットアップが必要

#やりたいこと
* Windows開発環境にUbuntu（WSL（Windows Subsystem for Linux））をインストールさせたい

#セットアップのハマりどころ

* ハマりどころ
  * Microsoft Storeにアプリないので，Storeを用いないで必要なディストリビューションを用意する必要がある
* 対応
  * 紆余曲折あったが，答えは以下のURL
      * https://docs.microsoft.com/en-us/windows/wsl/install-on-server
  * 上記を参考にしながら，環境のインストールで解決．
* インストール後の問題
  * apt-getのインストールが、Proxyオプションを正しく設定しないとならない．
     * 「Proxyの設定の章」に続く

# Proxyの設定について
方法は2通り，

## 方法1．環境変数を設定する
.bashrcを書き換えることで，それぞれのコマンドがよしなに環境変数を読み取ってくれることがある．

末尾に以下のような変数を追加すると良い

```sh
export HTTP_PROXY_USER="username"
export HTTP_PROXY_PASS="password"
export HTTP_PROXY="http://${HTTP_PROXY_USER}:${HTTP_PROXY_PASS}@your.proxy.domain.name:portnum/"
export HTTPS_PROXY_="${HTTP_PROXY}"
```

読み取ってくれないコマンドも存在するようなので，その場合は二つめの方法を試すと確実．

## 方法2．コマンドのオプションに付け加える
リクエストを飛ばすコマンドは大抵プロキシの設定ができるオプションが存在する．それを調べる．
apt-getの例

```sh
sudo apt-get -o Acquire::http::proxy="http://username:password@your.proxy.domain.name:portnum/" install hogehoge
```

上記のようにすることで，テキストとしてパスワードなどが残る心配がないからいいかもしれない？
なお，パスワードに!や@といった文字が含まれている場合は"P＠ssword"を"P¥＠ssword"のようにしなければ正常に実行できないようである．
[Laravel] SQLiteの外部キー制約を使えるようにする

Laravelの開発でSQLiteを使っていたのだが、 **デフォルトでSQLiteは外部キー制約を使えない** らしい。

![Screen Shot 2019-01-15 at 12.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/109241/13c5b9e8-bee4-7ce8-161d-e3fc841a8322.png)

### 参考
https://laravel.com/docs/5.7/migrations#foreign-key-constraints

## 外部キー制約を使えるようにする方法
`config/database.php` に以下のように追記する。

```
        'sqlite' => [
　　　　　　　　　　　　　　　　　　　　　　　　　...
            'foreign_key_constraints' => true,
        ],
```

### 参考
https://laravel.com/docs/5.7/database#configuration
プログラミングのトリビア。「ネットワーク漢字フィルターの頭文字」をとって nkf らしい。



衝撃の事実。

[git diff 実行時に nkf コマンドが無いって怒られた話 - Qiita](https://qiita.com/tommy_aka_jps/items/d4c485ab8a02ea515873)

![image](https://user-images.githubusercontent.com/13635059/51156926-13b69b80-18c1-11e9-93a2-18fcf72d7048.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerコンテナ上でAngularアプリケーションを稼働させる

#前提
docker-machine : Version: 0.14.0, build 89b8332

#Docker Toolboxのインストール
自宅の環境がDocker for Windowsに対応していなかったため、Docker Toolboxを利用することにした。
https://docs.docker.com/toolbox/overview/ からダウンロードし、以下の参考リンクを元にインストール。

参考リンク:
[Docker Toolboxのインストール：Windows編](https://qiita.com/maemori/items/52b1639fba4b1e68fccd)

※PCの環境によっては、VT-xが有効になっていない場合、「Docker Quickstart Terminal」の実行時にエラーとなる。BIOSから[設定変更可能](http://picworld.jp/2016/03/28/vt-x-%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%9F%E3%81%8F-%E3%81%A6-3-%E6%97%A5%E7%A8%8B%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A0%E3%81%8C%E3%80%81windows/)なので、変更後再実行すること。

#Webサーバ立ち上げ
公式のDocker Hubからhttpdイメージを取得し起動させる。

参考リンク : 
[Docker 公式 httpd イメージを利用して Docker を体験してみよう](https://weblabo.oscasierra.net/docker-httpd-usage/)
[Docker入門日誌-その2- Webサーバ立ち上げ編](https://techracho.bpsinc.jp/ebi/2017_05_24/40406)
### httpdイメージの取得
```
$ docker pull httpd
```
### httpdコンテナの作成・起動
```
$ docker run -d -p 8080:80 --name apache httpd
```
「-p」はローカルマシンの"8080"ポートを"80"にマッピング、「-d」はデタッチモード。
起動後Webブラウザから起動確認ができるが、指定するIPアドレスは、以下のコマンドで出力されるものを指定。(http://{IPアドレス}:8080)"It Works!"というメッセージが確認できればOK。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://{IPアドレス}:{ポート}           v18.09.1
```

#Angularアプリケーションのビルド
powershellを起動し、プロジェクトのディレクトリから以下のコマンドを実行。

```
$ ng build --prod --base-href=/hogehoge/
```
「--prod」は"商用"、「--base-href」はurl上のドメイン以降のパスを指定するオプション。
実行後は、{プロジェクトディレクトリ}/dist配下にファイルが生成される。

#Angularアプリケーションをドキュメントルートへ配置
Docker公式のhttpdのドキュメントルートは、/usr/local/apache2/htdocsのため、以下のコマンドで上記のビルドアプリをコピーする。

```
$ docker cp {プロジェクトディレクトリ}/dist apache:/usr/local/apache2/htdocs
```
再度http://{IPアドレス}:8080/hogehogeにアクセスし、表示されれば成功。
コレクションがN件以上であるかの判定

# 環境について

Linqpad5で確認を行いました。

# 動機づけ

配列やList型はLengthやCountといったプロパティを使用することでコレクションの件数を取得し、N件以上であることを判定できます。

``` cs
void Main()
{
	int n = 3;
	if (Array.Length > n)
	{
		Debug.WriteLine($"{nameof(Array)}は{n.ToString()}件以上です。");
	}
	else
	{
		Debug.WriteLine($"{nameof(Array)}は{n.ToString()}件未満です。");
	}

	if (List.Count > n)
	{
		Debug.WriteLine($"{nameof(List)}は{n.ToString()}件以上です。");
	}
	else
	{
		Debug.WriteLine($"{nameof(List)}は{n.ToString()}件未満です。");
	}
}

private int[] Array => Collection.ToArray();
private List<int> List => Collection.ToList();
private IEnumerable<int> Collection
{
	get
	{
		// 適当なデータです
		yield return 0;
		yield return 1;
		yield return 2;
		yield return 3;
		yield return 4;
		yield return 5;
	}
}
```

IEnumerable\<T>ではLINQのCount()メソッドを使用することでコレクションの件数を取得することは可能です。

``` cs
void Main()
{
	int n = 3;
	if (Collection.Count() > n)
	{
		Debug.WriteLine($"{nameof(Collection)}は{n.ToString()}件以上です。");
	}
	else
	{
		Debug.WriteLine($"{nameof(Collection)}は{n.ToString()}件未満です。");
	}
}
```

しかし、配列のLengthやリストの[Count](https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,78a69d857716bc68,references)がプロパティへのアクセスに対して、LINQの[Count()](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b,references)メソッドは全件走査が必要となります。  
少ない件数では問題になりませんが、大量のデータを扱う場合には問題となる可能性があります。  
# 対応

## N = 1 の場合

1件以上であるかを判定する場合には[Any()](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0,references)メソッドを使えば判定できます。  
1件目の要素にアクセスした時点で判定が終了するため、処理速度も安心できます。 
 
``` cs
void Main()
{
	if (Collection.Any())
	{
		Debug.WriteLine($"{nameof(Collection)}は{1.ToString()}件以上です。");
	}
	else
	{
		Debug.WriteLine($"{nameof(Collection)}は0件です。");
	}
}
```

## N > 2 の場合

2件以上といった場合には[Skip()](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,90ccdbd47b57182e,references)メソッドとAny()メソッドを組み合わせて行います。

``` cs
void Main()
{
	int n = 3;
	if (Collection.Skip(n).Any())
	{
		Debug.WriteLine($"{nameof(Collection)}は{n.ToString()}件以上です。");
	}
	else
	{
		Debug.WriteLine($"{nameof(Collection)}は{n.ToString()}件未満です。");
	}
}
```

この場合はSkip()メソッドによるn件の要素へのアクセスとAny()メソッドによる1件の要素へのアクセスの系 (n + 1) 件の要素へのアクセスが発生します。  
(上記の例では (3 + 1) = 4件の要素へのアクセスが発生)  
ListのCountプロパティと比べると遅いと思われますが、Collectionの件数に比べてNが小さい場合には全件走査が発生するCount()メソッドに比べて高速に動作できると考えられます。  

## 補足
N = 1 と N > 2 の2つのパターンに分けましたが、Skip()メソッドを使う方法は N = 1 の場合にも有効です。  
ですが、N = 1 の判定としては冗長で、使うことは無いと思われるため、分けて記載をさせていただきました。  

# 可読性は……

やはりCount()メソッドを使った方が直観的に判定したいことが分かるので可読性はあると思います。  
Count()メソッドでは速度上の懸念がある場合にチームで合意をして使うのが良いかもしれません。  
LINQの様に拡張メソッドとして定義しておくと多少は可読性が向上するかもしれません。
覚え書き：Windows用ターミナルソフトRLoginでチャレンジレスポンス認証を使用する

##はじめに
Windows用のターミナルソフトRLoginからSSHのチャレンジレスポンス認証にて
ログインする際の設定メモです。


参考）rlogin/telnet/ssh(クライアント)ターミナルソフト - Nanno Home Page -
http://nanno.dip.jp/softlib/man/rlogin/


参考）BIG-IP - Power ON / Console / SSH / WebUI
https://www.infraeye.com/study/bigip1.html


##設定開始
1. [ファイル]-->[サーバに接続]を選び、[Server Select]ダイアログを開きます。

2. [新規作成]ボタンをクリックし、新しいエントリを作成します。

##[通信共通]
エントリ文字列を入力し、接続先のホスト名(IPアドレス)、ログインユーザー名、パスワードを入力します。
![entry001.png](https://qiita-image-store.s3.amazonaws.com/0/262326/3fabc7f8-276e-9641-06e1-f1869c01d256.png)

##[プロトコル]
[プロトコル]設定タブを開き、[暗号化方式(C)]ボタンをクリックします。

![protocol001.png](https://qiita-image-store.s3.amazonaws.com/0/262326/fe8376be-d52d-0918-7225-2833d8624d0d.png)

##[SSHサポート]
SSH2の右側の方に"ログイン"というリストボックスがあるので、その中にある"keyboad-interactive"という項目をクリックし、SHIFTキーを押しながらカーソルの上（↑）を押し、一番上に移動させておきます。移動が終わったら[OK]ボタンをクリックしてください。

![SSH2_002.png](https://qiita-image-store.s3.amazonaws.com/0/262326/eafdc662-2de6-5e9c-8724-376ffc625783.png)

##接続

設定は以上です。
Server Entry の一覧から保存されたエントリを選択して、[OK]をクリックすると、
SSH2(チャレンジレスポンス認証）による接続が行われます。

チャレンジレスポンス認証に成功すると、以下のようにログイン後のプロンプトが表示されるはずです。

![login_001.png](https://qiita-image-store.s3.amazonaws.com/0/262326/06fc269a-86fc-683e-7ff8-6bc7ba6c3e44.png)
自分のサイトを作成して学んだこと

# 結論
## わかったこと
- やるべきこと
- わからないこと
- できなかったこと
- 終わりなきこと

--------
# おわり

--------
# ・・・・それだと殺されるので詳細をまとめました。。。

--------
# やるべきこと
- フロント側のデザイン
- 管理画面側のデザイン
- バックエンドのシステム構築
- 最適なサーバー構築
- ブログのためのDB設計
- SEOの対策
- 記事の更新

----
# わからないこと
- デザイン(ドヤァ)
- サーバー(インフラ)構築
- DB設計
- SEO対策

---
# できなかったこと
- デザイン ()
- SEO対策 ()

---
# おわりなきこと
1. 改善点はなくならない
2. 更新作業は続く
3. 知らない誰かに届ける

---
# まとめ

1. やりたいこと/やるべきことを探す
2. わからないことを把握する
3. やってみる
4. できなかったことを把握する
5. 1に戻る

---
# これは人生...?

---
# 最終結論
何かを作り、それを改善していくこと。
それが、死ぬまで続く。
【SQL】３つ（複数）のテーブルの結合してデータを抽出する

##やりたいこと
**３つ（複数）のテーブルの結合してデータを抽出する**
【詳細】
商品(products)テーブル、商品名関連付けテーブル(product_i18ns)、  商品販売対象国関連付けテーブル(product_countries)を結合してアメリカを販売国対象とする商品一覧(日本語)を抽出する

##テーブル構成

**商品(products)テーブル**

| id | image | created_at | 
|:-----------:|:------------:|:------------:| 
| 1 | 40e8a18f.jpg | 2018-07-23 00:00:00 |
| 2 | 40e8a19f.jpg | 2018-07-23 00:00:00 |
| 3 | 40e8a20f.jpg | 2018-07-23 00:00:00 |
| 4 | 40e8a21f.jpg | 2018-07-23 00:00:00 |
| 5 | 40e8a22f.jpg | 2018-07-23 00:00:00 |

**商品名関連付けテーブル(product_i18ns)**

| id | product_id | locale_id | name | created_at
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 1 | 1 | 1 | メロン | 2018-07-23 00:00:00 |
| 2 | 1 | 2 | melon | 2018-07-23 00:00:00 |
| 3 | 2 | 1 | いちご | 2018-07-23 00:00:00 |
| 4 | 2 | 2 | strawberry | 2018-07-23 00:00:00 |
| 5 | 3 | 1 |  りんご | 2018-07-23 00:00:00 |
| 6 | 3 | 2 | apple | 2018-07-23 00:00:00 |
| 5 | 3 | 1 | オレンジ | 2018-07-23 00:00:00 |
| 6 | 3 | 2 | orange | 2018-07-23 00:00:00 |
※locale_id(1)=日本(ja)　locale_id(2)=英語(en)

**商品販売対象国関連付けテーブル(product_countries)**

| id | product_id | coutry_id | created_at
|:-----------:|:------------:|:------------:| :------------:| 
| 1 | 1 | 233 | 2018-07-23 00:00:00 |
| 2 | 2 | 10 | 2018-07-23 00:00:00 |
| 3 | 3 | 233 | 2018-07-23 00:00:00 |
| 4 | 4 | 120 | 2018-07-23 00:00:00 |
※coutry_id(233)=アメリカ

##SQL文

```
SELECT
抽出したいカラム 
FROM
メインテーブル
(RIGHT/LEFT)  JOIN
結合するテーブル１
ON
メインテーブルとリレーションしている外部キー(複合主キー)
(RIGHT/LEFT) JOIN
結合するテーブル２
ON
メインテーブルとリレーションしている外部キー(複合主キー)
WHERE
条件
```

```
SELECT
prodcuts.id, product_i18ns.name 
FROM
products
JOIN
product_i18ns
ON
products.id = product_i18ns.id
RIGHT JOIN
product_coutries
ON
products.id = peoduct_coutries.id
WHERE
locale_id=1 && country_id=233 
```

##結果
| id | name | 
|:-----------:|:------------:|
| 1 | メロン|
| 3 | りんご |
今更 Desktop MAc Github 使ってみたけど、何ができるかよく分からなかった報告。



# Hello

![image](https://user-images.githubusercontent.com/13635059/51155823-34c8bd80-18bc-11e9-9d58-7149d6b5dd26.png)

# 理由

Github の Issues のフォームとか小さい
もうちょっとなんとかならないの
結論としては Issueとかは書けなさそうな

 # Clone repository


![image](https://user-images.githubusercontent.com/13635059/51155960-c89a8980-18bc-11e9-8fa1-61c465785873.png)

# 画面

![image](https://user-images.githubusercontent.com/13635059/51155979-e0720d80-18bc-11e9-8d17-705c1d14d3a5.png)

# 何ができるの？

よく分からず。
Web UI に対して優れた点が分からなかった。


---

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 -->
Qt for Pythonで終了するだけのアプリケーションを作成

タイトルの通り、[Qt for Python](https://www.qt.io/qt-for-python)を利用して、ウィンドウを表示して、メニューで「終了」を選択すると終了するアプリケーションを作成します。

# 環境構築

あらかじめQt for Pythonが対応するバージョンのPythonが導入されていることを前提とします。検証した環境ではPython 3.6が導入されています。

以下のコマンドでQt for Python(PySide2)を導入します。

```shell
pip install PySide2
```

# ソースコード

```python
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QMenu
from PySide2.QtWidgets import QAction
from PySide2.QtGui import QKeySequence

class MainWindow(QMainWindow):
    def __init__(self, app: QApplication):
        super(MainWindow, self).__init__()
        self.app = app
        self.setWindowTitle("サンプルプログラム")
        self.resize(400,200)
    
    def main(self) -> None:
        # 「終了」項目の作成
        exit_action = QAction('終了(&X)', self)
        # 「終了」項目が選択された場合に起動する関数を設定
        exit_action.triggered.connect(self.exit)
        # 「終了」項目を選択するショートカットキーを設定
        exit_action.setShortcut(QKeySequence("Ctrl+Q"))

        # 「ファイル」メニューを作成
        file_menu = QMenu("ファイル(&F)")
        # 「ファイル」メニューに「終了」項目を追加
        file_menu.addAction(exit_action)
        # 「ファイル」メニューをメニューバーに追加
        self.menuBar().addMenu(file_menu)
        self.show()
        self.app.exec_()
    
    def exit(self) -> None:
        self.close()
    
def main() -> None:
    app = QApplication()
    window = MainWindow(app)
    window.main()

if __name__ == '__main__':
    main()
```

# 起動方法

上記のソースコードを適当なファイル名で保存します。たとえばファイル名をmain.pyとすると、以下のコマンドで起動します。

```shell
python main.py
```

以下の画面が表示されます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/145530/c38c7566-4d9d-bef6-0b1b-eb54537c9105.png)

# 操作方法

以下のいずれかの方法でアプリケーションを終了します。

1. マウスで「ファイル」メニューを選択して、開いたメニューから「終了」項目を選択すると、アプリケーションが終了します。
2. alt+fで「ファイル」メニューを開いて、alt+xでアプリケーションが終了します。
3. ctrl+qでアプリケーションが終了します。
視覚過敏？聴覚過敏？どっちもかも？ エンジニアの仕事術。集中力と生産性を上げる「集中スコープ」みたいなのがほしかったけど、ニット帽がそのかわりになるかも？コンビニで1000円で買える2Wayのやつ。

視覚過敏？聴覚過敏？どっちもかも？ エンジニアの仕事術。集中力と生産性を上げる「集中スコープ」みたいなのがほしかったけど、ニット帽がそのかわりになるかも？コンビニで1000円で買える2Wayのやつ。

Engineer me Work HAck. I wanna increase focus power to task. I use nit cap but no glass or scopes.

# Ya

- ニット帽をかぶって視野をいい感じで調整する。
- 首にも巻ける2wayタイプ。
- セブンイレブンかファミリーマートで1000円ぐらいで買った気がする。

Wear nit cap and control your view resizing.

![image](https://user-images.githubusercontent.com/13635059/51155385-a9026180-18ba-11e9-826c-d8d3fb071eb8.png)

# 要件

- デスクがスタジオの真ん中の方にあって、とにかく視界に色々なものが入って気が散る
- 精神力で集中しろと思うかもしれないが、聴覚過敏なタイプなので、わりと深刻な問題

# nits!

- 耳にもかぶせるとちょっと音も防ぐことができて、良い。
- 頭がニットに包まれている安心感もあってなおさら良い。
- 人が話しかけてきたときも、怪しくなく、すぐに気づいて首に落としたりして、すぐに話せる。

---

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 -->
Powershellでテキストファイルの中身をメール送信する

タイトルのような処理が必要ということでPowershellを使ってメールを送信するファイルを作ることに。
Powershellでメールなんて送ったことがないので調べつつ作っていきます。
前回同様今後また使うかもしれないのでメモ書き程度に。

##### 組んでいく
・Powershellでメールを送るには

`Send-MailMessage`というコマンドレットでメールが送れるらしい。
送る本文の内容はテキストファイルから読み込みたいので`Get-Content`を使ってみる。

```powershell:send.ps1
# 宛先メールアドレス
$to = "to@address.co.jp"

# 送信元メールアドレス
$from = "from@address.co.jp"

# SMTPサーバー
$smtp = "01.234.567.89"

# 件名
$subject = "Powershell Message test"

# 本文
[string]$body = @()
$body = (Get-Content D:\test\temp\send.txt) -join "`n"

# メールを送信します
Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Encoding UTF8
```

ちなみに送りたいファイルは先日Qiitaに書いてみたSQLServerの使用率を表示させたもの。

```send.txt
db_size
使用率…13%
使用率80%以下です。
-------------------------------------------------------------

db_log
使用率… 0%
使用率80%以下です。
-------------------------------------------------------------
```

・実行結果
きちんとfrom@address.co.jpよりto@address.co.jpへメールが送信され、本文もsend.txtの内容そのまま送信出来ていた。

ちなみに #本文 にある \-join "\`n"\` がないと

```
db_size 使用率…13% 使用率80%以下です。 -------------------------------------------------------------  db_log 使用率… 1% 使用率80%以下です。
```

という風に改行されず送信されるみたいなので入れています。

後はencodeをUTF8にすることで、していないと文字化けしたりするらしい。気を付けよう。

---

##2019/01/17 追記

コメントを頂きました。-raw　オプションでもいけるとのこと。

実際試してみて、-rawのほうが断然いいですね。
調べてみましたが、\-join "\`n"\`がないとダメみたいなことを書いていましたが、それはPowershell 2.0までらしい。
Powershell 3.0から -raw オプションが使えるみたいです。
3.0はWindows8やWindows Server 2012以降標準搭載みたいなのでこれからは -raw を使っていきます。

コメントありがとうございました！とても勉強になりました。
増えすぎたnoneのdockerイメージや、バックで動くコンテナプロセスを全て削除する

# Dockerイメージが知らないうちに裏側で増えている・・・

```
<none>                <none>              2c9ebe480326        4 days ago          1.56GB
<none>                <none>              98ff1d281660        4 days ago          1.56GB
<none>                <none>              fe058b5c5192        4 days ago          1.56GB
<none>                <none>              90a3e2faf2df        4 days ago          1.56GB
<none>                <none>              6b5083ef4359        4 days ago          1.56GB
<none>                <none>              34458c6a4713        4 days ago          1.56GB
<none>                <none>              7fa65e0012eb        4 days ago          1.56GB
<none>                <none>              9a35ca8c6809        4 days ago          1.56GB
<none>                <none>              b45937515b49        4 days ago          1.56GB
<none>                <none>              1bcb2f34183f        4 days ago          1.56GB
<none>                <none>              8b22edb03d6c        4 days ago          1.56GB
<none>                <none>              ede3afff5148        4 days ago          1.56GB
<none>                <none>              97f25876f89e        4 days ago          1.56GB
<none>                <none>              c8ec773237c4        4 days ago          1.56GB
<none>                <none>              ab2cf4a9cef9        4 days ago          1.56GB
<none>                <none>              3a0aaf891502        4 days ago          1.56GB
<none>                <none>              54a8ab439b63        4 days ago          1.56GB
<none>                <none>              2211dba6df7a        3 weeks ago         1.55GB
```

これだけ見ていると気持ち悪いですね。しかも結構一つ一つのサイズが地味に大きいのでチリも積もればなんとやらでほっとくとメモリを大きく圧迫しちゃいそうな予感がします。

## こいつら一体なんやねん
dockerやdocker-composeを使っていて何気なくbuildしていると、前にbuildしたイメージがnoneとして排出されます。要は、抜け殻みたいなものですね。抜け殻からは新たなdockerイメージが生まれいづるというわけです。

## 正体が抜け殻なら一掃しよう

こんなものはあっても邪魔なだけなので、オール削除といきましょう。抜け殻を後生大事にとっとくのは小学生の夏くらいのものです。

```
$ docker images | grep none | cut -b 40-54 | tr '\n' ' '
```

上記のコマンドを打つことで、

```
af1a86b502ef 2c9ebe480326 98ff1d281660 fe058b5c5192・・・以下略
```
このように横一列にIDが出てきてくれるので、

```
$ docker rmi 標準出力されたID
```

で、抜け殻を全て削除させましょう！
作業を進めている時に気が付いた時にimagesにnoneが溜まっていたら実行するといいと思います。

# docker-compose buildができなくなる瞬間

```
E: You don't have enough free space in /var/cache/apt/archives/.
```

上記のようなエラーが現れ、今までできていたはずのdocker-compose buildができなくなる現象がある。これは、imagesや裏のプロセスが多くなりすぎているせいです。裏のプロセスは特にいらないのでさっさと消します。

## 解決してくれるコマンド 

```
$ docker ps -a | grep ago | cut -b 1-12 | tr '\n' ' '
```

agoで検索かければ、一撃で全部引っ張り出して来れますし、ID最初に出てきてくれるので、1ー12の固定で出せます。
後は、

```
$ docker rm -f 出力したID
```

で抹消してあげれば、再びbuildできるようになります。
コードにコメントを書かなくても、モックしているだけで事情は伝わるのでは？とスーパーエンジニアと話した思い出



Me コードにコメントを書かないと、なんのためにモックしているかが分からないのでは
Su モックされているだけで、コードの読み手に事情が伝わるのでは、察すれ

教訓

何かありそう、なにか事情がありそう、という雰囲気を出すだけで良いこともある

コードリーダーがどれぐらいリーディングできるかを常に予想せよ


---

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 -->
【Bigquery】指定した期間の日付のテーブルをさくっとだす


集計したいデータが性質上歯抜けになってるときとかにたまに使いたくなるのです。

StandardSQLで書いてます。

```sql
SELECT
  days
FROM
  UNNEST(GENERATE_DATE_ARRAY('2016-03-01', '2018-03-31')) as days
```

これで作ったdaysに対して `LEFT JOIN` してあげれば歯抜けなしできれいにデータがだせてグラフもいい感じになる気がします。
VueのEnterキーイベントで日本語入力中のEnterを制御する

# やりたいこと

- Enterキーイベントをトリガーに操作をしたい
- 日本語入力中のEnterキーはトリガーを走らせたくない

# どうすればよいか

`@keyup.enter` だといずれのEnterもkeyCode = 13を返してしまうが、`@keydown.enter`であれば日本語入力中のEnterはkeyCode = 229を返すので、`@keydown.enter`で判断すれば良い。

```vue
<div id="app">
  <!-- 日本語入力中のEnterでもイベントが発火してしまう -->
  <input @keyup.enter="trigger" placeholder="keyup.enter">
  <!-- 日本語入力中のEnterではイベント発火しない -->
  <input @keydown.enter="trigger" placeholder="keydown.enter">
</div>
<script>
new Vue({
  el: "#app",
  methods: {
    trigger: (event) => {
      // 日本語入力中のEnterキー操作は無効にする
      if (event.keyCode !== 13) return
    
      // 実行したい処理
    }
  }
})
</script>
```
【PHP】nullの動き方27パターンまとめ

## はじめに
PHPのnullの動き方が気になったのでまとめます。随時追記していこうと思います。
こういうパターンもあるよ！というものがあれば教えてください！
今回はLaravelのdd関数(dump and die)を使っていきます。

## null

```php5

dd(null);
// -> null
```

## キャスト

```php5

dd(（int） null);
// -> 0

dd(（string） null);
// -> ""

dd(（array） null);
// -> []

dd(（bool） null);
// -> false

dd(（float） null);
// -> 0.0

dd(（object） null);
// -> {#1432}
```

## 四則演算

```php5

dd(null + null);
// -> 0;

dd(null - null);
// -> 0;

dd(null * null);
// -> 0;

dd(null / null);
// -> ErrorException Division by zero
```

## 変数操作関数

```php5

dd(empty(null));
// -> true;

dd(gettype(null));
// -> 'NULL';

dd(intval(null));
// -> 0;

dd(is_array(null));
// -> false

dd(is_bool(null));
// -> false

dd(is_int(null));
// -> false

dd(is_null(null));
// -> true

dd(isset(null));
// -> FatalErrorException Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

$a = null; //直接null入れるとエラー吐くため
dd(isset(null));
// -> false

dd(strval(null));
// -> ''

```

## その他

```php5
dd(null == 0);
// -> true

dd(null === 0);
// -> false

dd(null == '');
// -> true

dd(null === '');
// -> false

dd(date(null));
//-> ''

$a = password_hash(null, PASSWORD_BCRYPT);
dd($a);
// -> '$2y$10$qpzDi1Bx8.QKBlZ3EX8yBOjXehZqLV4Zs/XwESf3ZvLNRC3vczMsi'
```

## 最後に

型判定などはよく使うのでnullに気をつけたいですね。
主要ブラウザのバージョンとリリース予定

# ブラウザの最新バージョンと次期リリース予定

2025/06/03時点

| ブラウザ           | 最新バージョン            | リリース日  | 次期バージョン  | リリース予定   | 参考URL                                                                      |
| ------------------ | ------------------------- | ----------- | --------------- | -------------- | ---------------------------------------------------------------------------- |
| Google Chrome      | 137                       | 2025/05/27  | 138             | 2025/06/24     | https://chromiumdash.appspot.com/schedule                                    |
| Mozilla Firefox    | 139                       | 2025/05/27  | 140             | 2025/06/24     | https://whattrainisitnow.com/calendar/                                       |
| Microsoft Edge     | 137                       | 2025/05/29  | 138             | 2025/06/26週   | https://docs.microsoft.com/en-us/deployedge/microsoft-edge-release-schedule  |
| Apple Safari       | 18.5                      | 2025/05/12  | -               | -              | https://support.apple.com/ja-jp/HT201222                                     |

* 自動更新ではないのでタイムラグがあります
* 記載のバージョンはステーブルです
* Chrome、Firefox、Edgeについてはメジャーバージョンでの記載になります
* Safariについては公式なリリース予定が公開されていないため未記載です
* リリース日は日本時刻ではないものもあります。1日ずれる可能性があります
* Chrome、Edgeについてはリリース後段階的にロールアウトされるため適用が遅れる可能性があります
Trinityのインストール

このページではlinux環境にTrinityをインストールする方法を記載しています。

## Trinityとは
de novo transcriptomeアセンブリング(リファレンス配列のない生物遺伝子を構築する)ツールです。

## アルゴリズム (書きかけ)

### Inchworm

k-mer ベースでcontigを生成します。メモリを大量に消費します。
[詳細はこちら](https://qiita.com/github-nakasho/items/8f373be442d15e715aa7)

### Chrysalis

Inchwormで作成されたcontigから似ている配列を集め、選択的スプライシングやパラログのような配列をクラスター化します。そのcontig部分を基にde Bruijn graph(ド・ブラングラフ)を作成します。
de Bruijn graphに関する良質な記事: http://hoxo-m.hatenablog.com/entry/20100930/p1

### Butterfly

Chrysalisでまとめられたcontigをもとにgraphを精査し、全体の再構築を行います。

## 事前準備

### 必要マシンスペック

1M(100万)ベースペアあたり1G(10億)bのメモリが必要です。

### 必須ソフトウェア
Trinityの実行には以下の3つのソフトウェアが必要です。

- [Jellyfish](https://qiita.com/github-nakasho/items/a7ac933a04fb94581652)
- [bowtie2](https://qiita.com/github-nakasho/items/c8a6d0608c029670fe88)
- [Salmon](https://qiita.com/github-nakasho/items/13bd69c2666dbb8b3bfc)

### ディレクトリ構成
ホームディレクトリ直下(~/)にsrcとbinを作っておきます。

/src...パッケージ等を解凍したものの置き場所。
/bin...実行ファイル置き場。

のように置き場所を決めておくと便利です。

## インストール
適当な場所にtrinitynaseq-Trinity-v2.8.4.tar.gzをダウンロードします。
以下コマンドで解凍します。

```
tar xvzf trinitynaseq-Trinity-v2.8.4.tar.gz
```

解凍したものを~/srcディレクトリに配置します。

```
mv trinitynaseq-Trinity-v2.8.4 ~/src/
```

~/src配下に置いたTrinityのインストールディレクトリに移動します。

```
cd ~/src/trinitynaseq-Trinity-v2.8.4
```

makeします。

```
make
make plugins
```

vimで.bashrcに追記します。

```bash:.bashrc
export PATH="$HOME/bin:$PATH"
export TRINITY_HOME="$HOME/bin"
```

シェルを再起動するか、

```
source .bashrc
```

で環境変数を反映させます。
最後に~/binにTrinityへのシンボリックリンクを貼ります。

```
ln -s $HOME/src/trinitynaseq-Trinity-v2.8.4/Trinity $HOME/bin
```

これで、どの場所からでも

```
Trinity
```

コマンド一つでTrinityを起動できるようになりました。
【Swift4】PDFKitで横幅がバラバラのPDFを左寄せにする

# はじめに
PDFViewでPDFを表示する際に、ページごとに横幅が違うと横幅の小さいPDFは中央寄せになってしまいます。
今回、これを左寄せにする対応をしました。

# 実装
納めたい大きさのUIImageを作成し、PDFをその左端に描画することで、左寄せになっているPDFを生成します。

```swift
let url = URL(/* 表示したいPDFのURL */)
let pdfWidth: CGFloat = 600
var pdfDocument = PDFDocument()
var count = 0

if let document = CGPDFDocument(url as CFURL) {
    // Page数分回して左寄せ処理をし、PDFDocumentに追加していく。
    for pageCount in 0..<document.numberOfPages {
        if let page = document.page(at: pageCount + 1) {
            // CGPDFDocumentから取得したPageをUIImageにする。
            let pageRect = page.getBoxRect(.mediaBox)
            let renderer = UIGraphicsImageRenderer(size: pageRect.size)
            let pageImage = renderer.image { context in
                UIColor.white.set()
                context.fill(pageRect)
                
                context.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
                context.cgContext.scaleBy(x: 1.0, y: -1.0)
                
                context.cgContext.drawPDFPage(page)
            }
            // UIImageにしたPageを、納めたい大きさのUIImageに描画する。
            // PDFの高さを取得するために一度PDFPageにする。
            if let pdfPage = PDFPage(image: pageImage) {
                let size = CGSize(width: pdfWidth,
                                  height: pdfPage.bounds(for: .cropBox).height)
                UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
                if let context = UIGraphicsGetCurrentContext() {
                    UIGraphicsPushContext(context)
                    
                    // Pageを画像の左端に描画する。
                    pageImage.draw(at: CGPoint(x: 0, y: 0))
                    
                    UIGraphicsPopContext()
                    // 画像からPDFPageにし、PDFDocumentに追加する。
                    if let newImage = UIGraphicsGetImageFromCurrentImageContext(),
                        let newPdfPage = PDFPage(image: newImage) {
                        pdfDocument.insert(newPdfPage, at: count)
                        count += 1
                    }
                }
            }
        }
    }
}
```

基本的にコメントの通りですが、左寄せと言うとViewをいじってあれこれしたくなりますがPDFそのものを左寄せにすることで実現することが出来ました。
そのためには一度UIImageを生成し、drawする必要があるということでした。

# おわりに
難しそうだなと思いながら調べ始めましたが、CGPDFDocumentがあるのでやろうと思えば色々出来そうです！