OmniAICreator/Qiita-1.07M huggingface dataset:
UILabelの改行まとめ

UILabelの改行の種類をいつも調べてる気がするので備忘録代わりにまとめた

```swift
let label = UILabel(frame: .zero)
label.lineBreakMode = .byWordWrapping
```

lineBreakModeの型であるNSLineBreakModeのドキュメントを見ると、改行方法は6種類ある

https://developer.apple.com/reference/uikit/nslinebreakmode

## byWordWrapping

> Wrapping occurs at word boundaries, unless the word itself doesn’t fit on a single line. See [Characters and Grapheme Clusters](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/stringsClusters.html#//apple_ref/doc/uid/TP40008025) in [String Programming Guide](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/introStrings.html#//apple_ref/doc/uid/10000035i) for a discussion of issues related to determining word boundaries.

![20170317195406.png](https://qiita-image-store.s3.amazonaws.com/0/92771/22a6b056-265a-f391-5ee7-5d3197a47268.png)

単語の境界で折り返す

## byCharWrapping

> Wrapping occurs before the first character that doesn’t fit.

![20170317200325.png](https://qiita-image-store.s3.amazonaws.com/0/92771/c8f04c03-2f5d-5408-0812-54c220bf14be.png)

文字で折り返す

## byClipping

> Lines are simply not drawn past the edge of the text container.

![20170317200325.png](https://qiita-image-store.s3.amazonaws.com/0/92771/482f7c5f-6fab-c454-3ece-6c3940e90b39.png)

折り返さず、端を超えた文字は表示されない

## byTruncatingHead

> The line is displayed so that the end fits in the container and the missing text at the beginning of the line is indicated by an ellipsis glyph. Although this mode works for multiline text, it is more often used for single line text.

![20170317200802.png](https://qiita-image-store.s3.amazonaws.com/0/92771/3a6d8ee2-7f34-fc9d-86e3-ffec4e6821a5.png)

文字列末尾が表示され、行の先頭に三点リーダ

## byTruncatingTail

> The line is displayed so that the beginning fits in the container and the missing text at the end of the line is indicated by an ellipsis glyph. Although this mode works for multiline text, it is more often used for single line text.

![20170317200954.png](https://qiita-image-store.s3.amazonaws.com/0/92771/7ac90fb5-a6cf-5e3d-4dba-30a84791dbfb.png)

文字列先頭が表示され、行の末尾に三点リーダ

## byTruncatingMiddle

> The line is displayed so that the beginning and end fit in the container and the missing text in the middle is indicated by an ellipsis glyph. This mode is used for single-line layout; using it with multiline text truncates the text into a single line.

![20170317201055.png](https://qiita-image-store.s3.amazonaws.com/0/92771/c35807f7-5ac5-8b59-96de-6eab95ed14af.png)

文字列先頭と末尾が表示され、中央に三点リーダ
iOSでPDFを表示してみる

iOSでPDFを表示する方法を知らなかったのでメモ書き

```swift
//: Playground - noun: a place where people can play

import PlaygroundSupport
import UIKit
import CoreGraphics

class PDFView: UIView {
    var page: CGPDFPage?

    override func draw(_ rect: CGRect) {
        guard let page = page else { return }

        guard let context = UIGraphicsGetCurrentContext() else {
            fatalError()
        }

        context.translateBy(x: 0, y: rect.size.height)
        context.scaleBy(x: 1.0, y: -1.0)

        let box = page.getBoxRect(.mediaBox)

        let xScale = rect.size.width / box.size.width
        let yScale = rect.size.height / box.size.height
        let scale = min(xScale, yScale)

        let tx = (rect.size.width - box.size.width * scale) / 2
        let ty = (rect.size.height - box.size.height * scale) / 2

        context.translateBy(x: tx, y: ty)
        context.scaleBy(x: scale, y: scale)
        context.drawPDFPage(page)
    }
}

guard let url = NSURL(string: "http://devstreaming.apple.com/videos/wwdc/2016/402h429l9d0hy98c9m6/402/402_whats_new_in_swift.pdf"), let doc = CGPDFDocument(url) else {
    fatalError()
}

let pageCount = doc.numberOfPages
let number = 1
let page = doc.page(at: number)

let view = PDFView(frame: UIScreen.main.bounds)
view.backgroundColor = UIColor.lightGray
view.page = page

PlaygroundPage.current.liveView = view

```

上のコードはPlaygroundで検証しました。`PlaygroundPage.current.liveView = view`でPlaygroundでもViewの検証ができます。

![20161111181540.png](https://qiita-image-store.s3.amazonaws.com/0/92771/0cfab9b5-3d6d-610c-175d-394f6c7d1964.png)

今回はシングルページの表示ですが、`doc.page(at: number)`でページを切り替えれるので、簡単にPDFViewerみたいなアプリも作れそうですね
Railsのmini_magickで、画像のアップロードに失敗する問題

# エラーも出ずに、アップロードできない、、、
画像ファイルをnewした@imageを**@image.save**としても、

```
(0.3ms)  BEGIN
(0.2ms)  ROLLBACK
```
のようにsaveが取り消される。

# ROLLBACKの理由を表示する
@image.saveの前にbinding.pryを記述して、ターミナルを起動させる。
その後手動でsaveし、ROLLBACKされることを確認してから`logger.debug @image.errors.inspect`を入力すると、エラーの理由が表示される。

```
[1] pry(#<ImagesController>)> @image.save
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
=> false

[2] pry(#<ImagesController>)> logger.debug @image.errors.inspect
#<ActiveModel::Errors:0x007ff982cfbda8 @base=#<Image id: nil, name: "", file: nil, created_at: nil, updated_at: nil>, @messages={:file=>["Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: `identify ...省略
```

つまりエラーメッセージは、Failed to manipulate with MiniMagick, maybe it is not an image?である。

# 解決策
調べたところ、ImageMagickのバーションが古いのかもしれないとのこと。よって、ターミナルで

```
brew update && brew upgrade imagemagick
```

を実行すると、無事にmini_magickが使えるようになった！
Swiftでカリー化

Swift3ではカリー化用のシンタックスが廃止されました。廃止には用途が限定的などの理由が挙げられていますが、たまに使うことがあるのでSwift3での記法のメモ書きです。

英語ですが廃止の詳しい理由は[0002-remove-currying.md](https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.md[f:id:Nonchalanttan:20161006145956p:plain])に書かれています。

```swift
// Swift2
func curried(x: Int)(y: String) -> Float {
    return Float(x) + Float(y)!
}

curried(1)("2") // 3

// Swift3
func curried(_ x: Int) -> (String) -> Float {
    return {(y: String) -> Float in
        return Float(x) + Float(y)!
    }
}

curried(1)("2") // 3
```

ただカリー化された関数を使いたいときは上のコードでいけますが、ついでにカリー化の一般的な関数を定義してみました。

```swift
func curry<A, B, C>(_ function: @escaping (A, B) -> C) -> (A) -> (B) -> C {
	return {(a: A) -> (B) -> C in {
		(b: B) -> C in
			function(a, b)
		}
	}
}

func plus(x: Int, y: String) -> Float {
	return Float(x) + Float(y)!
}

curry(plus)(1)("2") // 3
```

これで特定の関数をカリー化せずに、使う際にcurry関数に関数を渡してあげると使えます。ただ、上のコードでも分かる通り、定義したcurry関数は引数を2つしか取れないので、引数が3つや4つになるときは都度定義する必要があります。
Swiftで同じ値を繰り返す文字列、配列

Swift3で同じ値を繰り返す文字列、配列のコンストラクタの記法が変わっていたため、個人的にメモしました。

```swift
// Swift 2.3
let str = String(count: 10, repeatedValue: Character("s")) // "ssssssssss"
let arr = Array(count: 10, repeatedValue: "s") // ["s", "s", "s", "s", "s", "s", "s", "s", "s", "s"]

// Swift 3.0
let str = String(repeating: "s", count: 10) // "ssssssssss"
let arr = Array(repeating: "s", count: 10) // ["s", "s", "s", "s", "s", "s", "s", "s", "s", "s"]
```

Swift3からStringとArrayのコンストラクタの`public init(count: Int, repeatedValue: Element)`は`public init(repeating repeatedValue: Element, count: Int)`に変更されました。どちらもtupleをコンストラクタに渡して生成する方法なのですが、個人的にはイマイチSwift3の変更点と噛み合ってない気がします。

```swift
// Swift 2.3
func hoge(param1: Int, param2: Int) {
    ...
}

func fuga(param0 param1: Int, param2: Int) {
    ...
}

hoge(0, param2: 1)
fuga(param0: 0, param2: 1)

// Swift 3.0
func hoge(param1: Int, param2: Int) {
    ...
}

func fuga(param0 param1: Int, param2: Int) {
    ...
}

hoge(param1: 0, param2: 1)
fuga(param0: 0, param2: 1)
```

Swift3からfunction callの第1引数のラベル名の省略がされなくされました。ですので、上で紹介したコンストラクタもrepeatingというラベル名をわざわざ設定しなくてもrepeatedValueというラベル名が必須なるので必要ないのかなと感じました。

ちなみに型を調べるのに使う`dynamicType`も`type(of: Element)`に変更されていました。

```swift
// Swift 2.3
let tpl1 = (count: 10, repeatedValue: "s")
let tpl2 = (10, "ssssssssss")

print(tpl1.dynamicType) // (Int, String)
print(tpl2.dynamicType) // (Int, String)

print(tpl1.count) // 10
print(tpl2.0) // 10

// Swift 3.0
let tpl1 = (count: 10, repeatedValue: "s")
let tpl2 = (10, "ssssssssss")

print(type(of: tpl1)) // (Int, String)
print(type(of: tpl2)) // (Int, String)

print(tpl1.count) // 10
print(tpl2.0) // 10
```

同じ値を繰り返す文字列、配列などはプロダクションコードではあまり使う機会がないかもしれないのですが、デバッグなどのちょっとした処理を書くときに結構使うことがあります。こういう点も意外と変更されているので注意が必要ですね。ただ、今回の変更に関してはイマイチ納得感はなかったです。何かこの変更の理由をご存じの方がいらっしゃいましたら、教えていただけると助かります。
[Swift4] バックグランド状態になった時にViewControllerで処理を行う

「[NotificationCenter](https://developer.apple.com/documentation/foundation/notificationcenter)」を使って実装できる。
この通知センターを使えば、アプリがバックグラウンドに行ったり終了されたりするタイミングを拾える。

# 実装
データを渡したい場合は、`userInfo:`で指定する

```AppDelegate.swift
 // アプリがバックグランド状態になったら呼ばれる
 func applicationDidEnterBackground(_ application: UIApplication) {
    // 特定のnameで通知を発信
    NotificationCenter.default.post(
            name: .AppDidEnterBackground,
            object: nil,
            userInfo: ["test": 123])
}

extension Notification.Name {
    static let AppDidEnterBackground = Notification.Name("applicationDidEnterBackground")
}
```

``` ViewController.swift
class ViewController: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 通知センターの受信を登録
        NotificationCenter.default.addObserver(
            self, selector: #selector(ViewController.viewDidEnterBackground(notification:)),
            name: .AppDidEnterBackground,
            object: nil)
    }

    @objc func viewDidEnterBackground (notification: NSNotification?) {
        let dic = notification!.userInfo
        print(dic!["test"]!)
    }
}
```
Texus Instruments SensorTag CC2650のRoll/Pitch/Yawを計算する

# はじめに

このプログラムは作りかけです。
RollとPitchはいい感じに取得できるのですが、Yawが時々暴走して明後日の値になってしまいます。きっと何か計算が間違っていると思うのですが、未だ原因特定できません。

# 概要

[TI SensorTag](http://www.tij.co.jp/ww/wireless_connectivity/sensortag/)は、いくつもセンサーを搭載した小さなデバイスです。BLEで接続し、それなりに簡単(?)にセンサーから値を取得できます。

そのセンサーのうち、加速度、角速度、磁気（いわゆる9軸ジャイロ）から、デバイスがどちらに傾いているか、どちらに向いているかを計算します。

# 環境

- TI SensorTag CC2650 (Firmware 1.40 Mar 30 2017)
- macOS High Sierra
- Python 2.7.10
- AdaFruit_BluefruitLE

macOSで使えるPythonライブラリが無くて探しました。
macOSで開発するなら、PythonよりNodeの方がいいかもしれません。

# BLE接続について

BLEって低電力なBluetoothだと思っていました。
いえいえ、全然違いました。

BLEデバイスは、以下のような手順で統一的に操作できる便利なやつでした。

1. ご近所のデバイスをスキャン
2. デバイスにあるサービスをリストアップ
3. サービスにあるキャラクタリスティクスをリストアップ
4. キャラクタリスティクスを指定して値を読み書き

[Lightblue](https://itunes.apple.com/jp/app/lightblue/id639944780?mt=12)というアプリを使うと、上記の操作が簡単にできます。

## Lightblueを使ったお試し

Lightblueを起動すると、デバイスを検索してくれます。
デバイスが見つかったら、F000AA80-0451-4000-B000-000000000000というサービスを辿ります。
F000AA82-0451-4000-B000-000000000000というキャラクタリスティクスが設定とセンサーのOn/Off切り替えです。
接続した直後はOffになっています。
ここに`0x7f00`を書き込むと、F000AA81-0451-4000-B000-000000000000というキャラクタリスティクスからセンサーの値を読み込めます。

<img width="1154" alt="スクリーンショット 2018-05-28 1.52.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/59475/63d3a585-424d-c61d-da56-a9c3185d414d.png">

<img width="771" alt="スクリーンショット 2018-05-28 1.53.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/59475/0728bf26-e6de-98c0-f41c-728e9c207fda.png">

どんな値を読み書きすればよいのかは、下記をご覧ください。
http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User%27s_Guide#When_connected

# Roll/Pitch/Yawの計算について

センサーから取得した値から単純に計算すると、何もしてなくてもどんどんずれていってしまいます。
Qiitaを検索すると、Kalmanフィルタを使えという記事が見つかりました。
でも、欲しいのはRoll/Pitch/Yawなのです、さらに探すとMadgwickというものが見つかりました。

ありがたいことにC#のソースが公開されていたので、Pythonへ必要分を移植しました。
http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/

論文はこちら ＞ [Madgwickアルゴリズム](http://x-io.co.uk/res/doc/madgwick_internal_report.pdf)

# 作成したプログラム

githubに置きました。

https://github.com/sengokyu/ti-sensortag-movement-sample

## プログラムの実行

`sample/sample.py`ファイルを実行すると、60秒間Roll/Pitch/Yaw（というかオイラー角）を読み込んで画面に出力します。

![sensortag-sample.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/59475/ce909762-0c0d-26b3-59c1-8b381f12ef74.gif)

# Help Me!

地磁気を基準値として使うYawがおかしいです。
センサーを動かしていなくても、どんどん値が変わっていくことがあります（変わらないこともあります）。
どこをチェックすべきでしょうか。

# 感想

初Python、初BLE、初センサーと初ものづくしで、右も左もわからない。
さらに4元数という未知の数字。
なんにもわからないけれど、初めてできることは楽しいですね。
MFクラウド経費 API 認証キーの取得方法

#MF クラウド経費とは？
MF クラウド経費は、「完全自動化*」、「スマホで完結」、「ペーパーレス」を特長とし、面倒な経費に関する作業を大幅に削減クラウド型の経費精算ソフトです。中小企業の経営者や経理等のご担当者、確定申告の準備中の方から経費精算申請をするビジネスマンまで、経費に関わる全ての方がご利用いただけます。

*クレジットカードやICカードの利用履歴の自動取得やオペレーター入力を組み合わせることで、手入力がゼロになる状況のことを意味しています。

URL: [https://biz.moneyforward.com/expense](https://biz.moneyforward.com/expense)

#API の使用に必要な認証キーの取得方法
MF クラウド経費のライセンスがあれば、API を使うことができます。この記事では、基本的なAPI の使い方を書きます。

1. MF クラウド経費にログイン後、ホームの一番下の「API 連携β（開発者向け）」をクリックします。
![mfexpense1.png](https://qiita-image-store.s3.amazonaws.com/0/116843/014e7bb7-3b93-533c-d82b-887016f6d7e7.png)

2. アプリケーション一覧画面で、まずは「API ドキュメント」から、API ドキュメントを見てみましょう。イチゴGitHub のページに飛ぶので、一番下の「API リファレンス」を見てみましょう。[https://expense.moneyforward.com/api/index.html#/ex_transaction](https://expense.moneyforward.com/api/index.html#/ex_transaction)

Swagger ベースのAPI ドキュメントですね！　これは使いやすそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116843/02d333ce-636a-53b7-0d9c-58cb14ff3149.png)

以下のエンドポイントがあります。MF クラウド経費で操作可能な項目はほぼカバーされています。
* 事業所
* 経費明細
* 申請
* 集計
* 事業所メンバー
* メンバーの経費設定
* メンバーのワークフロー
* 部門
* プロジェクト
* 役職
* 電帳法書類
* 経費科目

3. 「アプリケーション一覧」に戻り、「アプリケーションの作成」をクリックして、新規アプリケーションを作ります。
![mfexpense2.png](https://qiita-image-store.s3.amazonaws.com/0/116843/c3231b84-8362-8637-efd9-c98bfab956ce.png)

* 名前：アプリケーション名
* Redirect URI：何か
* Scope：全スコープなら office_setting:write user_setting:write transaction:write report:write account:write public_resource:read

「登録」ボタンを押してアプリケーションを作成。


4. アプリケーション一覧に作成したアプリケーションが表示されるので、名前をクリック。
Client ID、Client Secret が生成されていて、確認することができます。これらと設定したCallback URI を使ってAPI を叩くことができるようになります。
![mfexpense3.png](https://qiita-image-store.s3.amazonaws.com/0/116843/70ae8da8-0630-2e20-522c-147fdd8d5fda.png)
PRISM入門 その6 - DependencyInjection

## はじめに

Xamarinでスマートフォン向けのアプリケーションを開発しているとAndroidとiOSで異なる動作をさせたくなることがあります。当然、プリプロセッサを使用してOS毎に異なる動作をするように書くことはできます。
しかし、その方法ではOS毎に異なる設定とコンパイルが必要であり、同じ場所に複数のOS向けのコードを書くことになりコードが長くなってしまいます。

このような問題に対して、DependencyInjectionという手法を使用すると解決しやすくなります。
DependencyInjectionを用いると複数の環境(OSやセンサー、ネットワーク)等への対応や自動テストがやりやすくなります。

DependencyInjectionの方法は以下のようになります。
差し替えたい動作をMVやVとは異なるクラスに記述して、MVやVでその動作を行う時にクラスを渡すようにします。環境や条件ごとに渡すクラスを変更することで異なる動作を実現します。

例えば、iOSとAndroidで音声入力をしようとします。
OS固有のAPIを使用して1つのソースコードに記述する場合、以下のように書けるでしょう。
しかし、このような書き方だとソースコードが冗長になり、メンテナンス性も低くなってしまいます。

```
#if ANDROID

xxx... // なんらかの処理

#elif iOS

xxx... // なんらかの処理

#endif
```

そこでDependencyInjectionを使用します。
例えば、ITextSpeechというインターフェースを用意します。このインターフェースはGetTextというメソッドを持ち、GetTextを使用すると音声からテキストを取得できるとします。
そして、AndroidとiOSでTextSpeech_Android と TextSpeech_iOS というクラスを用意します。GetTextをOS固有のAPIで実装します。

今までと同じようにコンストラクタでクラスのインスタンスを受け取って、使用する時にインスタンスのメソッドを実行します。

```
ITextSpeech textSpeech;

ModelView(ITextSpeech textSpeech)
{
	this.textSpeech = textSpeech;
}

string GetText()
{
	return textSpeech.GetText();
}
```

こうすると、ITextSpeechに渡すクラスを変更すれば、MVの変更なしに複数のOSに対応できます。

OSの違いだけでなく、自動テストでは扱いに困るセンサーや通信も外部から渡すようにするとテストしやすくなります。

そして、このように記述するための方法がPrismには存在します。
それについて説明します。

## RegisterTypes

PrismではRegisterTypesを使用してインターフェースとクラスの結びつけをします。

AndroidとiOSでそれぞれクラスを定義します。

```
class TextSpeech_Android : ITextSpeech { ...
```

```
class TextSpeech_iOS : ITextSpeech { ...
```

iOSではテンプレートを使用すると予め生成されている```AppDelegate.cs```でインターフェースとクラスを結びつけます。結びつけるには、IPlatformInitializerのRegisterTypesメソッドの中でcontainer.Registerを使用します。

```
public class iOSInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry container)
    {
        container.Register<ITextSpeech, TextSpeech_iOS>();
    }
}
```

Androidでは予め生成されている```MainActivity.cs```に記述します。

```
public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry container)
    {
        container.Register<ITextSpeech, TextSpeech_Android>();
    }
}
```

結びつけた後、クラスのコンストラクタにインターフェースを記述すると自動的に取得できるようになります。

```
ModelView(ITextSpeech textSpeech)
{
```

XamarinにはDependencyServiceがありますが、これと違って
アプリケーションの起動時に使用するクラスを切り替えれます。

今回は説明を簡単にするために、テンプレートに記述されているクラスを変更しただけで、当然、自分でクラスを記述しても問題ありません。

DependencyServiceで定義するだけでも同じようにコンストラクタの引数で取得できるようになるという資料もありますが、7.0で試したところできませんでした。

## 最後に

日本語では依存性の注入と呼ばれますが、他の人も指摘しているように英語のWikipediaを見ると、「A dependency is an object that can be used」と記述されており、「使用されるオブジェクトの投入」のような訳の方が正しい気がします。
__toString()での例外処理


# __toString

> __toString() メソッド内から例外を投げることはできません。そうした場合、致命的なエラーが発生します。

http://php.net/manual/ja/language.oop5.magic.php#object.tostring

これでは困ります。

## trigger_error

メソッドをprivateメソッドに変更し(例えばtoString ）、`try-catch`で呼び出しエラーに変換します。

```php
public function __toString()
{
    try {
        return $this->toString();
    } catch (\Exception $e) {
        trigger_error($e->getMessage() . PHP_EOL . $e->getTraceAsString(), E_USER_ERROR);
        return '';
    }
 }
```

## テスト

phpunitは`__toString`でのエラー発生は例外に変換しないので通常の例外に変換されたPHPエラーを期待するテストはうまくいきません。下記のように一時的に`set_error_handler`をセットして記述できます。

```php
$errNo = $errStr = '';
set_error_handler(function (int $no, string $str) use (&$errNo, &$errStr) {
    $errNo = $no;
    $errStr = $str;
});
// __toStringで例外発生させる
$this->assertSame(256, $errNo);
$this->assertContains('foo', $errStr);
// ハンドラー復帰
restore_error_handler();
```
XCLIENTコマンド対応SMTPクライアントツール

XCLIENTコマンドに対応したメールサーバのテスト用のSMTPクライアントツールを作成します。

https://github.com/keikmobile/smtp_xclient

## XCLIENTコマンド対応SMTPクライアント目的

以下のエントリで構築したテスト用のpostfixのアクセスコントロールの確認を行うため、送信元アドレス、ホスト名を指定することが可能なXCLIENTコマンドに対応したSMTPクライアントツールを作成します。
https://qiita.com/keikmobile/items/2440ecebdd02adccc6a1

XCLIENTコマンドについては以下を参照ください。
http://www.postfix.org/XCLIENT_README.html

## XCLIENTコマンド対応SMTPクライアントツール仕様

XCLIENTコマンド対応SMTPクライアントツールの仕様は以下とします。

* SMTPでメッセージ送信が可能なこと。 
* XCLIENTコマンドでNAME,ADDR属性を指定可能なこと。
* XCLIENTコマンドの発行の有無は指定可能なこと。
* 以下パラメータはコマンドラインオプション指定可能なこと。
 * SMTP server host
 * SMTP server port
 * XCLIENT NAME attribute
 * XCLIENT ADDR attribute
 * MAIL FROM Reverse-Path
 * RCPT TO Forward-Path
 * SMTP Contents　(message)
* SMTPクライアントが発行するSMTPコマンドのシーケンスは以下の通りとする。
 * EHLO
 * XCLIENT
 * MAIL FROM
 * RCPT TO
 * DATA
 * QUIT
* 4xx,5xx応答を受けた場合は、QUITコマンドを発行して、終了すること。
* [TODO] SMTPサーバがXCLIENT拡張をサポートしていない場合、XCLIENTコマンドの発行はしない。
* [TODO] 各コマンドのレスポンスタイムアウトを実装すること。タイムアウトした場合、セッションを終了する(QUIT)
* [TODO] 各コマンドのリクエスト、レスポンスをログ出力すること
* [TODO] ログの出力有無は、指定可能とすること。

## SMTPクライアントツール実装

SMTPクライアントツールの実装は以下の方針とします。

* 言語はperl。

実行サンプル

```
$ ./smtp_xclient.pl --help
Usage: ./smtp_xclient.pl [options] 
[options:description:defalt]
--host                : smtp host : 127.0.0.1
--port                : smtp port : 127.0.0.1
--xaddr               : xclient addr
--xname               : xclient name
--helodomain          : helo domain : localhost
--mailfrom            : mail from   : localhost@localhost
--rcptto              : rcpt to     : vagrant@localhost
--message_file        : message file 
--help                : help
$ 
$ ./smtp_xclient.pl 
220 host.localhost ESMTP Postfix
EHLO localhost
250-host.localhost
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-XCLIENT NAME ADDR PROTO HELO REVERSE_NAME PORT
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:<localhost@localhost>
250 2.1.0 Ok
RCPT TO:<vagrant@localhost>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
TEST MESSAGE
.
250 2.0.0 Ok: queued as 985D420563
QUIT
221 2.0.0 Bye
$
```

github
https://github.com/keikmobile/smtp_xclient
Google Home のIPアドレスを確認する方法

Google Home NotifierからGoogle Homeを呼ぶ時などに
IPアドレスが必要な場合があるので、メモ。

### スマホ側でやること

- Google Home mini と接続したスマホの「Google Home」アプリを起動する

- 右上の、モニタとスピーカーが合わさったようなアイコンをタッチ

- デバイスの枠の中の右上のアイコンをタッチ

- デバイス設定が開くので、一番下にスクロール

- 見切れてるけどMACアドレスがかろうじて見える。先頭の文字は「4a:」だなぁ。とか。

↓

### 次、Mac側でやること

ターミナルから以下を実行

```
$ arp -an

? (192.168.0.14) at xxxxxxxxxxxxxxx on en0 ifscope [ethernet]
? (192.168.0.21) at 4a:xxxxxxxxxxxx on en0 ifscope [ethernet]
? (192.168.0.23) at xxxxxxxxxxxxxxx on en0 ifscope [ethernet]
```

- すると同じネットワーク上にいるやつらが見えるので、さっき見つけたMACアドレスと同じものを探す。
この場合は192.168.0.21がGoogle Home Miniにあたる。
エンジニア見習いがJJUG CCC 2018 Springに行ってみた感想

## 私のスペック
- 新卒で入社した日系IT企業で外資インフラ系のプロジェクトマネージャーとかノンテクな仕事を2年間してました
- Javaの経験は入社時の研修（約1週間？）で簡単な計算機を作ったくらい
- 色々あって（円満退職）2年前から無職

## 参加した目的
やっぱりエンジニアになりたいので、
世界や日本で1番使われている言語の一つであるJavaについて、
カンファレンスの雰囲気とともに知りたい、肌で感じたいと思い参加しました。
## 主に感想と内容
カンファレンスの概要やタイムテーブルは↓にまとまっています

http://www.java-users.jp/ccc2018spring/#/

追記: [スライドはこちらから見られます](https://github.com/jjug-ccc/slides-articles-2018Spring)


印象に残ってるセッションの感想をまとめました。

### 普通の人のためのJavaコミュニティイベントのススメ
スピーカー：杉山　貴章さん w/ 寺田さん

JJUG CCC初参加の人等初心者向けセッションでした。

- とにかく”Don’t be shy”
- カンファレンスでは本に載っていない最新情報が聞ける
- 質問しよう！
- 懇親会に参加しよう！
- アウトプットしよう！
- 登壇しよう！
- カンファレンスのボランティアスタッフとして参加もいいぞ！
- [JOnsen](http://jonsen.jp/)の紹介
  - 日本国内の温泉やお酒等を楽しみながら泊まり込みでJavaについて議論する会。
  - JOnsenでの規約の一つ、その場の発言は全て受け入れられる。
  - 基本英語で技術もハイレベルぽいけどめっちゃ興味ある…楽しそう！

寺田さんが
「ここに参加している若い人たちは私たちの宝です」
という趣旨のことをおっしゃっていたのが印象的でした。

すごく歓迎されてるようで嬉しかったです。あったかいコミュニティなんだなって思いました！

### JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜
スピーカー：Abe Asami さん

- Dockerとは、コンテナ技術を使ったプラットフォームのこと。
- コンテナは手軽さが魅力で基本使い捨て前提、大事なデータはホスト側に保存しよう。
- DockerHubに色々なDockerfileが公開されてるから、中身見ると勉強になる。
- まずは自分の開発環境から始めるのがおすすめ！
- [冷凍チャーハン](https://qiita.com/rawHam/items/80ba13d2d2d56dba411e)の例が面白くわかりやすい

とのことで、技術がわからない私にとってもわかりやすく、大変ありがたい内容でした。
4年ほど前に勉強した仮想化技術の記憶が役立ちました。そして、Dockerやってみよう。何に使おうかな。

### 他にも
- Java10と今後の話
- Kubernetes（Linux コンテナの操作を自動化するオープンソース・プラットフォーム）に移行したシステムの事例
- DDD（ドメイン駆動開発、顧客と開発者が業務を理解し、共通の言葉を使いながらシステムを発展させる手法）で進行中のプロジェクトの話

とか。
会場の雰囲気から、こういうのがホットトピックなんだなーっていうのを肌で感じることができました。

## 雰囲気
男女比は見た感じ9:1程度でした。

男性は年齢層高めな印象で、シャツやポロシャツなどかっちりした雰囲気の方が多かったと思います。

女性もオフィスカジュアルな方が多かったかなと。

私みたいなTシャツにジーンズな参加者はあまりいなかったです(笑)

## 全体を通して
知らないことをたくさん知ることができて楽しかったです。

調べようと思っても自分では調べられないことばかりでした。

このような場に身を置いて強制的に自分のやる気スイッチを押しに行くのいいなって思いました。


登壇者の方々、スタッフの方々、ランチセッションのときお話しした方、

本当にありがとうございました！！また行きます！！
Rubyでコンソールの画面制御をしよう(Curses)

# はじめに
RubyでカッケーCLIアプリケーションを作りたい...
なんてこと、ありますよね？

そこで`Curses`(カーシス)です

# Curses？

CursesとはUNIX系システムで端末制御を行うライブラリなのですが、
それをRubyでwrapしている(と思われる)便利なgemが同名の`curses`です

個人的に使用した部分をメモとしてまとめました


# 導入

cursesのインストール

```bash
gem install curses
```

rubyでcursesを使用

```ruby
require 'curses'
```

# 使い方
## 制御開始/終了
 `Curses.init_screen`で画面の制御スタート
 `Curses.close_screen`で制御を終了します

## windowの作成
```ruby
Curses::Window.new(height, width, 1, 1)
```

- 引数
 - 行数(int)
 - 列数(int)
 - 何行目から開始するか(int) <br> CSSのpadding-topみたいなものです
 - 何列目から開始するか(int) <br> CSSのpadding-leftみたいなものです
 
- 返り値
 - Curses::Windowオブジェクト

ここで作成したWindowオブジェクトを使用する形になります

## windowの削除
```ruby
Curses::Window.close
```
作成したWindowオブジェクトを閉じます

## 枠をつくる
```ruby
Curses::Window.box(?|,?-,?+)
```

- 引数
    - 縦(char)
    - 横(char)
    - 角(char)
 
引数に指定した文字で枠を生成します
枠の大きさは呼び出し元のWindowオブジェクトに依存します

## 画面の更新
```ruby
Curses::Window.refresh
```
文字列などを表示させたら画面を更新してあげてください

## カーソルの移動

```ruby
Curses::Window.setpos(y, x)
```
呼び出し元のWindowの(y,x)座標にカーソルを移動させます
文字を表示させたりする際にはカーソルを事前に移動させる必要があります

## 文字列表示

```ruby
Curses::Window.addstr(str)
```
- 引数
    - 表示する文字列(string)

## 文字入力
```ruby
Curses::Window.getch
```
入力待ち状態になります
入力した1文字が返ってきます

## 文字列入力
```ruby
Curses::Window.getstr
```
先程の文字列版です
入力待ちになり、文字列が取得できます

## 入力文字の表示/非表示
### 非表示
入力された文字が表示されなくなります

```ruby
Curses::noecho
```

### 表示
入力が表示されるようになります
主に文字を入力させたい場合に一時的に切り替えるために用います

```ruby
Curses::echo
```

# おわりに

え？おわり！？

はい、終わりです
基本的には上記のことだけである程度使用できるかと思います


文字の色を変えたり、その他、もっと高度なことがしたい方は、こちらのサイトが参考になるかと思います

[Rubyでcursesの実験 【基本編】](http://seeku.hateblo.jp/entry/2013/06/27/213848)
[Rubyでcursesの実験 【属性編】](http://seeku.hateblo.jp/entry/2013/06/28/222410)

## 追記

[khsk](https://qiita.com/khsk)様、誤字修正ありがとうございます
CentOS 5.6にsamba3.6.9をinstall

# CentOS 5.6にsamba3.6.9をinstall

下記サイトからsamba-3.6.9.tar.gzをダウンロード

https://download.samba.org/pub/samba/stable/

既存のSambaをアンインストールします。
インストールされているsamba関連のパッケージを表示します。
$ rpm -qa | grep samba
Samba関連のパッケージを削除します。
$ rpm -e system-config-samba-1.2.41-5.el5
$ rpm -e samba-3.0.33-3.29.el5_5.1
$ rpm -e samba-client-3.0.33-3.29.el5_5.1
$ rpm -e samba-common-3.0.33-3.29.el5_5.1

smbでも検索してみましたが表示されたパッケージは削除しにくそうだったの
削除しませんでした。
$ rpm -qa | grep smb

解凍します。
$ tar xvzf samba-3.6.9.tar.gz
ディレクトリを移動します。
$ cd samba-3.6.9/source3/
準備します。
$ ./configure
メイクします。
$ make
インストールします。
$ make install
設定ファイルを設置します。
$ cp ../exsamples/smb.conf.default /usr/local/samba/lib/smb.conf
ライブラリを設定します。
$ vi /etc/ld.so.conf.d/samba.conf
```conf:/etc/ld.so.conf.d/samba.conf
/usr/local/samba/lib
```
設定を再起動します。
$ ldconfig

起動することを確認します。
$ /usr/local/samba/sbin/smbd -D 
$ /usr/local/samba/sbin/nmbd -D

Versionを確認します。
$ /usr/local/samba/sbin/smbd -V
$ /usr/local/samba/bin/smbclient -V

このままではsambaをmount出来ないのでcifs-utilsをインストールします。
$ yum install cifs-utils
インストールできない。
前回設定したrepositoryにはcifs-utilsは無いようでした。

rpmでのインストール
ダウンロード先
https://centos.pkgs.org/5/centos-x86_64/libtalloc-compat1-2.0.7-2.el5.x86_64.rpm.html
https://centos.pkgs.org/5/repoforge-x86_64/cifs-utils-4.6-2.el5.rf.x86_64.rpm.html

インストール
$ rpm -Uvh libtalloc-compat1-2.0.7-2.el5.x86_64.rpm 
$ rpm -Uvh cifs-utils-4.6-2.el5.rf.x86_64.rpm 

マウントできることを確認する。(WindowsPCに共有ディレクトリ(\\\\X.X.X.X/DIRECTORY)を作成しておく。)
ディレクトリを作成する。
$ mkdir /mnt/DIRECTORY
マウントする。
$ mount -t cifs \\\\X.X.X.X/DIRECTORY /mnt/DIRECTORY -o username=Username
アンマウントできることを確認する。
$ umount /mnt/WinDeskTop
cifs-utils-4.6-2がインストールされていることを確認する。
$ rpm -qa | grep cifs
$ modinfo cifs
$ rpm -qi cifs-utils-4.6-2.el5.rf

centos7相当のcifs-utilsをインストールしてみる。
wgetでcifsutils-6.2をダウンロードする。
$ wget https://download.samba.org/pub/linux-cifs/cifs-utils/cifsutils-6.2.tar.bz2
httpsだとダウンロードできなかったのでhttpでダウンロードする。
$ wget http://download.samba.org/pub/linux-cifs/cifs-utils/cifsutils-6.2.tar.bz2
解凍する。
$ tar -xvjf cifs-utils-6.2.tar.bz2 
ディレクトリを移動する。
$ cd cifs-utils-6.2
必要なライブラリをインストールする。
$ yum install krb5-devel
$ yum install libtalloc-devel
$ yum install libcap-devel
$ yum install libwbclient-devel
準備する。
$ ./configure
先程インストールした4.6.2をアンインストールする。
$ rpm -e cifs-utils-4.6-2.el5.rf
メイクします。
$ make
インストールします。
$ make install
インストール出来ていることを確認する。
$ modinfo cifs
$ mount.cifs -V

mount.cifsでマウントする。
$ mount.cifs \\\\X.X.X.X/DIRECTORY /mnt/DIRECTORY -o vers=2.0,username=Username

smbclientでログインしてみる。
$ /usr/local/samba/bin/smbclient \\\\X.X.X.X/VMShare -U Username
終了するときは「q」

sambaの設定を確認する場合。
$ /usr/local/samba/bin/testparm

調査した結果。
samba serverとしてはsmb2で動作するがsamba clientやmountはKernelの制限でsmb1のみとなっているようでした。(Centos7からkernelとして対応しているようです。)
参考：
https://superuser.com/questions/874662/use-smb2-protocol-while-mounting-cifs-share-on-a-unix-client
https://access.redhat.com/discussions/882283
https://support.hpe.com/hpsc/doc/public/display?docId=mmr_kc-0127394
Rubyのメソッドについて

## メソッドとは

メソッドは色々な処理をひとつにまとめて定義して、何度も再利用（実行）できるようにしたものです。

## メソッドの種類

一般的にプログラミング言語には、メソッド的なものが２種類あります。

- 言語に標準で入っている**組み込み関数**
- ユーザが自分で定義する**ユーザ定義関数**

ここでは、いわゆるユーザが定義する関数に当たる方を説明します。

## メソッドの定義の仕方

Rubyのメソッド定義は、`def`と`end`の間に、実行したい処理を入れます。

`def`とは　define（定義する）の略です。

```rb:定義の仕方
def メソッド名
  メソッドが呼ばれたときの処理
end
```

試しに、1から5までの数字の和を求める`sum`メソッドを 作って見ます。

```rb:sumメソッドの定義の仕方
def sum
  result = 0
  (1..5).each do |number|
    result += number
  end
  puts result
end
```

## メソッドの呼び出し方

メソッドは呼び出されるまで動きません。なので、さきほど定義した`sum`メソッドを呼び出してみます。

```rb:sumメソッドの定義と呼び出し
def sum
  result = 0
  (1..5).each do |number|
    result += number
  end
  puts result
end

sum()

# 実行結果　15
```

### 引数なしの`()`なしの呼び出し

定義したメソッドはメソッド名を書くだけでも呼び出し可能です。

```rb
def hello
  puts "say Hello"
end

hello

# 実行結果　say Hello
```

## メソッドの呼び出し方（再利用可能）

一度メソッドを定義しておくと、何度でも再利用できます。

```rb
def hello
  puts "say Hello"
end

hello
hello

# 実行結果　
# say Hello
# say Hello
```

このように

- 何回も使えること
- 処理の呼び出しにラベル（メソッド名）だけで呼び出せる

ことがメソッドのいいポイントかなと思います。

## メソッドの引数について

メソッドには引数を渡すこともできます。これにより、引数次第で結果が変わるメソッドになります。

```rb
# メソッドの定義
def sum(a,b)
  result = 0
  (a..b).each do |number|
    result += number
  end
  puts result
end

# メソッドの呼び出し
sum(1,5)

# 実行結果 15
```

定義した`a と b`に対応しているのが、呼び出し元の`1 と 5`です。

引数の順番を間違えると、予期しない結果が起きてしまうので注意です。

また、メソッドの呼び出しのかっこは省略できます。

```rb
# メソッドの定義
def sum(a,b)
  result = 0
  (a..b).each do |number|
    result += number
  end
  puts result
end

# メソッドの呼び出し
sum 1,5

# 実行結果 15
```

## メソッドの返り値（`return`）について

これまでは、メソッド内で処理したデータを表示（`puts`）していましたが、メソッド内でゴニョゴニョした結果を変数に格納したい場合は`return`を使用します。

```rb
# メソッドの定義
def sum(a,b)
  result = 0
  (a..b).each do |number|
    result += number
  end
  return result
end

# メソッドの呼び出しと変数に格納
number1 = sum(1,5)
number2 = sum 1,5

# 実行結果 両方とも15
puts number1
puts number2
```

また、メソッド内の`return`は省略可能です。なぜなら、メソッド内の最後の行はリターンするものと決まっているので。

```rb
# メソッドの定義
def sum(a,b)
  result = 0
  (a..b).each do |number|
    result += number
  end
  result
end

# メソッドの呼び出しと変数に格納
number1 = sum(1,5)
number2 = sum 1,5

# 実行結果 両方とも15
puts number1
puts number2
```

## メソッドを使う時の注意点

### 注意点1_メソッド名の命名規則

- 1.1文字目は英文字かアンスコ（`_`）
- 2.2文字目以降は英数文字かアンスコ（`_`）

この決まりを守らないとエラーになります

### 注意点2_順番

メソッドの定義は、メソッドの呼び出しの前である必要があります。これも守らないとエラーになります。

## 参考

- http://uxmilk.jp/22320
Math.sqrt関数を使わない距離計算で処理速度を向上させる【enchant.js ゲーム制作】

# 結論
距離計算にMath.sqrt使っていたけど、処理が重い関数なので、加減乗除で距離を求められる方法を使ったら処理速度改善した。
また、誤差評価をしたところ4%以下となった。

# 以下ブラウザゲームの処理速度を向上させた
ファンタジー村人一揆　フォーエバー
ブラウザゲームです。
http://hothukurou.firebird.jp/game/Tobatsu/index.html

# 課題
このゲームはRPGっぽいフィールドで人間と魔物が互いの拠点を攻めあうゲームである。
ライフゲームのように観戦するだけでも楽しいですが、プレイヤーも人間側のキャラクタとして転生し、戦うこともできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/259887/881efd8d-748f-a337-57f5-1dc460172e04.png)

ゲーム内に登場する各キャラクタ（人間・魔物）のアルゴリズムは以下となる。


**・自分から最も近い敵キャラクタ・拠点を探して、その座標を取得。**
**・取得した座標へ移動。**



この処理を登場キャラすべてにおいて毎フレームごとに繰り返す。そして、想定フレームレートは15fps。
PCなら余裕でフレームレートを満たすことができるが、スマホで確認したところ6fpsまで低下してしまった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/259887/e5d1964c-db45-982b-c2e0-431cf0903cdc.png)

# 解決策
毎フレーム毎の処理を減らすことで8fps位まで向上したが、さらなる改善のため、距離計測のアルゴリズム改善を試みた。
普通に計算すると、自キャラの座標を$(x_1,y_1)$ 検索対象のキャラクタ座標を$(x_2,y_2)$としたときの二点の距離は以下の式で求められる。

```math 
L=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
```

この時、平方根を求める関数はMath.sqrtだが、この関数は数値解析で計算する関数なので処理に時間がかかる。
以下URLを見ると、for文やwhile文を何回も回していることがわかる。

**・ニュートン法で平方根を求める　（数学アルゴリズム演習ノート）**
http://www.etcnotes.info/almath/mathnewton.html



処理時間削減のため、できれば加減乗除一発で答えにたどり着いてほしい。探してみたところ、あった。
どうやら最大値を求める$max()$,と最小値を求める$min()$を足し算するだけでそこそこの精度で近似できるようだ。

**・平方根を使わずに高速で２点間の距離を近似する　（きしだのはてな）**
http://d.hatena.ne.jp/nowokay/20120604#1338773843



maxとmin に係数をつけて、誤差が激しい部分に補正のために項を追加することで加減乗除による距離計算を行うことができる。
上記のサイトから係数を引用して以下の関数を作成した。


```main.js
function CalcDistance(x, y) {
	x = Math.abs(x);
	y = Math.abs(y);
	var max = Math.max(x, y);
	var min = Math.min(x, y);
	var leng = 1007 / 1024 * max + 441 / 1024 * min;
	if (max < 16 * min) leng -= 5 / 128 * max;
	return leng;
}
```



実際にゲームに使用して問題がないか検証するために、誤差計算を行った。
エクセルで引数をランダムで設定して計算を行ったところ、以下となった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/259887/fa2d5feb-4247-b28a-1a09-fe2d8074667e.png)



誤差が4%を下回っている。

また、今回はゲーム制作なのでプレイヤーに「なんかヘンな動きしてないか」と思われなければ問題ないと考える。

実際にゲームに実装してみたところ、特に不自然な動きがなく「それっぽく見える」ため採用することにした。
結果、8fpsだったフレームレートが10fps程度まで向上した。15fpsまでは届かなかったが、処理速度が向上したことが確認できた。

#【蛇足】ゲーム制作における「それっぽく見えること」
作りたいゲームを実現するとき、完全な仕組みを作る必要はなく、「それっぽく見える」ことに全力を注ぐと簡単に作れることが多い。
例えばリバーシのAIプログラムを作るとき、複数の可能な行動から完全にランダムに１手を決定するアルゴリズムを生成しても、プレイヤーから見て面白ければ問題ない。
（しかも、可能な行動に角が含まれている時だけは必ず打つようにすれば、初心者相手だとそこそこの勝率になるらしい。）

ちなみに、任天堂から発売されたFCソフト「役満」のアルゴリズムは以下となっている。
・役満 (任天堂)　（wikipedia）
https://ja.wikipedia.org/wiki/%E5%BD%B9%E6%BA%80_(%E4%BB%BB%E5%A4%A9%E5%A0%82)

>CPUは対局のアルゴリズムは持っておらず、最初からテンパイしていてプレイヤーが上がれないと適当なタイミングで上がるというからくりだった（この頃の雑誌などに掲載されていた8ビットパソコン用麻雀ゲームも、同じようなロジックを採用していた）。


この手の話はすごくロマンがあると思うので、蛇足で載せた次第。

# まとめ
・Math.sqrt関数を使わず、Math.maxとMath.minを使用して距離を求める方法がある。
・ある程度の精度で良いのであれば採用の価値がある。
・ゲーム制作では「それっぽく見えること」が大事。

# 作成したゲーム
ファンタジー村人一揆　フォーエバー
http://hothukurou.firebird.jp/game/Tobatsu/index.html

以上です。
Anacondaをインストールし、Tensorflowを使って機械学習をしたいが、Permission deniedとエラーが出てインストールできません。

### 前提・実現したいこと

画像認識の機械学習のモデルを勉強したいため、Anacondaをインストールし、TensorflowやKerasを用いて自分なりに勉強したいと思っています。
そのため、Python 3.6 versionのmac用のAnaconda 5.1をインストールし、コマンドプロンプトから実行しました。機械学習や環境構築を含むプログラミングに関しては初心者で、開発経験などもございません。

### 発生している問題・エラーメッセージ
どうも私のPCだと解凍処理やインストールで[permission denied]というエラーメッセージが多発し、コマンドを受け付けないことが多いです。
アナコンダをインストールしようと、シェル上で
bash /Users/keisuke/Downloads/code/Anaconda3-5.1.0-MacOSX-x86_64.sh
を打つと、インストールを開始しますが途中で解凍の許可が下りずに止まってしまいます。以下がエラー内容です。

> installing: python-3.6.4-hc167b69_1 ...
> Python 3.6.4 :: Anaconda, Inc.
> installing: bzip2-1.0.6-hd86a083_4 ...
> installing: ca-certificates-2017.08.26-ha1e5d58_0 ...
> installing: conda-env-2.6.0-h36134e3_0 ...
> installing: intel-openmp-2018.0.0-h8158457_8 ...
> installing: jbig-2.1-h4d881f8_0 ...
> installing: jpeg-9b-he5867d9_2 ...
> installing: libcxxabi-4.0.1-hebd6815_0 ...
> installing: libgfortran-3.0.1-h93005f0_2 ...
> installing: libiconv-1.15-hdd342a3_7 ...
> installing: libsodium-1.0.15-hd9e47c5_0 ...
> installing: lzo-2.10-h362108e_2 ...
> installing: pandoc-1.19.2.1-ha5e8f32_1 ...
> **bunzip2: Can't open input file /Users/keisuke/anaconda3/pkgs/pandoc-1.19.2.1-ha5e8f32_1.tar.bz2: Permission denied.**
> Traceback (most recent call last):
>   File "/Users/keisuke/anaconda3/pkgs/.install.py", line 618, in <module>
>     main2()
>   File "/Users/keisuke/anaconda3/pkgs/.install.py", line 599, in main2
>     link_dist(opts.link_dist)
>   File "/Users/keisuke/anaconda3/pkgs/.install.py", line 454, in link_dist
>     link(prefix, dist, linktype)
>   File "/Users/keisuke/anaconda3/pkgs/.install.py", line 328, in link
>     files = list(yield_lines(join(info_dir, 'files')))
>   File "/Users/keisuke/anaconda3/pkgs/.install.py", line 96, in yield_lines
>     for line in open(path):
> FileNotFoundError: [Errno 2] No such file or directory: '/Users/keisuke/anaconda3/pkgs/pandoc-1.19.2.1-ha5e8f32_1/info/files'

このほかにもpip install tensorflowと打つと、

> Collecting tensorflow
>   Using cached https://files.pythonhosted.org/packages/9b/1e/d89f1369b5b8045e5aedf43718b45d2396d3c61e9cc56123c24b7758dd9f/tensorflow-1.8.0-cp27-cp27m-macosx_10_11_x86_64.whl
> **Could not install packages due to an EnvironmentError: [Errno 13] Permission denied:** u'/private/var/folders/4y/z038tqx15jvfqptw0s_tmz8w0000gp/T/pip-unpack-Sk9pwB/tensorflow-1.8.0-cp27-cp27m-macosx_10_11_x86_64.whl'
> Consider using the `--user` option or check the permissions.

のように[permission denied]と出ていずれにせよTensorflowをインストールできません。

### 試したこと

エラーメッセージを頼りに様々な解説サイトを参考にして以下のような方法を試しましたが全てダメでした。
・sudoや--userをつけたり、umaskを緩く設定してコードを実行　→　同じエラー
・python関係の全てのフォルダ/ファイルを削除してanacondaを再インストール　→　同じエラー
・anaconda navigatorを使ってtensorflowをインストールしようとする　→　ロードした後何も追加されずに終わる（おそらく裏でpermission deniedが起こってます）
・(env)(tonsorflow)$　のように、tensorflowの仮想環境に入って同じことを実行　→　同じエラー

### 補足情報（FW/ツールのバージョンなど）

今の条件：
・Macbook Pro 10.12.6（品質の良い中古品）
・echo $PATH
/anaconda3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
・.bash_profile
export PATH="/anaconda3/bin:$PATH"
・Python 2.7.15
・/Users/keisukeと、/Users/keisuke/Downloads/codeの下に「anaconda3」という同じファイルが入っています（中身は違う）。
仕事が捗るアプリ for Mac

# はじめに
@poster-keisuke です。:hand:
新社会人の方は、入社してもすぐ2ヶ月が経とうとしているところでしょうか。
うちの会社でも、研修を終えて新卒の方たちが各プロジェクトに配属され始める時期になりました。

仕事に慣れていないと、やることはいっぱいあるのに、あれもこれもとなってしまってなかなか仕事が進まないなんてことがあるかもしれません。（2年目ですが自分もまだまだここができていないです。:sob:）

そのためにも、なんとか不要な作業や余計な仕事はやらずに済ませたいものです。
そんな日々の業務で少しでも効率よく作業ができるようなおすすめアプリを紹介します。

（自分が最近使ってオススメしたいものだけに絞って紹介するので、過去に色々紹介されているものは省きます。あとmacのみのものが多いのでwindowsユーザーの方ごめんなさい:bow:）

## バラバラのアプリをまとめて一括化

### [station](https://getstation.com/)
<img width="1439" alt="スクリーンショット 2018-05-27 23.09.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/140786/9304059f-e622-8011-7482-08a19b6370cc.png">

- 一つのサービスで、複数のアプリを切り替え
- 約400種の豊富なアプリ
- 複数のアカウントを切り替えて使うことも可能
- Electronで書かれているようです

仕事中は、いくつかのサービスを切り替えながらタスクをこなして行くことが多いかと思います。
GithubでPRを出して、slackで連絡して、Trelloでタスク管理をして。。。。

などなど、これだけでも3つのサービスを行き来していますよね。それぞれブラウザにピンどめしていたり、個別のアプリを開いて作業していたりと、使うアプリごとに切り替えて使うのってめんどくさくないですか？

（自分はいろんなアプリをChromeにピンどめして使っていたのですが、メモリをめちゃくちゃ食ってしまって他に支障が出るほどなときが一時期ありました）

そんなときにstationを使えば、いつも使っているサービスを一つのアプリケーションで管理することが可能です。


↓こちらにアプリ一覧が表示されています。
<img width="1399" alt="スクリーンショット 2018-05-27 23.18.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/140786/48625d7a-bbf1-bf43-2fbf-e73676afbba6.png">

公式によると、約400のアプリケーションの中から、自分が普段使うものを選んでホームにおいておくことができます。
Gmail Googleカレンダー Google Drive Trello Todoist slack Github zenhub Zeplinなどなど
ほとんどこちらに登録することが可能なので、行き来をすることなく切り替えが可能です。

また、ショートカットキーとして `⌘ + T`でアプリ内検索も可能なので、いっぱいアプリを登録していてもすぐに見つけられるかと思います。

複数のGoogleアカウントを切り替えて使うことも可能です。

## 書いたメモは他の端末でも共有したい

### [Boostnote](https://boostnote.io/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140786/974925e7-3cce-35c0-4c3a-299bc281ce41.png)

- OSSの無料で利用できるマークダウンメモ帳
- 複数端末はDropboxなどを使って共有可能
- そこそこのカスタマイズ性あり

仕事中は調べたこと、気になったこと、失敗したことなどなど、とにかくメモに残す機会が増えるかと思います。
これまた、会社のPCのメモ帳、自分のスマホのメモ帳、自宅のPCメモ帳。。。

などなど。記録したメモはどこに。。。:thinking_face:
なんてことはありませんか？

Evernoteを使っている方もいらっしゃるかと思いますが、最近無料アカウント枠はログイン端末数に制限がかかってしまったので、自分は泣く泣く断念。
また、マークダウンでメモを取りたいということもあったので、いくつかのアプリの中からこちらを利用したのですが、今の所あまり不満もなく利用できています。

他端末へのメモの共有は、Dropboxなどのクラウドストレージを使うことですることができます。(ちなみにDropboxも上のstationで使えます笑)

なによりも魅力は、日本で開発されているOSSというところ。
応援したいという気持ちも相まって、こちらを使っています。


## おまけ
以下は主にエンジニアにオススメしたいアプリになります。

### [zenhub](https://www.zenhub.com/)
githubのIssue管理に最適です。過去に記事を書いたので、詳しくは記事を御覧ください。

[Zenhubを使ってチームのタスクを可視化しよう](https://qiita.com/poster-keisuke/items/f1fdfaca8f27de00faf1)

### [Hyper](https://hyper.is/)
おしゃれなコンソールです。カスタマイズがめちゃくちゃしやすいので、（reactで書かれているようです）おすすめです。

こんな感じでポケモンのテーマもあるので、よかったらぜひ笑
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140786/0a3c7eae-63fe-39b8-f764-56e40b6f84fc.png)

[爆速でターミナルをポケモンにする](https://qiita.com/chanuu/items/b5c3d11e089ad0c7356d)


### おわりに
いかがだったでしょうか。

うまく仕事を効率化することで、
自分が本当にやりたいこと、やらなければいけないことに集中できる時間をいっぱい確保しましょう！

そして早く仕事を終わらせて自宅で一杯なんて、素敵ですね:cocktail:

#### 参考
- [DropboxもSlackもたった1つのアプリで！Webサービスを統合管理できるmacOS用アプリ「Station」｜ferret フェレット](https://ferret-plus.com/8623)

- [プログラマのための”和製”メモ帳Boostnoteをつかってみた！設定法や使用法についての記載あり！ - プログラミング向上雑記](http://niisi.hatenablog.jp/entry/2016/01/12/220000)
Apache mod_dosdetector で同一IPからのアクセス過多を防いでみる

[Apache mod\_dosdetector](https://github.com/stanaka/mod_dosdetector)を使うと、DoS攻撃を検出できます。DoS攻撃を検出した場合、特定の環境変数に値をセットします。
mod_dosdetector自体はリクエストに影響を及ぼしません。

どんな感じなのか試してみました。

## 前提

- Debian GNU/Linux 8 (jessie)
- Apache/2.4.33

## 環境構築

https://github.com/stanaka/mod_dosdetector をインストールします。

```
$ apt-get update && apt-get install -y git vim make gcc
$ ln -s /usr/local/apache2/bin/apxs /usr/sbin/apxs
$ git clone https://github.com/stanaka/mod_dosdetector
$ cd mod_dosdetector && make install
```

Apacheの設定ファイルに下記を追記します。

```conf:http.conf
LoadModule dosdetector_module modules/mod_dosdetector.so
LoadModule rewrite_module modules/mod_rewrite.so

DoSDetection on
DoSPeriod 60
DoSThreshold 5
DoSBanPeriod 60

RewriteEngine On
RewriteCond %{ENV:SuspectDoS} =1
RewriteRule .*  - [R=503,L]
ErrorDocument 503 "Hasta la vista, baby."
```

mod_dosdetectorは、`DoSPeriod`秒間に(おそらく同一IPアドレスから)`DoSThreshold`回のリクエストがあった場合、特定の環境変数に1を設定します。
この場合だと、60秒間に5回のアクセスがあった場合にDoSと判断します。

mod_rewriteを使って、セットされた環境変数に応じて挙動を変えることで、DoS攻撃への対策を設定することができます。この場合は503を返すようにしています。

`RewriteCond`をちゃんと書けば、静的アセットファイルへのアクセスはDoS検知の対象から外したり、正規のクローラからのアクセスは除外したりすることができると思います。

### Dockerでの検証環境構築

上述の設定を検証するための環境をDockerで構築します。[Apacheの公式イメージ](https://hub.docker.com/_/httpd/)を使います。

```Dockerfile:Dockerfile
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

# Installing mod_dosdetector
RUN apt-get update && apt-get install -y git vim make gcc
RUN ln -s /usr/local/apache2/bin/apxs /usr/sbin/apxs

RUN git clone https://github.com/stanaka/mod_dosdetector
RUN cd mod_dosdetector && make install

COPY ./conf/dos-detecting-httpd.conf /usr/local/apache2/conf/httpd.conf
```

```
$ docker build --tag my-apache-mitigating-dos --file ./Dockerfile .
$ docker run --name my-apache-mitigating-dos --publish 8081:80 my-apache-mitigating-dos
```

通常のApacheを8080、DoS DetectorがインストールされたContainerを8081ポートに立てておくと、検証しやすいと思います。

実際に使ったDockerfileやhttp.confはGitHubに上げてあります。
https://github.com/s2terminal/apache_mitigating_dos

## 検証
Apache Benchで検証してみます。
[ab \- Apache HTTP server benchmarking tool \- Apache HTTP Server Version 2\.4](http://httpd.apache.org/docs/2.4/programs/ab.html)

```
$ ab -n 1000 -c 1000 http://localhost:8080/
```

デフォルトの場合

```
Complete requests:      1000
Failed requests:        0
```

mod_dosdetectorを入れている場合

```
Complete requests:      1000
Failed requests:        996
```

ちゃんと5アクセスめ以降がBanされているのが分かります。

なお、これぐらいの設定であれば、手でブラウザリフレッシュを繰り返しても再現することが出来ます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50391/6fe56d1f-6f63-0329-6807-7be590f201ff.png" alt="20180527-dos.png" width=400px>
DoS攻撃と認識された時、ちゃんとmod_rewriteで設定されたコンテンツが返って来ています。

## 参考

- [Apache で DoS 攻撃を防ぐ \- mod\_dosdetector \- \| バシャログ。](http://bashalog.c-brains.jp/10/06/24-134947.php)
【 javascript / jQuery 】event.targetとevent.currentTerget

よくあるネタですが備忘録として。。。

```js
$('li').on('click', $.proxy(function(e) {

  var $target = $(e.target);

  this.xxxx($(this), $target);

・・・

},this));
```

上記みたいな書き方をしてしまうと
liの中の他要素をクリックした時、クリックした要素、つまりイベントが発火した要素が
$targetとして保存されてしまったりする。

これは単純にイベントが発生した要素がevent.targetで取得できるため。

常にliのようにイベントが通過した要素を取得したい場合は
イベントリスナを登録した要素を取得するcurrentTargetを利用する。
tmuxのwindow名がzshのときだけカレントディレクトリにする

## introduction
tmuxでは普段window名にはプロセス名が表示されます。
vimとかシェル以外のプロセスが動いてる時はいいんですが、シェルのまま待機させとくとがzshばっかりになってつらい。

## solution
下のように.tmux.confに書くとOK.
これで`1:vim*`とか`2:hoge_directory-`とか表示されるようになる。

```zsh:.tmux.conf
set -g automatic-rename on
set -g window-status-format         '#I:#{?#{m:#W,zsh},#(basename #{pane_current_path}),#W}#F'
set -g window-status-current-format '#I:#{?#{m:#W,zsh},#(basename #{pane_current_path}),#W}#F'
```

簡単に解説すると、`automatic-rename on`はその名の通り自動的にwindow名を変更する。
`status[-current]-format`はwindow名の形式を指定する(currentはアクティブなwindow用)。

window名のフォーマットでは#を使うといろいろできるので使ったやつだけ解説します。
それ以外は[参考文献](#参考文献)のtmuxのドキュメントを参考に。
スペース途中に入れたりすると動かなくなるので注意。
ちなみにデフォルトだと`#I:#W#F`です。

- `#I`: window番号
- `#{?COND,A,B}`: 条件CONDが真ならA、そうでないならB
- `#{m:PATTERN,STR}`: 正規表現PATTERNがSTRにマッチしたら真、そうでないなら偽
- `#W`: window名 (普段はプロセス名が入ってる)
- `#(CMD)`: シェル用のコマンドCMDの実行結果の１行目
- `#{pane_current_path}`: アクティブなpaneのカレントディレクトリ
- `#F`: ステータス(アクティブ * とか１つ前アクティブ - とか)

## 参考文献
[tmux man page: format](http://man.openbsd.org/OpenBSD-current/man1/tmux.1#FORMATS)
Java ジェネリクス（クラス、メソッドを定義する）

Javaのジェネリッククラスやジェネリックメソッドを定義する上での文法について。
用語に関してはここを参照 → [Java ジェネリクスのポイント](http://qiita.com/pebblip/items/1206f866980f2ff91e77)

# 仮型パラメータ
例えば```List<E>```であれば、山カッコで括られた```E```が仮型パラメータである。
文法上は2文字以上や小文字混じり等でも問題ないが、慣例的には1文字が多く使われる。
```<E>```や```<T>```はそれぞれ*Element*や*Type*の略だったりする。

## 仮型パラメータに対する制約
型パラメータの情報は実行時に消去されるので、いくつかの制約がある。
- ```new T()```できない
- ```new T[]```できない
- ```T.class```は参照できない
- ```obj instanceof T```の評価はできない

# ジェネリッククラスの定義方法
　```SomeClass<T>```と書くと、その型パラメータ```T```をクラスのフィールドや（引数、戻り値を含めた）メソッド内で使用することができる。

```java
//                     ↓ここに型パラメータを書く
public class SomeClass<T> {
  private T t;  // フィールド署名にTを利用できる
  private List<T> list = new ArrayList<T>();  // ジェネリクスを使用したフィールドにTが使用できる
  public void set(T arg){  // インスタンスメソッドの署名にTが使用できる
    this.t = arg;
  }
  public T get(){
    return this.t;
  }
}
```


なお、以下のようにジェネリッククラスの仮型パラメータをそのクラス内のstaticメソッドやstatic文の中で使用することはできない。
staticな文脈で利用したい場合は後述のジェネリックメソッドで解決しよう。

```java
public class Hoge<T>{
  static {
    T t; // コンパイルエラー
  }
  public static void hoge(T t){ // コンパイルエラー
  }
}
```

# ジェネリックメソッドの定義方法
メソッドの戻り値の型の手前に```<T>```を書くと、その型パラメータ```T```をメソッド内で使用することができる。

```java
  //             ↓ここに型パラメータを書く
  public static <T> ArrayList<T> someMethod(T arg){
    ArrayList<T> list = new ArrayList<T>();  // メソッド内でTが使用できる
    list.add(arg);
    return list;
  }
```

---

ジェネリッククラスの定義やメソッド定義の基本的なところは以上で、あとはケースによって仮型パラメータである```<T>```の中身を変えていく。

---

# いろいろな例

## 複数の型パラメータ
カンマ区切りで複数の型パラメータを使用することができる。

```java 
  public static <K, V> HashMap<K, V> newHashMap(){
    return new HashMap<K, V>();
  }
```
```java
  // ※<K,V>の型は左辺から推測してくれる
  Map<String, Integer> map = newHashMap();
```

## 境界型パラメータ
```<T extends クラスやインターフェース>```のように書くと、```T```が指定したクラスのサブクラス（または指定したクラスそのもの）であることを呼び出し側に要求することができる。

```java
  // Number型のサブクラスもしくはNumber型でのみインスタンス化できるArrayList
  public class NumArrayList<T extends Number> extends ArrayList<T> {}
```
```java
  List<Number> numberList = new NumArrayList<Number>(); // ok
  List<Double> doubleList = new NumArrayList<Double>(); // ok
  List<String> stringList = new NumArrayList<String>(); // コンパイルエラー
```

## 再帰型境界
この例ではEがComparable<E>の実装クラスであることを呼び出し側に要求している。

```java
  // コレクション内から最大値を取り出すメソッド
  public static <E extends Comparable<E>> E max(Collection<E> collection) {
    // コード省略。EはcompareTo(E)メソッドを持つので、
    // それを利用して要素の最大値を求めるアルゴリズムを実装することができる
  }
```

## 複数の継承指定
複数のインターフェースの実装クラスであることを指定するには、親クラスやインターフェース同士を```&```で繋ぐ。

```java
// ComparableインターフェースとSerializableインターフェースの両方の実装をEに要求している
public class Fuga<E extends Comparable<E> & Serializable>{}
```
（```&```はあまり見慣れない記号だが、型パラメータの区切り文字として```,```が既に使われているために```&```を使用しているのだと思われる）
VisualStudio2017で.NET Core コンソールアプリを作ろうと思ったら最初からビルドエラーになった

# 概要 
VisualStudio2017をダウンロードして、初めて.NETCoreでコンソールアプリを作ろうとしたら、スケルトンのビルドでエラーが出て最初から躓きました。.NETCoreの作法があるのかもしれませんが、とりあえずIDEからwizardでスケルトン作ったら無条件でビルドできないってどうなのよ？って思いながら対処方法を記述しておきます。

# 現象
「Visaul C#」の「コンソールアプリ(.NET Core)」を選択してプロジェクトを作成、何も編集せずにビルドしてみるとエラーになる。
ちなみに、このときのターゲットフレームワークは.NET Core 2.0になっています。

![error1.png](https://qiita-image-store.s3.amazonaws.com/0/143120/2b0e0bea-8e87-4f7b-b3c4-850a939dde69.png)

ソリューションエクスプローラーの依存関係に警告マークもついてる。

![error2.png](https://qiita-image-store.s3.amazonaws.com/0/143120/30b8c456-d099-bf9e-1ccc-0e831e7b4552.png)

###環境
 - VSのバージョン：Visual Studio Community 2017 version 15.7.2
 - OS : Windows 10 Home

# 対処方法
方法が2つあります。

### 方法1
nugetのパッケージマネージャコンソールで

``` 
dotnet restore
```

※メニュー[ツール]→[NuGet パッケージ マネージャ]→[パッケージ マネージャ コンソール]

### 方法2

メニュー[ツール]→[オプション]
[NuGet パッケージ マネージャ]：下記二つにチェックを入れる
 - 見つからないパッケージのダウンロードをNuGetに許可
 - Visual Studioでのビルド中に見つからないパッケージを自動的に確認

# 原因
作法としてdotnet restoreの実行が必要ということなのでしょうが.NETCore2.0以降はdotnet build時にdotnet restoreが暗黙的に実行されると明記されています。
[msdnのdotnet build説明](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-build?tabs=netcore2x)
IDEからのビルドとdotnet buildが異なるのでしょう。。。不便です。
CLI使えってことなのかもしれません。

.下記の記事で、.NETCoreの開発では、インストール時に「.NET Core クロスプラットフォームの開発」を追加しておくことが必要だと記述されていますが、追加しても同じようにエラーが出ます。
[msdnの.NETCore開発条件に関する説明](https://docs.microsoft.com/ja-jp/dotnet/core/windows-prerequisites?tabs=netcore2x)
【 javascript / jQuery 】offsetTopとoffset().top

## element.offsetTop

親からの相対的位置。

>offsetTop は、その要素の offsetParent ノードの上端からの相対的な位置を返します。

**javascript**

```javascript
element.offsetTop;
```

**jQuery**

```javascript
$(element).position().top
```

## offset().top

documentからみた位置。

**javascript**

```javascript
const $element = document.getElementById("element");
const rect = $element.getBoundingClientRect();
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;

rect.top + scrollTop; // offset().top;
```
参考:https://q-az.net/without-jquery-height-width-offset-scrolltop/

**jQuery**

```javascript
$(element).offset().top;
```

jQueryって楽だけど
バニラはちゃんと中身を見てる感がいい。
Vim入門(基本コマンド中心)_エンジニア1年生の自習帳

#Vimとは...
Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた
非常に強力な **エディター** です。

(- =    V I M 教 本 (チュートリアル) へ よ う こ そ        -    Version 1.7      = -)

・ターミナルには、Vimが内蔵されており、

> vim
とコマンドを打つと、起動される。

##まずは、 :q で終了できることを覚える
##vimの詳細は、"vimtutor"とコマンドを叩け

<img width="535" alt="スクリーンショット 2018-05-27 1.37.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/204726/ce933423-e6ef-6298-9295-c00005560598.png">

##vimには、複数のモードがある
- ノーマルモード
- 入力モード
ノーマルモードから、[i]を押すと入れる。
[INSERT]という表示が出る。
→[ESC]で戻れる。

- コマンドモード
[:]で、いくつかのコマンドが打てるようになる。
→[ESC]で戻れる。

- ビジュアルモード
[v]で、入ることができる。
→[ESC]で戻れる。

**困ったら、[:q] or [ESC]を連打してこっ！！**

##ファイルの変更と読み込み

- 変更点の保存
→ :w

- ファイル名を変更して保存
→ :w [新しいファイル名]

- 変更点を無視して強制的に終了
→ :q!

- ファイルを開く
→ :e [開きたいファイル名]

##移動系のコマンド（ノーマルモード）

- gg
カーソルが一番上に戻る
- G
カーソルが一番下に来る

###画面単位の移動
- CTRL + f → 一番下
- CTRL + b → 一番上
###単語単位の移動
- w → 単語単位に進む
- b → 単語単位で戻る
- ^ → 行頭に行く
- $ → 行末に行く
- f　”文字” → 文字までジャンプ、";" で次にいく
- % → 対応する "}" までジャンプ

##選択系のコマンド（ビジュアルモード）
- v: 文字単位のビジュアルモード
- V: 行単位
- CTRL + v: 短形単位

*全選択したい時は、
1. gg で先頭に戻る
2. Vで行選択にする
3. それで一番下まで引っ張る

##カット（削除）、コピー、貼り付け
- x: ノーマルモードにて、1文字単位でカット（削除）
- dd: 一行単位でカット
- [数字] dd: 3行消したい時は、"3dd"
- p: 貼り付け
- yy: コピー
- [数字] yy: 3行消したい時は、"3yy"


##検索系のコマンド
/ ：ノーマルモードにて
→ /exit :exitを検索
- n　: 下方向に検索
- N　: 上方向に検索
- *　:今カーソルがある位置の単語を下方向に検索  
- #　:今カーソルがある位置の単語を上方向に検索 


##置換系の検索
例. stateのsだけを大文字にしたい時
1. : を打って、コマンドモードに入る
2. :s substituteのs
3. :s/state(置換したい文字)/State(置換後の表示文字)

*→これだと、一個だけしか変えれない*

例. stateのsだけを大文字にしたい時(行内のものを全て変えたい時)

*:s/state/State/g*

例. stateのsだけを大文字にしたい時(ファイル全体のものを全て変えたい時)

* :%s/i/I/g *

*　　%は範囲を全体にしたい時

→それを確認したい時、
:%s/i/I/gc
*　cはconfirmの意味

##操作の取り消しコマンド
- undo :u →戻る
- redo :CTRL + r　→進む

##ウィンドウの分割
- :sp :上下に分割
- :vs :左右に分割
- :close　：ウィンドウがいらなくなった時

*ウィンドウ間の移動は、 CTRL+w wで可能*


まだまとめ終わってないんですけど、疲れたんで一旦ここまでで。
あとでまた編集します〜