OmniAICreator/Qiita-1.07M huggingface dataset:
【Python入門】Pythonで使用する文字列型を徹底解説！

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】Pythonで使用する文字列型を徹底解説！](http://programming-study.com/technology/python-mojiretsu/)


#【Python入門】Pythonで使用する文字列型を徹底解説！


Pythonではさまざまデータの型を扱います。その中でも特によく使われるのが文字列型です。Pythonは他の言語と比べると文字列の操作が簡単で、便利なメソッドも多数用意されています。

今回は、Pythonにおける文字列型について基本的な事項を説明していきます。

##文字列の表現

Pythonで文字列を表現するにはシングルクォーテーション（’）もしくはダブルクオーテーション（”）のどちらかで囲みます。どちらを使っても構いませんが、必ず統一するようにしましょう。’と”が混ざって使われると紛らわしくなります。

#どちらも同じだが、どちらか一方に統一しましょう

```
print('Hello, World')
print("Hello, World")
```

実行結果
>
Hello, World
Hello, World

###文字列の連結と反復

文字列、もしくは文字列を格納した変数は「+」演算子で連結、「*」演算子で反復させることができます。

```
str1 = 'Python'
str2 = 'Programming'

print(str1 + ' ' + str2)
print(str1 * 3)
```

実行結果
>
Python Programming
PythonPythonPython

###スライス操作

Pythonの文字列はインデックス（添え字）表記をすることができ、インデックスで文字列のうちの1文字を取り出すことができます。インデックスは1ではなく0から始まることに注意しましょう。また、負の数を指定した場合は右から順番に数えて取り出します。負のインデックスは0ではなく-1から始まることにも注意してください。

```
str1 = 'Python'

print(str1[3])   #3番目の文字を取り出す
print(str1[-3])  #右から3番目の文字を取り出す
```

実行結果
>
h
h

また、Pythonはスライス操作もサポートしています。スライスを利用することで、指定した範囲の文字列だけを取り出すことができます。スライスのやり方は以下の通りです。

###文字列[スライスを開始するインデックス:スライスを終了するインデックス]

注意したいのは、「スライスを開始するインデックス」番目の文字はスライス結果に含みますが、「スライスを終了するインデックス」番目の文字は含みません。つまり「スライスを終了するインデックス – 1」番目まで取り出されます。

```
str1 = 'Python'

print(str1[2:4])  #2番目から3番目まで取り出す
print(str1[1:5])  #1番目から4番目まで取り出す
```

実行結果
>
th
ytho

また、スライスを開始するインデックスと終了するインデックスは省略することができ、開始するインデックスを省略すると0を指定したことになり、終了するインデックスを省略するとその文字列のサイズ（=最後の文字まで）を指定したことになります。

```
str1 = 'Python'

print(str1[:5])   #0番目から4番目まで取り出す
print(str1[1:])   #1番目から最後まで取り出す
```

実行結果
>
Pytho
ython

##主な文字列メソッド

###format

formatは文字列や変数の書式を指定し、別の文字列に埋め込むために使われます。例えば、printで任意の文字列と変数を一緒に出力する際に使われます。

```
'任意の文字列{0}{1}…'.format(変数1, 変数2….)
```

任意の文字列の中で、文字列や変数を埋め込みたい場所に{}を入れます。すると、formatメソッドの引数がその{}に埋め込まれます。複数の文字列や変数を埋め込みたい場合は{0}、{1}といったように添え字とともに文字列に{}を入れ、formatに複数の引数として渡します。

```
a = 1
b = 2

print('{0} + {1} = {2}'.format(a, b, a + b))
```

実行結果
>
1 + 2 = 3

###index

indexは、ある文字列に指定した文字または文字列が含まれるかどうかを調べ、含まれる場合はその文字や文字列が見つかった最初のインデックスを返します。

```
文字列.index(探したい文字列[開始位置, 終了位置])
```

スライスを利用して探索を開始する位置と終了する位置を指定できます。なお、どちらも省略することができ、両方省略した場合は文字列全体から探します。

```
str1 = 'python programming'

print(str1.index('th'[1:10]))
```

実行結果
>
3

###split

splitは文字列を任意の文字列で分割するメソッドです。分割された文字列はリスト型になります。

```
リスト = '文字列'.split(区切り文字列, 最大分割数)
```

最大分割数は省略することができ、省略した場合は分割できるだけ文字列を分割します。

```
str1 = 'python, programming, start'

print(str1.split(','))
```

実行結果
>
[‘python’, ‘ programming’, ‘ start’]
"ERR_CERT_COMMON_NAME_INVALID"エラーの解決法

# SSL証明書を導入してみたら
SSL証明書を導入したサーバにブラウザからアクセスしてみたら、 「この接続ではプライバシーが保護されません」 (`ERR_CERT_COMMON_NAME_INVALID`) というエラーが出てしまいました。
既出かもしれませんが、その時の解決法を紹介します。

# そもそもどんな時にこのエラーが起きるのか？
サーバに割り当てたドメイン名とSSL証明書に登録したドメイン名が一致しないと判断された時に発生します。

# 基本かもしれませんが
以下が同じかもう一度確認してみましょう。

- サーバに割り当てたドメイン名
- SSL証明書に登録したドメイン名

# それでもダメだったら
 ドメインの階層が深すぎる可能性があります。 
[RFC2818](https://www.ietf.org/rfc/rfc2818.txt)
> Names may contain the wildcard character * which is considered to match any single domain name component or component fragment. E.g., *.a.com matches foo.a.com but not bar.foo.a.com. f*.com matches foo.com but not bar.com.

つまり、SSL証明書に登録したドメイン名が `*.a.com` の場合：

- サーバのドメイン名が`foo.a.com` → OK
- サーバのドメイン名が`bar.foo.a.com` → NG

となるということです。 `.`(ドット)によって階層が深くなりすぎると、（私たちの目からは）同じドメイン名だとしても、「一致していない」と判断されてしまうのですね。

私の場合、サーバに割り当てるドメイン名を`bar.foo.a.com`→`bar-foo.a.com`のように変更してみたところ、このエラーは消えました。

# 参考
* [Why does my wildcard SSL certificate cause a domain mismatch error on a second level subdomain?](http://serverfault.com/questions/645230/why-does-my-wildcard-ssl-certificate-cause-a-domain-mismatch-error-on-a-second-l)
Memoized recursion in Crystal


Crystalでメモ化再帰を行う

- In Ruby, to perform memoized recursion, we usually declare `$memo={}`.
- Crystal also accepted this method (actually type config is required, so like `$memo={} of Int32 => Int64`).
- However, this stopped working in 0.19.0. `@memo` and `@@memo` are also invalid at top-level.
  - https://github.com/crystal-lang/crystal/issues/3139
- The best way for memoized recursion is now to use class.
- https://yukicoder.me/submissions/144799

```cr:yukicoder287_class.cr
class Solve
	@memo={} of Tuple(Int32,Int32) => Int64
	def perform(n,d,u)
		if d==1
			0<=n&&n<=u ? 1 : 0
		else
			@memo[{n,d}]||=(0..u).reduce(0_i64){|s,i|s+perform(n-i,d-1,u)}
		end
	end
	def run
		n=gets.not_nil!.to_i
		p perform(6*n,8,n)
	end
end
Solve.new.run
```

- However, this is a little bit over-work for competitive programming.
- With checking the issue, the most problematic point is initializing. Now we can utilize the fact that in (Ruby and) Crystal, contants are just un-reassignable and destructive updating is possible. In short, we use `Memo`.
- Now we are able to build the program.
- https://yukicoder.me/submissions/144800

```cr:yukicoder287_const.cr
Memo={} of Tuple(Int32,Int32) => Int64
def perform(n,d,u)
	if d==1
		0<=n&&n<=u ? 1 : 0
	else
		Memo[{n,d}]||=(0..u).reduce(0_i64){|s,i|s+perform(n-i,d-1,u)}
	end
end
n=gets.not_nil!.to_i
p perform(6*n,8,n)
```

----

- Rubyでメモ化再帰を行うには、先頭で`$memo={}`とするのが一般的である。
- Crystalでもこの方法は以前は有効であった(実際には型指定が必要なので、`$memo={} of Int32 => Int64`などとする)。
- しかし、この方法は0.19.0で使えなくなった。`@memo`や`@@memo`も効かない。
  - https://github.com/crystal-lang/crystal/issues/3139
- 現在メモ化再帰を行うのに最も良い方法はクラスで囲うことであろう。
- しかし、競技プログラミングでは、これは多少オーバーワークである。
- このissueを見ると、初期化に問題があることがわかる。そこで、(Rubyや)Crystalでは、定数とは再代入不可なものであり破壊的変更は可能であることを利用する。つまり、`Memo`を宣言する。
- これでコンパイルを通すことができた。
Redshift で前月末尾を取得する

# 日付操作

redshift(おそらく postgresql も同じ)で日付操作することってありますよね。前月の末尾ってどうやったらとれるんでしょうか。

# 結論

ずばりこれです。

```
dateadd(days, -1, date_trunc('month', current_date));
```

`date_trunc` に `month` を指定して日付情報を落として1日を表し、その日に対して `dateadd` で `-1` して1日引く。これで、前月の末尾を datetime 形式で取得できる。

さて使ってみましょう。例えば2017年1月19日現在下記を実行すると

```
redshift=# select dateadd(days, -1, date_trunc('month', current_date));
```

このように結果が返ってきます。

```
      date_add       
---------------------
 2016-12-31 00:00:00
(1 row)
```

どうぞ。
NanoPi NEO でLEDをチカチカさせるクラスをつくった


https://gist.github.com/miminashi/0a8e340e551565a92a75b3d32353b153

NanoPi NEO + armbian で動作確認。OrangePiやRaspberryPiでも動くと思います。
LED光らせたいだけなのにWiringNP導入するのなんかめんどくさいな、というときにどうぞ。

# 使い方

LEDはGPIO0（Pin 11）に接続してください。
（その他のピン番号については[こちら](http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO#Layout)）

```bash
python3 led.py
```

で、 3秒点灯 → 3秒消灯 → 3秒点滅 → 消灯 という動作をします。

```python
import led

l0 = led.LED(0)  # GPIO0 を使用
l0.on()  # 点灯
l0.off()  # 消灯
l0.blink()  # 点滅
```
Thor を使って簡単に「テンプレート」機能を実装する

## これはなに？
複数プロジェクトが共通して利用するリポジトリがあるとします。
新規プロジェクトが参加するたびに、だれかが手動でプロジェクトディレクトリを作成して雛形から簡単なファイルを generate する作業が発生する場合があります。

ここでは、そういった作業を Thor を利用してコマンド一つですぐに「新規プロジェクト」の雛形を作成できる機能を実装してみたいと思います。（もちろんプロジェクトではなく、「新しい概念の参加」であれば基本なんにでも使えると思います。)

（想定、オーケストラレーションツールなど）

## Gemfile に thor を追加
`gem 'thor'` を追加し、 bundle install してください。

## Thorfile を作成
例を gist にしました。
- https://gist.github.com/kozyty/51d292d7e577bd055290e46c2be17301

```app.tt
<%= name %>
<%= config[:username] %>
<%= config[:domain] %>
```

```Thorfile
require 'thor'

class Generator < Thor::Group
  include Thor::Actions

  argument :name

  class_option :username, aliases: '-u', required: true
  class_option :domain, aliases: '-d'

  def self.source_root
    File.dirname(__FILE__)
  end

  def create_lib_file
    say "project_name: #{name}", :green
    say "username: #{options[:username]}", :green

    if options[:domain]
      say "domain: #{options[:domain]}", :green
    else
      say "Please set up domain later.", :red
    end

    config = {
      username: options[:username],
      domain: options[:domain]
    }

    template('templates/projects/app.tt', "projects/#{name}/app.rb.sample", config)
  end
end
```

## 実行方法
```
$ bundle exec thor generator [name] [-u username] [-d domain]
```

無事、雛形の `.sample` ファイルが生成されれば完了です。
hadoop入れてないマシンからsparkでs3aアクセス(csv)

centos7
scalaは2.11
ビルドツールはsbt
最終的にsbt runで実行

やってる内容は

```
1.s3においてあるcsvファイルを読み、カラム指定でDataFrameにする(カラム並び順を変えるのと、項目の絞り込みのため)
2.カラム名を変更する
3.変更後のカラム名をheaderにして内容をs3に出力
```

まずsbt runするユーザに環境変数設定する
.bash_profile あたりに

```
export AWS_ACCESS_KEY_ID=XXXXXXXX
export AWS_SECRET_ACCESS_KEY=YYYYYYYY
```
追加してsourceなりログインしなおすなり


build.sbt

```scala
libraryDependencies ++=
  Seq(
    "org.apache.spark" % "spark-core_2.11" % "2.0.1",
    "org.apache.spark" %% "spark-mllib" % "2.0.0",
    "org.apache.spark" %% "spark-sql" % "2.0.0",
    "org.apache.hadoop" % "hadoop-aws" % "2.7.1",
    "com.amazonaws" % "aws-java-sdk-s3" % "1.10.72",
  )
```

本体

```scala
import org.apache.spark.sql.{DataFrame, SparkSession}
import scala.collection.mutable.LinkedHashMap

object Test {
  def main(args: Array[String]) {
    val accessKey:String = "XXXXXXXX"
    val secretKey:String = "YYYYYYYY"

    val tmp:LinkedHashMap[String, String] = LinkedHashMap(
      "c2" -> "カラム1",
      "c1" -> "カラム2"
    )
    val columns:List[String] = tmp.keys.toList
    val columns2:List[String] = tmp.values.toList

    val spark = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.awsAccessKeyId", accessKey)
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.awsSecretAccessKey", secretKey)
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")

    val df = spark.read.option("header", "true").option("inferSchema", "true").csv("s3a://bucket/path")

    val datas:DataFrame = df.select(columns.head, columns.tail:_*)
    val renamedDatas:DataFrame = datas.toDF(columns2:_*)

    renamedDatas.write.option("header", "true").csv("s3a://bucket/path")

    spark.stop()
  }
}
```

カラム名のキーとってlistにしてたり、値をlistにしてたりする部分はもともとtmpは別の何かからデータとってきて、それがLinkedHashMap型が想定されているからです
その前提でもっとカッコいいやり方あると思うのでスカラーマンに教えてほしい気持ちはある

あと、最初にdf作る部分のselectの仕方がなんか気持ち悪いことになってるのは、

```
df.select(columns:_*)
```

```
no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
```

とか言われてコンパイル通らないから…
これもうまいやり方というか、スマートな方法あれば…
Macに入れたものリスト

Macを新調してから入れたものをメモ

#---前提物---

##Xcode
https://developer.apple.com/xcode/


##Homebrew

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


##brew-cask

```
brew tap caskroom/cask
```

#---brew & brew-caskで入れたもの---

##pwgen

```
brew install pwgen
```


##iTerm2

```
brew cask install iterm2
```


##Tree

```
brew install tree
```


##FreeMind

```
brew cask install freemind
```


##SourceTree

```
brew cask install sourcetree
```


##vagrant

```
brew cask install vagrant
```


##VirtualBox

```
brew cask install virtualbox
```

##AppCleaner

```
brew cask install appcleaner
```


##Google日本語入力
インストール後の設定
http://dezisaru.com/imac/2693.html

```
brew cask install google-japanese-ime
```


#---手動で入れたもの---

##anyenv
https://github.com/riywo/anyenv
http://qiita.com/yutackall/items/6c48cf56317d8501f6df

##Senebier
http://www.bicoid.com/app/senebier/index.html


##Alfred
https://itunes.apple.com/jp/app/alfred/id405843582?mt=12


##Kobit
http://kobito.qiita.com


##Virsions
http://versionsapp.com


##Parallels Desktop
http://versionsapp.com


##Visual Studio Code
https://code.visualstudio.com/download


##Cheat Sheet
https://www.cheatsheetapp.com/CheatSheet/


##Office for Mac
https://www.microsoft.com/ja-jp/office/homeuse/package-mac.aspx


##GIMP
https://www.gimp.org


##GitHub Desktop
https://desktop.github.com


##Trend Micro Security




#---こんなのあったのか…ってやつ---
標準のカラーピッカー
/Applications/Utilities/Digital Color Meter.app
個人的開発環境セットアップメモ

完全に個人的なメモですが、他の人がどういうツール使ってるのかとか参考になることもあるかな？と思って書きました。
マシンのOSはWindows 10です。

## 仕事環境

### Chrome
https://www.google.com/chrome/

これがなくちゃ始まらない！Googleアカウントでログインするだけでブックマークやらパスワードやら全て同期されるので便利です。メールもGmailで済むし。

### Google 日本語入力
https://www.google.co.jp/intl/ja/ime/

MicrosoftのIMEも最近は優秀ですけど…

スペースの入力は常時半角にするのが良い。

### Slack
https://slack.com/downloads

仕事のやりとりに必要なので

### Dropbox
https://www.dropbox.com/

大事なデータはDropboxに置いておけば、いつPCが壊れても安心です。

## 開発環境

### Android Studio
https://developer.android.com/studio/

Androidアプリ開発には必須です。

### Java SE
http://www.oracle.com/technetwork/java/javase/downloads/

Android Sutudioを使うために必要。

### Visual Studio Code
https://code.visualstudio.com/

ちょっとしたソースコードを開くテキストエディタとしては最強。
以下のプラグインも入れる。

* C++
* C#
* CSS Formatter

### Node.js
https://nodejs.org

Web系の開発ツールとしてもはや必携。

### SourceTree
https://www.sourcetreeapp.com

Git GUIクライアントの中では最も高機能で便利。

## その他

### VLC Media Player
http://www.videolan.org/vlc/

標準のプレイヤーでは再生できない動画とかあるので。

### 7-Zip
http://www.7-zip.org/

Lhaplusよりも活発に開発しているイメージがあるので、というだけ。
Windowsでプログラムを起動したら「api-ms-win-crt-runtime-l1-1-0.dll」ないと怒られた時の対処方法

http://www.softantenna.com/wp/windows/api-ms-win-crt-runtime-l1-1-0-dll/

こちらの症状にWin7　64bit　がなったため
「vc_redist.x64.exe」は64ビット版プログラム用の再頒布可能パッケージ
をダウンロードしてインストールしようとすると
途中で止まる……

うーん(>_<)

とメモらせて頂きます。_(_^_)_
PHPUnitのバージョンアップ(5.3.4→5.7.5)に伴うgetMock()の修正

久しぶりにCakePHP3のバージョンアップをcomposer updateでしたら(3.2.10→3.3.11)、テストにwarningが…。
どうやらCakePHPのバージョンアップというより、PHPUnitのバージョンアップによるものらしい。
PHPUnitは5.3.4から5.7.5にバージョンアップされていました。

```
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
```

というのがいっぱい出ているので、PHPUnitのドキュメント見てみたら、`createMock()`と`getMockBuilder()`の記述がありました。

参照：[PHPUnit5.7 - テストダブル](https://phpunit.de/manual/5.7/ja/test-doubles.html)

というわけで該当箇所を直します。

## createMock()を使う

```php
$this->io = $this->getMock('Cake\Console\ConsoleIo');
```
のように`getMock()`を使っていたところは、

```php
$this->io = $this->createMock('Cake\Console\ConsoleIo');
```
のように`createMock()`に変更します。

## getMockBuilder()を使う

```php
$controller = $this->getMock('App\Controller\MiscController', ['setMaster']);
```
のようにメソッドを指定して`getMock()`を使っていたところは、

```php
$controller = $this->getMockBuilder('App\Controller\MiscController')
    ->setMethods(['setMaster'])
    ->getMock();
```
のように`getMockBuilder()`を使うように変更します。

無事にwarning出なくなりました。:clap:

PHPUnitの過去のバージョンのドキュメントをちょっと見てみたら、どうも4から`getMockBuilder()`を使うようになってたようですね。
`$this->getMock()`と書いていたのは3の時代だったようです…:sweat_smile:
Angularでスタイルシートを動的に切り替える

Angularを使用するとき、適用するスタイルシート(.css)を動的に切り替えるにはどのようにすればよいでしょうか。
ここでは、serviceを利用してその仕組みを構築してみました。

# 切り替えのポイント
スタイルシートを動的に切り替えるにあたって、ポイントとなるのは以下の２点です。

- スタイルシートの`link`にclassを割り当てる
- スタイルシートを使用するかしないかは、`link`の`disabled`属性で制御する

上記２つのポイントにより、以下の動作が可能になります。

- 割り当てたclassを使ってスタイルシートをセレクトし、`disabled`属性の割り当て状況を動的に制御する

# serviceの作成
実際のコードを見て見ましょう。
以下のコードのように、スタイルシートの有効/無効を切り替えるservice `cssSwitch` を定義します。

```js:cssSwitch
  .factory('cssSwitch', function() {
    return {
      enableCss: function enableCss(className) {
      // 有効とするCSSのdisabled属性をはずす
      $('link.' + className).removeAttr('disabled');
    },
      disableCss: function disableCss(className) {
      // 無効とするCSSにdisabled属性をつける
      $('link.' + className).attr('disabled', 'disabled');
    }
    };
  })
```

このserviceを利用することで、以下のようにスタイルシートの使用状況を動的に制御することができます。

```js:controller
  .controller('mainController', function($scope, cssSwitch){

    $scope.changeCss = function(name){
      cssSwitch.enableCss('style-a');
      cssSwitch.disableCss('style-b');
    };

  })
```

 なお、`link`には次のようにclassを割り当てておきます。

```html:view
<link class="style-a" rel="stylesheet" href="style-a.css" />
<link class="style-b" rel="stylesheet" href="style-b.css" />
```

# 実行例
実際に動作するコードをPlunkerに作成したので、参考にしてみてください。
[実行例](https://embed.plnkr.co/PBMFoquaDBvaCyMPDUiR/)

### 補足
この方法は、あらかじめ必要なスタイルシートがダウンロードされていることを前提としています。
そもそも余計なトラフィックを増やしたくない場合は、他の手法を検討するのが良いでしょう。
Rubyで六曜を計算

Rubyで六曜を出力する

# 環境
以下の内容で確認をしてみた。
* Ruby 2.2.6
* Qreki 0.0.4 MITライセンス
https://github.com/ozamasa/qreki

# インストール
$ gem install qreki

# 使い方
` requir "qreki"
td = Date.today
qr = Qreki.calc(td.year,td.month,td.day)
qr.rokuyou
=> "先負"
`

# 補足
上記のライブラリを利用すると2017年の2〜3月の一部の六曜が流通されているものと異なる値が得られることを確認した。これは月齢の計算が古いので上記の期間に狂いが生じている。

また、２０３３年秋から2044年一部にかけての期間は、六曜が正しく計算できない期間が存在していることがわかっているので、六曜は2032年まで計算するように使うのがいまのところベター。また、ライブラリの信頼性は定期的に確認する必要はある。

# 参考
https://ja.wikipedia.org/wiki/%E6%97%A7%E6%9A%A62033%E5%B9%B4%E5%95%8F%E9%A1%8C
jqで文字列のlike検索をする

**sample data**

```json:wine.jl
{
  "color": "red",
  "name": "Pinot Meunier"
}
{
  "color": "red",
  "name": "Pinot Noir"
}
{
  "color": "red",
  "name": "Merlot"
}
{
  "color": "white",
  "name": "Pinot Gris"
}
```

**nameがPinotで始まるハッシュだけ表示する**

`$ cat wine.jl | jq '.[] | select(.name | startswith("Pinot"))'`

```json
{
  "color": "red",
  "name": "Pinot Meunier"
}
{
  "color": "red",
  "name": "Pinot Noir"
}
{
  "color": "white",
  "name": "Pinot Gris"
}
```
渋谷LT1/18

#今日のLT
####最近のカーナビについて
プレゼンター：ニャンさん

<iframe src="//www.slideshare.net/slideshow/embed_code/key/MPgnHbDOHHVRCy" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/MPgnHbDOHHVRCy" title="勉強会（Car play&amp;amp;androidauto発表書）" target="_blank">勉強会（Car play&amp;amp;androidauto発表書）</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>

普段は普通のカーナビで、端末を接続すると対応するアプリが使えるようになるとのこと。
操作は全て接続された端末に送られ、端末で全て処理を行うらしい。

####ベトナムと日本のfintechについて
プレゼンター：チャンさん
<iframe src="//www.slideshare.net/slideshow/embed_code/key/lJzpGhT5L91wBK" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/lJzpGhT5L91wBK" title="Fintech lt" target="_blank">Fintech lt</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>
最近読んだ本の話からfintechの話になったんですが、
そもそもfintechって何？って状態だった私としては途中から話が繋がらなくて混乱状態でした　汗
Finance × TechnologyでFintechっていうんですね
通りで途中からいろんな国のオンライン支払いやらクレジットカードの話になってたんですね。
コーディングの情報だけじゃなく世間の情報にも気を配ります　汗

#ゼロから作るDeep Learning第二回
今回は３.２.６から３.5の前までやりました

###今日のメモ
線形関数なのか非線形関数なのかが重要な理由：後で微分するから
新たなる活性化関数：ReLU
1個目の層の値（＋バイアス）と重みの内積を求め、それに活性化関数を通すことで次の層のニューロンの値が計算できる

###感想
今回は数学の話多めの内容でした
なんとなくの理屈は理解できたような気もするけれど数式になると何が何だか分からない
やっぱり高校数学の知識は必須かぁ・・・
センタリングのメモ

#基本

##横方向センタリング


![alt](https://qiita-image-store.s3.amazonaws.com/0/160514/ad33d337-ce63-5209-74da-9ab0db5be7ef.png)



```
<div id="wrap">
		<div class="box">box</div>
		<div class="box">box</div>
		<div class="box">box</div>
</div>
```
```
#wrap{
	width: 200px;
	height: 200px;
	border: 1px solid #000;
}

.box{
	width: 50px;
	height: 50px;
	margin: 0 auto;
	border: 1px solid #000;
	line-height: 50px;
	text-align: center;
}
```

##上下左右センタリング
![alt](https://qiita-image-store.s3.amazonaws.com/0/160514/9e7e2a70-0843-0b97-eb10-395ce806cddf.png)

横方向だけでなく縦方向も中央寄せする場合は、

- position設定<br>
    基準となる親要素にposition:relative;を、<br>
    センタリングしたい子要素にposition:absolute;を設定
- margin: auto;でセンタリング<br>
    top,bottom,left,rightそれぞれに値を指定します。
    
```
<div id="wrap1">
	<div class="box">box</div>
</div>
```

```
#wrap{
	width: 200px;
	height: 200px;
	border: 1px solid #000;
	position: relative;
}
.box{
	width: 50px;
	height: 50px;
    position: absolute;
	top: 0;
    bottom: 0;
    left: 0;
    right: 0;
	margin: auto;
	border: 1px solid #000;
	line-height: 50px;
	text-align: center;
}
```

#画像
###１． ブロック要素にする
　　　*通常imgタグはインライン要素になるので、margin,paddingが効かない。

 ```
img{
	display: block;
	margin: 0 auto;
    }
```


###２．親要素ブロックにスタイルを当てる

```
.class名 {
  text-align: center;
}
```
SSH の id_rsa.pub を RFC4716 形式で出力する


Microsoft の Azule で仮想PCを作成しようとしたら SSH の公開鍵を要求されて、id_rsa.pub の内容をコピペしたら ''---- BEGIN SSH2 PUBLIC KEY ----'' で始まる形式にしろと言われたので変換。


```
$ ssh-keygen -e -f ~/.ssh/id_rsa.pub
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by suisui from Ope"
<BASE64 ENCODED KEY ...>
---- END SSH2 PUBLIC KEY ----
```


逆向きの変換は、先に検索でヒットしたのだけど、自分の欲しい出力が RFC4716 形式だったので。何のことはない ssh-keygen --help を読めば書いてあった


# 逆 (IN: RFC4716 -> OUT: SSH2)

タイトルとは逆の変換

```
$ ssh-keygen -i -f rfc4716.pub
ssh-rsa <BASE64 ENCODED KEY ...> <COMMENT>
```
Gmail の 迷惑メールフィルタを無効にする方法

プログラミングとは関係ないのですが、以前、大事なメール（普通なら迷惑メールとは解釈されないであろうメール）まで Gmail で 迷惑メールに振り分けられてしまい、メールが届いている事に気がつかない... という事が頻発。

Gmail の 迷惑メールフィルタを無効にする方法を探したところ、Gmail の設定には それらしき設定項目はなく、Webで検索し見つけた情報を試してみたものの、なぜかイマイチうまくいかず、試行錯誤した結果、今のところこの方法で迷惑メールには一切メールが振り分けられなくなったので備忘録としてメモ。

# やったこと

1.[設定]－[フィルタとブロック中のアドレス]から[新しいフィルタを作成]をクリック

2.検索条件の From に ”-me” と入力し[この検索条件でフィルタを作成 をクリック]

![Gmail01.jpg](https://qiita-image-store.s3.amazonaws.com/0/31848/821773b6-2cc8-509d-e328-df7669a1ec4b.jpeg)

3.[迷惑メールにしない] にチェックを付け、[フィルタを作成]ボタンを押す

![Gmail02.jpg](https://qiita-image-store.s3.amazonaws.com/0/31848/b6e868c4-1a73-dbd6-c8cd-ba0f98e269c9.jpeg)

これだけ。フィルタが登録されると、こんな感じになります。

![Gmail03.jpg](https://qiita-image-store.s3.amazonaws.com/0/31848/893c9fe7-d028-895a-26c0-25f77c38760c.jpeg)


この設定は、実際には1年くらい前に設定したのですが、今のところ設定をして以降は、ずっと迷惑メールは空っぽです。

# その他

検索条件の From を ”-me” にした理由を忘れてしまいました。

From に "全てのメール” という条件をつけたかったのですが、Webで調べて見つけた設定をいろいろ試しても期待とおりの動きをせず、誰かに "全てのメール” という検索条件にしたい！ と言ったら、教えてくれた気がするのですが...。思い出したら追記します。
Fabric のエラーや警告の色を変える

Fabric は `env.colorize_errors = True` でエラーや警告に色がつくんだけど、ターミナルの色が赤だったりするとかぶってしまうので背景色つけたりしたい。（ちなみに自分は黒背景なので困らないんだけど）

ということで、 `fabric.colors` を上書きする。（将来のアップデートで期待した動作にならなくなったりするかもしれないのであまりいいやり方ではないかも）

```python:colors.py
# -*- coding: utf-8 -*-
import fabric.colors

def _wrap_with(color, background):

    def inner(text, bold=False):
        c = color
        if background:
            c = "%s;%s" % (background, c)
        if bold:
            c = "1;%s" % c

        return "\033[%sm%s\033[0;m" % (c, text)

    return inner

red = _wrap_with('31', '40')
green = _wrap_with('32', '40')
yellow = _wrap_with('33', '40')
blue = _wrap_with('34', '40')
magenta = _wrap_with('35', '40')
cyan = _wrap_with('36', '40')
white = _wrap_with('37', '40')

fabric.colors.red = red
fabric.colors.green = green
fabric.colors.yellow = yellow
fabric.colors.blue = blue
fabric.colors.magenta = magenta
fabric.colors.cyan = cyan
fabric.colors.white = white
```

エスケープシーケンスで `\033[1;40;31` は bold, 黒背景, 赤文字で、 `fabric.utils.abort` は `fabric.colors.red` を呼び出しているので `fabric.colors.red` が `\033[1;40;31%s\033[0;m` を組み立てる関数になればいい。

これを読み込む

```python:fabfile.py
# -*- coding: utf-8 -*-

from fabric.api import *

from colors import *

env.colorize_errors = True

@task
def abort_task():
    abort("タスク失敗！ >_<")
```

これで赤背景でも文字が読める。

<img width="227" alt="Screen Shot 2017-01-19 at 01.50.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/15768/b9abb5ec-cb03-1958-9026-d5da901361fa.png">

この方法を使えば色出力関数を自作できる。
Escape_From_If文地獄: テーブル駆動

条件分岐がやばい。if文に塗れたソースコードになりそうで死ぬ。
そもそもこんなの仕様がおかしいんじゃないの?となるけど、どうしてもこの仕様が良いって時に少しでもIf文を減らした話。
（ruby2.3.1で開発してるよ。）

### 今回やりたいこと

- 以下の条件の組み合わせで表示するメッセージを変えたい。
  - 対象グループかどうか(spike or jet)
  - 対象商品かどうか(milk or coffee )
  - 対象ユーザーかどうか(owner or user)
  - 対象ステータスかどうか(hoge or fuga)

``` ruby

# if文で分岐するとこんな感じに全パターン網羅の地獄

if spike  && coffee && owner && fuga
  puts "サシスセソ"
elsif spike && milk && owner && fuga
  puts "カキクケコ"
elsif jet && coffie && user && hoge
  puts "アイウエオ" 
~
~
~
end
```
そこで、少しでも地獄から抜け出すために、考えたのが、次の通り。
ポイントは多次元ハッシュを使うってところ。

``` ruby
# 1_条件と出力メッセージを組み合わせたハッシュを作っておく。
SELECT_MESSAGE = 
  {spike: {
      milk: {
        owner:{
          hoge: "アイウエオ",
          fuga: "カキクケコ"
         },
        user:{
          hoge: "サシスセソ"
          fuga: "アイウエオ"
         }
       },
      coffee: {
         owner:{
          hoge: "アイウエオ",
          fuga: "サシスセソ"
         },
        user:{
          hoge: "タチツテト"
          fuga: "カキクケコ"
         }
       },
     jet:{
     ~~~~~~
    }

# 2_各々の条件判断して、検索キー用のハッシュに格納しておく(条件分岐はここだけ)

def condition
  parameters = {}

  spike? ? parameters[:spike_or_jet] = "spike" : parameters[:spike_or_jet] = "jet"
  milk? ? parameters[:milk_or_coffee] = "milk" : parameters[:milk_or_coffee] = "coffee"
  owner? ? parameters[:owner_or_user] = "owner" : parameters[:owner_or_user] = "user"
  hoge? ? parameters[:hoge_or_fuga] = "hoge" : parameters[:hoge_or_fuga] = "fuga"
  
  parameters
end

# 3_で、あとは最初に作ったハッシュから検索用のハッシュを使って目的のメッセージを取り出せばオーケー。

def select_message
  parameters = condition
  
  #  Hash#digメソッドでハッシュの最下層にあるメッセージを一発でとる。
  message = SELECT_MESSAGE.dig(parameters[:spike_or_jet], parameters[:milk_or_coffee], parameters[:owner_or_user], parameters[:hoge_or_fuga])

  puts message
end

```

コード量は増えるけど、これでif文の地獄から抜け出せるし、条件が変わったときでも対応しやすい。

他にも良いやり方（複雑な条件分岐に対するTIPS）があれば教えて欲しいです。
MySQLのpathの設定　(windows)

#はじめに
windowsにMySQLをインストールすると「MySQL command Line Client」で接続できるが、
コントロールパネルから接続をしたい。
なので、pathを通すメモ

# .exeのディレクトリー
```
MySQL\MySQL Server 5.7\bin
```
の中に、mysql.exeがあるので、そのディレクトリーをpathを通す

#　pathの設定
コンパネ　＞　システムとセキュリティ　＞　システム　＞　システムの詳細設定　＞　環境変数　＞　path 

以上の工程で、pathを通す。
要素が画面内にあるかどうかの判定

#jQuery
```.js
$(window).scroll(function(){
  var t = $('.form').offset().top; // ターゲットの位置取得
  var p = t - $(window).height();  // 画面下部からのターゲットの位置
  if($(window).scrollTop() > p){
    $('.button').hide(); // ボタンを非表示
  }else{
    $('.button').show(); // ボタンを表示
  }
})
```

` $('要素名').offset().top` : 要素の位置を取得
`$(window).height()` : 画面の高さを取得
`$(window).scrollTop()` : 画面トップのスクロールされた距離を取得



#js(複数判定)
※fadeinとfadeoutエフェクトをつける

```.html
<div class="target">
  <p>hogehoge</p>
</div>

<div class="non-target">
  <p>hogehoge</p>
</div>

<div class="target">
  <p>hogehoge</p>
</div>
```
```.js
window.addEventListener('load', handleEffect())
window.addEventListener('scroll', this.handleEffect())

function handleEffect(){
  // get el
  let target = document.getElementsByClassName('target')

  for (var i = 0; i < target.length; i++) {
    console.log('i',i)
    let t_height = target[i].offsetHeight
    let t_classN = target[i].className

    // get target-position => distance from screen-top-position
    let offsetY = target[i].getBoundingClientRect().top

    // screen-height
    let screenHeight = window.outerHeight

    // judge of target-position in or out
    let t_position = offsetY - screenHeight


    // console.log('target = ', target)         : ターゲット一覧
    // console.log('t_height = ', t_height)     : ターゲットの高さ
    // console.log('offsetY = ', offsetY)       : スクリーン上部からターゲットまでの距離
    // console.log('t_position = ', t_position) : スクリーン下部からターゲットまでの距離


    /*
     * 1. -screenHeight <= (t_position + t_height ) : スクリーン上部とターゲットの下部までの距離
     *    ※マイナスなのは、スクリーン内に入るとt_positionはマイナスになるため
     *    
     * 2. t_position < 0 : スクリーン下部からターゲットまでの距離が、0未満 => スクリーン内に到達
     * 　
     */
    if(-screenHeight<=(t_position　+　t_height) && t_position<0) { // 画面内
      if(t_classN.indexOf('fadeIn') == -1) { // fadeInなし
        t_classN = t_classN + ' fadeIn'      // fadeInクラス追加
      }else if(t_classN.indexOf('fadeOut') !== -1) {
        t_classN = t_classN.replace(/fadeOut/g, 'fadeIn') // fadeInに置き換え
      }
    } else { // 画面外
      if(t_classN.indexOf('fadeOut') == -1) { // fadeoutなし
        t_classN = t_classN + ' fadeOut'
      }else if(t_classN.indexOf('fadeIn') !== -1) {
        t_classN = t_classN.replace(/fadeIn/g, 'fadeOut') 
      }
    }
    target[i].className = t_classN
  }
}
```
```.css
.fadeIn {
  opacity: 1.0;
  transition: all 2s ease;
}
.fadeOut {
  opacity: 0;
  transition: all 0.1s ease;
}
```



#参考資料
http://logic.moo.jp/data/archives/879.html
Windows 10 > 3rd party PDF generatorが正常動作しない

```txt:動作環境
Windows 10 Anniversary Update適用済
```

Windows7においてPDFを生成するためのプリンタドライバをインストールして使っていた。
同じものをWindows10で使おうとしたがPDF生成に失敗する。
PDF出力したときに、以下のいずれかとなる。

- ファイルが生成されない
- 生成されたファイルのサイズが0バイト

以下を見つけた。

https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/unable-to-print-pdf-files-after-upgrading-to/7d6aaf70-99c3-4418-a6f0-b96c64f116aa

> David_Pickles replied on  June 26, 2016See post history

> Prior to the upgrade I was using a 3rd party PDF generator as a printer driver. I think it was Nitro PDF printer driver / Primo PDF generator printer driver.

>The windows 10 upgrade copied this printer driver over from the old version of windows. Windows 10 has it's own PDF generator as a printer driver. These must somehow clash, as neither worked for me.

...

上記はWindows 10へのアップグレードの例だが、こちらの環境では最初からWindows 10となっているPCで同じ問題が発生している。

標準のMicrosoft PDF printer driverしか使えないのは支障が出る。

AcrobatからPDF出力しようとして失敗している例もある。
batファイルでコマンドの実行結果を出力しないようにする方法

## ターゲット

- 普段batファイルを使用していて、コマンドの実行結果をコマンドプロンプトに出力したくない
- `@echo off` をすでに使用している

## 結論

コマンドの末尾に `> nul` を付ける

## 実行結果

```bat
C:\Windows\system32>echo hoge
hoge

C:\Windows\system32>echo hoge > nul

```

## 理由

`>` はリダイレクトといい、出力先をコマンドプロンプトでなく指定したファイルに変更します。
`nul` は空（のファイル）という意味で、書き込んでも何も起きません。
つまり、`> nul` で出力先を空のファイルに変更することで、コマンドプロンプト上には何も出力されなくなります。

## おまけ

`> nul` を付けただけだと、エラーメッセージは出力されてしまいます。
さらに `2>&1` を付けることで、エラーメッセージも出力されなくなります。

### 実行結果

```bat
C:\Windows\System32>mkdir hoge > nul

C:\Windows\System32>mkdir hoge > nul
サブディレクトリまたはファイル hoge は既に存在します。

C:\Windows\System32>rmdir hoge

C:\Windows\System32>mkdir hoge > nul 2>&1

C:\Windows\System32>mkdir hoge > nul 2>&1

C:\Windows\System32>cd hoge

```

### 理由

`2>` はエラーメッセージをリダイレクトするという意味で、`&1` は通常の出力という意味です。
つまり、 `2>&1` でエラーメッセージを通常の出力にリダイレクトし、 `> nul` で通常の出力を空のファイルにリダイレクトすることで、エラーメッセージも空のファイルにリダイレクトされます。
イメージとしては「標準エラー出力→標準出力→空のファイル」です。
ちなみに通常の出力を「標準出力」、エラーメッセージを「標準エラー出力」といいます。

## 参考リンク

- [バッチで一切のエラーメッセージを表示しない : 気になるモノ](http://reich.exblog.jp/7216035)
- [標準エラー出力をファイルへ出力 - リダイレクトとパイプ - コマンドプロンプトの使い方](http://www.adminweb.jp/command/redirect/index3.html)
- [NUL (空のファイル) - DOS コマンド一覧 - Programming Field](http://pf-j.sakura.ne.jp/program/dos/doscmd/dev_nul.htm)
windows10のvagrant環境や使い方メモ

環境作り(virtualbox + vagrant + teraterm)
virtualboxとvagrantをインストールする。

versionの違いでできない場合があります。現時点（2017年1月)の最新バージョンで両方使えました。

||version|
|:---:|:---:|
|vagrant|1.9.1|
|virtualnox|5.1|

#インストーラーをダウンロード
各公式サイトからダウンロード
それぞれダウンロードしたら実行してインストールする。
vagrantはPCの再起動が求められます。

[teratermダウンロード](https://osdn.net/projects/ttssh2/releases/)

[virtualboxダウンロード](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)


[vagrantダウンロード](https://www.vagrantup.com/downloads.html)



#OS入手、起動、シャットダウン

##1.適当な場所に新規作成したファイルを置く
　(自分はデスクトップに「vagrant-centos7」というファイルを新規作成)


##2.OSの入手
vagrantに合わせたOSを公式webのAtlasから入手する。
[vagrantbox](https://atlas.hashicorp.com/boxes/search)
ほしいOSを選択して、手順に従う。

以下のコマンドを入力
（自分はcentos7がほしいので以下は入力例）
`vagrant box add centos/7`
下記のコマンドをうつとOSが入手できているか確認できます。
`vagrant box list`

##3.[1]で新規作成したファイルにinitします。
コマンドプロンプトのカレントディレクトリを１で作ったファイルに移動します。
`cd [新規作成したファイルをコマンドプロンプトにドラッグ＆ドロップ]`
initializeをかけます。
`vagrant init centos/7`
※vagrant box listで出てきたものを入力




##起動
以下のコマンドを入力。
`vagran up`
いろいろと接続するための情報など表示されます。接続のIPなどポート番号など…
（次また起動するときに「２」でinitをかけたファイルをカレントディレクトリにすること。）

多分エラーが出てくるとおもうので以下対処したメモ
###===========vagrant up時のエラー===================
###エラー：rsyncがないから共有できないよ。

```
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.
```
和訳：rsyncっていうものをインストールして、環境変数PATHを通せ
対処：やり方は以下の３つ
・すなおにrsyncをインストールしてPATHを通す
・共有を無効にする
・typeをrsyncからvirtualboxへ変更する

自分は後者「・typeをrsyncからvirtualboxへ変更する」を選びました。[他の２つのやり方]

(http://qiita.com/tenmyo/items/c2bb714117c98ae979de)

vagrant fileを編集
変更前
`#config.vm.synced_folder ".", "/vagrant_data"`
変更後
`config.vm.synced_folder ".", "/vagrant", type:"virtualbox"`


###エラー：OS側にGUEST ADDITIONSがない
この[サイト](http://mpweb.mobi/windows/guestadditions-centos.php)の通りにやります。

======================================================
##teratermで接続
teratermを起動
先ほどvagrant upコマンドで流れた情報を入力する。（以下はデフォルト値です）

```
ホスト：127.0.0.1
TCPポート：2222
```

OKを押す

```
ユーザー名：vagrant
パスフレーズ：vagrant
```
（ユーザー：rootとパスフレーズ：vagrantでも行けます）

##シャットダウン
Linuxのルート権限で`shutdown -h now`
または
windowsのコマンドプロンプトで`vagrant halt`
たぶん上のほうがいい。

#windowsとvagrant間で共有
initかけたファイルとlinuxの`/vagrant`は共有されています。

またinitかけたファイルに「Vagrantfile」というものがあるのでそこから共有設定も可能→[qiita-Vagrantで共有フォルダを設定してみる](http://qiita.com/okoi/items/8fbf87772217c1b1ffb7)


##vagrant側でポートを開く
例として80番ポートを空けます。
initしたファイルを開いてVagrantfileを開く
下記のところを「#」のコメントアウトを削除し変更する。
`config.vm.network "forwarded_port", guest: 80, host: 80`
ACFグループを取得してフィールドの設定を一括で表示する

ACFは、グループとフィールドで別々のカスタムポストを利用しています。

```PHP
'post_type' => 'acf-field-group'
'post_type' => 'acf-field',
```

WP_Query使って表示

```PHP
$the_query = new WP_Query( array( 'post_type' => 'acf-field-group') );

if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();

  $group_ID = get_the_ID();
  $name = get_the_title();

  echo '<p>Group ID: '.$group_ID.', Group name: '.$name.'</p>';

  $fields = array();
  $fields = apply_filters('acf/field_group/get_fields', $fields, $group_ID);
  //フィールドがなければ0がかえる

  if( $fields ):
    foreach( $fields as $field ):
      $value = get_field( $field['name'] );

      echo '<dl>';
        echo '<dt>' . $field['label'] . '</dt>';
        echo '<dd>' .$value . '</dd>';
      echo '</dl>';
    endforeach;
  endif;
echo '<hr>';
endwhile;
endif;
wp_reset_postdata();

````


使い勝手を考えれば、ACF管理画面で設定するタイトルをからポスト情報を取り出すのが良いのかも。
ただしタイトルは重複OKなので、運用時に重複させない手間がかかるかも

```PHP
$group = get_page_by_title('タイトル', OBJECT, 'acf-field-group');

$args = array(
  'post_type' => 'acf-field',
  'post_parent' => $group->ID,
  'posts_per_page' => -1,
  'order' => 'ASC',
  'orderby' => 'menu_order',
);
$posts_total = new WP_Query( $args );

while ( $posts_total->have_posts() ) :
$posts_total->the_post();
$values = $posts_total->post;

echo '<pre>';
echo $values->post_title . '<br>';
echo $values->post_excerpt . '<br>';
echo $values->post_name . '<br>';
echo '</pre>';

endwhile;
wp_reset_postdata();
```
ACFで設定したフィールド説明文や選択肢をフロントエンドで利用する


ACFのカスタムフィールド内の値はACFフィールド用CPT(acf-field)で、ポストのpost_contentにシリアライズ化されて入っている。
WPでは、値がシリアル化されていた場合のみそれを非シリアル化する関数が用意されている。

maybe_unserialize()
https://developer.wordpress.org/reference/functions/maybe_unserialize/

それを利用するとACFフィールドの設定を引き出せる。

```php
$group_ID = '123';
$args = array(
  'post_type' => 'acf-field',
  'post_parent' => $group_ID,
  'posts_per_page' => -1,
  'order' => 'ASC',
  'orderby' => 'menu_order',
);
$query = new WP_Query( $args );

while ( $query->have_posts() ) :
$query->the_post();
$values = $query->post;
$field_obj = maybe_unserialize($values->post_content);

print_r($field_obj);

endwhile;
wp_reset_postdata();
```
ApplicationLoaderにサインインできない

ApplicationLoaderにサインインできなくて困りました。
解決したので手順を書きます。

1. [AppleIDのアカウントページ](https://appleid.apple.com/account/manage)にログイン

2. [セキュリティ]の項目、　「パスワードの生成…」　をクリック

3. 何かしらのラベルを入力して「作成」

4. パスワードが表示されるのでコピー

5. ApplicationLoaderに戻り、AppleIDを入力

6. パスワードの部分は先ほどコピーしたものを入力

7. サインインできた！

*****

appleIDの二段階認証に対応していないアプリは、この方法でログインするようです。

https://support.apple.com/en-us/HT204397
*****
2019/10/28
マイページの項目名を日本語標記に修正しました。
AWS SAM のとても簡単なサンプル：Lambda + API Gateway

# デプロイの流れ

## Step0. 下ごしらえ

- S3 にバケットを用意してください。（以降バケット名を bucket_name として進めます）
- `brew awscli` などで、`aws` コマンドを使えるようにしておいてください。

用意したバケットには、`index.js` を zip したような（よくわからない）ものが、アップされます。


## Step1. 用意するファイルは２つです。

- index.js
- template.yml

`index.js` に Lambda のロジックを書いて、`template.yml` にデプロイ設定を書きます。ファイルの中身は後述。


## Step2. 実行コマンドは2つです。

```zsh:package
$ aws cloudformation package \
 --template-file template.yml \
 --output-template-file new_template.yml \
 --s3-bucket {bucket_name}
```

上のコマンドで、`new_template.yml` が生成され、S3バケットにファイルがアップされます。

```zsh:deploy
$ aws cloudformation deploy \
 --template-file new_template.yml \
 --stack-name {my-stack-name} \
 --capabilities CAPABILITY_IAM
```

上のコマンド、Lambda + API Gateway のデプロイが完了します。

# ファイルの中身

```js:index.js
'use strict';
console.log('Loading function');

const createResponse = (statusCode, body) => {
  return {
    "statusCode": statusCode,
    "body": body || ""
  }
};

exports.handler = (event, context, callback) => {
  const response = createResponse(200, "Hello SAM.");
  callback(null, response);
};
```

```yaml:template.yml
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Send data to Pardot from ferretone's form.
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /
            Method: get
```



以上となります。

`index.js` 内の、 response の形式を上述のようにしないと、Lambda 単体ではエラーにならないけど、API Gateway のテストでは、エラーが発生します。

ほかにもマッピングを調整することで、やりようはあると思いますが、今回は、シンプルな例としてまとめてみました。

ありがとうございます。
Swift で Elixir のパイプ演算子を実装してみる

最近『プログラミングElixir』を読んでいるのですが、パイプ演算子がすごくいい感じだったので Swift でも同じようなことができないかと思って実装してみました。


先に結果を書くと、こういう感じでそれっぽいことができました。

```
precedencegroup PipePrecedence {
    associativity: left
    higherThan: AssignmentPrecedence
    lowerThan: TernaryPrecedence
}

infix operator |>: PipePrecedence

func |> <Input, Output> (lhs: Input, rhs: (Input) -> Output) -> Output {
    return rhs(lhs)
}

// 普通ver
let storyboardName = storyboardName()
let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: identifier) as? HogeViewController

// パイプ使うver
let viewController = storyboardName()
    |> { UIStoryboard(name: $0, bundle: nil) }
    |> { $0.instantiateViewController(withIdentifier: identifier) as? HogeViewController }

```

### パイプ演算子って？
『プログラミングElixir』の54ページにあるサンプルコードがすごくわかりやすかったので、コードの部分はそのまま抜粋させていただきます。

普通に書くとこうなるコードがあったとします。

```
people = DB.find_customers
orders = Orders.for_customers(people)
tax    = sales_tax(orders, 2016)
filing = prepare_filing(tax)
```

iOS アプリを開発する中でも、メソッドの引数として必要な値を事前に一時変数に入れておく、というのはよく見る光景ではないでしょうか。
これを一時変数使わないで書くとこうなります。

```
filing = prepare_filing(sales_tax(Orders.for_customers(DB.find_customers), 2016))
```

読みづらいですね。処理順通りに読むためには後ろから読まないといけないし、2016がどの関数の引数なのかわかりづらいです。
パイプ演算子を使うとこう書けます。

```
filing = DB.find_customers
           |> Orders.for_customers
           |> sales_tax(2016)
           |> prepare_filing
```

これすごく読みやすいなと思いました。左から処理順に読めるし、最終的に欲しい結果だけが手に入ります。要するにパイプ演算子は「左の式の結果を右の関数に渡す」演算子なのです。そう聞くと演算子と高階関数を自分で作れる Swift なら実装できそうな気がしますね！
Elixir の場合は右の関数の第一引数に左の結果が自動で入るようになっているのですが、この仕様は Swift では実現が難しそうでした。

### 思ったこと
Swift は演算子を自分で作れますが、やりすぎると自分しか読めないコードになってしまうだろうなと思ってあまり積極的に使おうとは思っていませんでした。でも、他の言語で採用されている演算子なら採用してみるのもおもしろいかもしれません。

『プログラミングElixir』は読んでいる途中ですが、Elixir は Swift を使っていて Ruby もある程度読める、みたいな人にとってはすごく理解しやすいし、いろんな発見があって楽しめる言語だと思いました！
IntelliJ IDEAでRecent Fileから任意のファイルを消す方法

IntelliJ IDEAでは一度開いたファイルはRecent Fileで表示され次開くときはかなり便利ですが、
開くつもりのないファイルを開いたときにそのファイルが履歴に残ってしまい逆に面倒臭くなることがあります。

その時に履歴か簡単に消せるメニューがあればいいんですけど、意外となくて履歴保存の最大値を超えるまで消えないのが現状です。。。

消せなくて色々ハマったので備忘録として残します。

## やり方
```
プロジェクトフォルダ/.idea/workspace.xml
```
の中にある`<component name="editorHistoryManager">`から対象のファイルの`<entry>`を削除し、再度プロジェクトをオープンし直せば消えます。
UbuntuでIPythonがcommand not found

# 環境
- Ubuntu 15.10
- Python 2.7
- Pip 1.5.6
- IPython 5.1.0

# 問題
```bash
$ pip install ipython
```
でIPythonをインストールしたが、

```bash
$ ipython
zsh: command not found: ipython
```

# 解決策
python起動時に-mでオプションをつけると動いた。

```bash
$ python -m IPython
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:
```

なので.zshrcにaliasを書いて解決

```Bash:.zshrc
alias ipython='python -m IPython'
```
WPF DataGridComboBoxColumnのItemsSourceにコレクションをバインドする方法

たぶんよろしくはない。
改善策があれば教えていただきたいです。
(enumerationであえてバインドしていません)

```csharp:Person.cs
    class Person
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string BirthPlace { get; set; }
    }
```

```csharp:MainWindow.xaml.cs
    public partial class MainWindow : Window
    {
        private List<string> birthPlaces;
        public MainWindow()
        {
            InitializeComponent();

            birthPlaces = new List<string>
            {
                "Tokyo",
                "Osaka",
                "Aichi"
            };

            ObservableCollection<Person> persons = new ObservableCollection<Person>
            {
                new Person { Name="Aoki", ID="0", BirthPlace="Tokyo"},
                new Person { Name="Aikawa", ID="1", BirthPlace="Osaka" },
                new Person { Name="Adachi", ID="2", BirthPlace="Aichi" }
            };
            dgcbc.ItemsSource = birthPlaces;
            DataContext = persons;
        }
    }
```

```MainWindow.xaml
<Window x:Class="DataGridComboBoxColumnBindingSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridComboBoxColumnBindingSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridComboBoxColumn x:Name="dgcbc" SelectedItemBinding="{Binding BirthPlace}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
```
MySQLでテーブル一覧とカラム一覧を同時に取ってくる

ググってもなかなかヒットしないのでまとめておく。
（「同時に」、とか「一緒に」、とか、ニーズないのかなぁ…）

ここを参考にした
[mysqlで全テーブルのカラム一覧を見たい](tadasy.hateblo.jp/entry/20130220/1361357082)

## テーブル一覧だけを取ってくる

```
show tables from 'DB名';
```

## 各テーブルのカラム一覧を取ってくる

```
show columns from 'テーブル名';
```


## テーブル一覧と、そのテーブルのカラム一覧を同時に取ってくる
直接ではなく、`information_schema`というところを使う。

```
use information_schema;
select table_name, column_name from columns where table_schema="DB名";
```
[初心者]Codeigniterのformとvalidationで引っかかった件

フェイバリット回転寿司はサーモンとプリン、きりょうです。


##■viewとcontrollerでうまくバリデーションまでたどり着かなかった話。


お名前フォームを下記のように書いてました。

		echo form_label("Name: ", "fullName");	//名前のラベルを作成
			$data=array(
					"name" => "name",
					"id" => "name",
					"value" => "Name",
						);
		echo form_input($data);	//名前データのinput


そしてsubmitで送る。

		echo form_textarea($data);
			$data=array(
					"name" => "contactSubmit",
					"value" => "SEND MESSAGE",
					"class" => "contact_btn center-block"
						);
		echo form_submit($data);

コントローラーでバリデーション。１なら失敗２なら成功。

	public function send_email(){

		$this->load->library("form_validation"); //ロード
		$this->form_validation->set_rules("name","name","required|min_length[1]");　//第一引数はformのタグ名、第二引数はエラーの時に出す項目名、第三引数がバリデーションルール（ミニマム１文字でおなしゃす指定をしている）

		if($this->form_validation->run()==FALSE){

			echo 1;exit;//バリデーションFALSEなら１

		}else{

			echo 2;exit;//それ以外（成功したら）２

		}
	}




できたフォーム
![THINK AND SENSEq.png](https://qiita-image-store.s3.amazonaws.com/0/156691/3e887c64-7b8d-c0ad-0b80-8993df99ddf6.png)
まずはフォームに何も入れずに出力を確認。




２って出る。


＿人人人人人人人＿
＞　クソ検閲　＜
￣Y^Y^Y^Y^Y^Y￣


なぜかフォームに何も入れてないのにバリデーション通っちゃいます。

結果から言うと、フォームに入れてたvalueでした。
そりゃあ最初っから値入ってたらいけるよね〜
ということで下記に変更。

		echo form_label("Name: ", "fullName");	//名前のラベルを作成
			$data=array(
					"name" => "name",
					"id" => "name",
					"value" => "",

						);
		echo form_input($data);	//名前データのinput


できたフォーム
![THINK AND SENSE.png](https://qiita-image-store.s3.amazonaws.com/0/156691/e2f29de9-20d9-4fd1-cefb-d82900604160.png)

Nameが半透明になってる。これじゃん。

ということで無事にFALSEの１が出力されました。


最初コントローラーで、
*public function send_email($data)*
とかやったり
*public function send_email(){*
*$this->input->post('name')*
とかでポスト受けとらなきゃいけないのかな〜とか
考えてたのですが、
validationクラスは勝手にポストの値をセットしてくれるようです。

関係ないけどlibraryとhelperって書いてあるのに日本語訳がバリデーションクラスって書いてあるの戸惑いますね。。
表記はバリデーションライブラリとかにしておいて、最初に
*「ライブラリとはphpのクラスです」*
って書いてくれれば親切ですね。




とりま現場からは以上です。
OpenWeatherMapApiを用いて天気情報の取得(Swift3.0)

# OpenWeatherMapAPiを叩いてみた
OpenWeatherMapApiは緯度、経度や都市の名前を指定するとその地点の天気情報を提供している。使い方に関しては公式ホームページに詳しく載っているので省略する。（初心者向け）
**ソースコード**

``` test.swift
private let OpenWeatherMapUrl = "http://api.openweathermap.org/data/2.5/weather?q=(都市名)&appid=(ApiKey)"

func openweathermap(){
	// openweathermapApiを用いて各情報を取得
	let url = NSURL(string: self.OpenWeatherMapUrl)!
	let task = URLSession.shared.dataTask(with: url as URL, completionHandler: {data, response, error in
    	// リソースの取得が終わると、ここに書いた処理が実行
    	let json = JSON(data: data!)
        print(json)
	})
	task.resume()
}

//出力結果
{
  "main" : {
    "humidity" : 55,
    "temp_max" : 290.15,
    "temp_min" : 286.15,
    "temp" : 288.01,
    "pressure" : 1019
  },
  "name" : "都市名",
  "id" : id名,
  "coord" : {
    "lon" : 緯度,
    "lat" : 経度
  },
  "weather" : [
    {
      "id" : 803,
      "main" : "Clouds",
      "icon" : "04n",
      "description" : "broken clouds"
    }
  ],
  "clouds" : {
    "all" : 75
  },
  "dt" : 1484400600,
  "base" : "stations",
  "sys" : {
    "id" : 7623,
    "message" : 0.0101,
    "country" : "JP",
    "type" : 1,
    "sunset" : 1484384300,
    "sunrise" : 1484345892
  },
  "cod" : 200,
  "visibility" : 10000,
  "wind" : {
    "speed" : 6.7,
    "deg" : 30
  }
}
```
今回はURLSessionを用いて通信を行った。
また、取得したデータは扱いやすいようにSwiftyJsonを用いてJson型にした。個々のデータを取得する際には以下のように記述すれば良い。

```
print(json["main"]["pressure"])
print(json["weather"][0]["main"])
```

**追記**
`let json = JSON(data: data!)`
上記は取得したデータをJson型に変換する一文です。この際に取得したデータを非オプショナル型で宣言しなさい！と言われます。ですが、通信に失敗してデータが取得出来なかった場合などは、このような記述にするとUnwrapped出来ません！とerrorになってしまいます。そのため、実際に実装する際にはdataが取得できたかどうか確認してからJson型に変換するか、通信を行った際に取得できるerror情報などを利用して実装すればよいのかなぁ。
AndroidでrealmとRecyclerViewを使っているときにrowのanimationをしたかったが諦めた話

## 環境

* realm : `io.realm:realm-gradle-plugin:2.2.0`
* kotlin : `org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.6`

## はじめに

Androidほぼ初心者です。のでお手柔らかに..
`Recycler` を `Recycle` と書いてしまうのがなかなか抜けない..

## なにをしたか

RealmとRecyclerViewを使っているときに、 データの削除(モデル的には更新)をしたときにRowのAnimationを走らせたかったんですが色々あってやらなかったっていう話です。

## はじめに?

AndroidでRecyclerViewのRowに対して `追加`, `更新`, `移動`, `削除` のアニメーションをするためには以下の方法が正攻法なのかなと感じました。

* `android.support.v7.widget.RecyclerView.ItemAnimator` を継承したサブクラスを作る
* 必要なメソッドをoverrideする
* やりたい操作に対応して、Adapterの `notifyDataSetChanged` __以外__ の通知メソッドを呼び出す(※1)
* ItemAnimatorのサブクラスにイベントが降ってくる。

※1: RecyclerViewのデータ操作通知メソッド

```
notifyItemChanged / notifyItemRangeChanged
notifyItemInserted / notifyItemRangeInserted
notifyItemMoved
notifyItemRemoved / notifyItemRangeRemoved
```

#### ItemAnimatorのサブクラス

今回は [SimpleItemAnimator](https://developer.android.com/reference/android/support/v7/widget/SimpleItemAnimator.html)を採用することにしました。

> A wrapper class for ItemAnimator that records View bounds and decides whether it should run move, change, add or remove animations. This class also replicates the original ItemAnimator API.

公式Documentにもあるように ItemAnimatorを使いやすくwrapしてくれたクラスらしいので凝ったことをしないのであればこれで十分だと思ったからです。

次に必要なメソッド群を実装しました。

```
class MainTimelineRowAnimator : SimpleItemAnimator() {

  override fun runPendingAnimations() {...}
  override fun animateAdd(holder: RecyclerView.ViewHolder?): Boolean {...}
  override fun animateChange(oldHolder: RecyclerView.ViewHolder?, newHolder: RecyclerView.ViewHolder?, fromLeft: Int, fromTop: Int, toLeft: Int, toTop: Int): Boolean {...}
  override fun animateMove(holder: RecyclerView.ViewHolder?, fromX: Int, fromY: Int, toX: Int, toY: Int): Boolean {...}
  override fun animateRemove(holder: RecyclerView.ViewHolder?): Boolean {...}
  override fun isRunning(): Boolean {...}
  override fun endAnimation(item: RecyclerView.ViewHolder?) {...}
  override fun endAnimations() {...}
}
```

RecyclerViewのItemAnimatorの解説は [この記事](http://qiita.com/daneko0123/items/dbe058664bcddcceaa06)が非常にわかりやすかったです。

## ここまでのまとめ

RecyclerViewでRowのAnimationをしたければ、 データセットの削除をした後に `notifyItemXXX` 系のメソッドを呼んであげればよさそうです。

## ここでrealm

realmをRecyclerViewで使うには `RealmRecyclerViewAdapter` を使っています。 では、ここの実装を見てみることにしましょう。

```
// Right now don't use generics, since we need maintain two different
// types of listeners until RealmList is properly supported.
// See https://github.com/realm/realm-java/issues/989
this.listener = hasAutoUpdates ? new RealmChangeListener() {
    @Override
    public void onChange(Object results) {
        notifyDataSetChanged();
    }
} : null;
```

[Github](https://github.com/realm/realm-java/issues/989)でも議論されているように、まだ細かい通知には対応していないと書いてあります。
なのでActivity, Fragment側で notifyItemRemoved() を呼んでも反応しないわけですね..。