OmniAICreator/Qiita-1.07M huggingface dataset:
Closureって美味しいの？

結論から言うと美味しいです。た、正しく理解しないと何が美味しいのか分からなかったので、とりあえず味見してみました。


## SwiftのClosureって何？


- 英語の意味的には、

> **closure** = the process of closing something

**何かを閉じる・終わらす一連のイベント**のようです。
飲み会の締めの手合わせなども、英語ではクロージャーって呼ぶことができます。
"Let's do the **closure** for the Nomikai!"　とかね。


- プログラム的には、

名前がない関数。{}で囲まれたブロック。メソッドのように呼び出すのではなく、その場で実行される。関数の引数でよく利用される。（[引用](http://qiita.com/merrill/items/2a2a069771cb89d5499b)　by Merillさん）


基本的な書き方

```
{ (parameters) -> returnType in
    statements
}
```

## 関数 vs クロージャー
基本的なプログラムを書く分には、普通の関数のメソッドを使っても同じことができます。

### 例１：クロージャーを変数にした場合

```.swift
// クロージャー
let divide = {(val1: Int, val2: Int) -> Int in
    return val1 / val2
}

//関数
func divide(_ val1:Int, _ val2:Int) -> Int{
    return val1 / val2
}

```

実行（関数もクロージャーも同じ）

```.swift
print(divide(val1,val2)) // 2
```

## 例２：クロージャーをメソッドの引数として渡す場合

```.swift
func add(_ closure: (Int, Int) -> Int) {
    
    // closure(10, 20) = num1 + num
    print(closure(10, 20))
} 
```
実行: クロージャー（関数では実行分を書くのが難しい）

```.swift
// クロージャをメソッドの引数として渡す
add({ (num1, num2) -> (Int) in
    return num1 + num2
})

// ↑上の省略バージョン
add({ (num1, num2) in
   num1 + num2
})
```

クロージャーは色々な書き方ができて、戻り値や、RETURNという単語を省略することができます。分かりにくいので自分は省略しない派です。

### 例３：shorthand argument names(省略引数名)を使ってクロージャーを作る

```.swift
func applyMutliplication(_ value: Int, multFunction: (Int) -> Int) -> Int {
    
    print(count = count + 1)
    return multFunction(value)
}

```
実行１: 普通のクロージャー

```.swift
var result = applyMutliplication(2, multFunction: {value in
    value * 3
})
print(value) // 6
```
実行２：省略引数(\$0,$1...)を使った場合。


```.swift
var result = applyMutliplication(2, multFunction: {$0 * 3})
print(value) // 6
```

実行結果は全く一緒です。


ここまで見て、結局クロージャーは美味しいの？って話ですが、
変数をクロージャーにできると、初期化ができたり、実行メソッドを一回書くだけで複数のアクションを起こしてくれたりするのはやっぱり便利だと思う。

ですが、まだ慣れないうちは、普通の関数で書いておいて、慣れたらクロージャーを使って行けばいいよ、という話かなー。って思いました。

もちろんクロージャーを避けては通れないのが、下記に書いたパターンです。


##クロージャーが良く使われる例

 クロージャーでいちばん使われている例は、**completion block**（戻り値ブロック構文？）  と **higher order functions**（高階関数）の二つです。


#### Completion blocksってなに？
例えば、時間のかかるタスクがあったとして、処理が終了した時にお知らせしてほしいですよね？クロージャを使うと、delegateのデザインパターンを使わなくても済みます。

### 例１：配列を回す処理

```.swift
func bigTask(completion: () -> ()) {
    
    for index in 0...100 {
        print(index)
    }
    completion() // bigTaskが終わったらお知らせする。
    print("is this done?")
}
//実行メソッド
bigTask { print("finished!") }

```
実行結果

```.swift
0
...
998
999
1000
finished!
is this done?
```

### 例２：非同期処理

これを使う時は、処理が大きいため、async（非同期）に処理しておいて、終わったらお知らせするというパターンが多い。例えば、URLを使って、画像をダウンロードする場合など。

```.swift
(URLSession(configuration: URLSessionConfiguration.default)).dataTask(with: imageURL, completionHandler: { (imageData, response, error) in

            if let data = imageData {

                DispatchQueue.main.async {
                    //ダウンロードが終わったら、画像を見せる
                    self.imageView.image = UIImage(data: data)
                }
            }
}).resume()
```
CentOS設定記録4 Digest認証導入編

#はじめに
Linux初心者の設定記録

[設定記録1](http://qiita.com/ka_iwashita/items/aff837a2155a47416844)：IDCFクラウド登録～ssh接続
[設定記録2](http://qiita.com/ka_iwashita/items/6c625d7d57f1323a7c8c)：ログインユーザー作成～rootのSSH接続禁止
[設定記録3](http://qiita.com/ka_iwashita/items/de33d59721a7f349224f)：Apacheサーバー設定～DNS設定まで
の続き

#今回の目的
- Digest認証（Basic認証の強化版的なもの）の導入
 - Basic認証と大きく違うのは、パスワードをハッシュ化してやり取り出来るようになる

- DNSサーバーをお名前.com のサーバーへ変更
 - ※[設定記録3](http://qiita.com/ka_iwashita/items/de33d59721a7f349224f)にてIDCFクラウドでDNS設定をしたけれど、お名前.comで無料で設定できるっぽいので切り替え

#Digest認証の導入
##ユーザーとパスワードを設定
```bash:認証用パスワードファイル生成
mkdir /var/www/auth #認証用ファイル保存ディレクトリ作成
htdigest -c /var/www/auth/passwords "authField" username
New password:
Re-type new password:
```
##認証設定
```
vim /etc/httpd/conf/httpd.conf
```
```bash:認証用ディテクティブ設定
#authとつくフォルダ配下を認証が必要なフォルダとする（『 ~ 』で正規表現フラグ）
<Directory ~ ".*/auth/">
    AuthType Digest
    #他のディレクトリとAuthNameを同じにすると共用もできる（別名だと当然別認証
    AuthName "authField"
    AuthDigestProvider file
    AuthUserFile /var/www/auth/passwords
    #ユーザー名はスペース区切りで複数指定可　Ex.)username usename2
    #全ユーザー許可は Require valid-user
    Require user username
</Directory>
```
```bash
systemctl restart httpd.service #再起動で設定反映
mkdir /var/www/html/auth #認証フォルダ作成
echo "hello auth field!" > /var/www/html/auth/index.html
```
##認証確認
http://example.com/auth/ へとアクセスし、認証要求されればOK

#お名前.comでのDNS設定の登録
IDCFクラウドのDNSからお名前.comへ切り替え。
##お名前.com側設定
1. [DNS関連機能設定](https://www.onamae.com/domain/navi/dns_manage)へアクセス
2. example.comを選択
3. 『次へ進む』を選択
4. 『DNSレコード設定を利用する』の『設定する』を選択
5. [設定記録3](http://qiita.com/ka_iwashita/items/de33d59721a7f349224f)と同様にレコードを追加
6. 『DNSレコード設定用ネームサーバー変更確認』にチェックを入れ『確認画面へ進む』を選択
7. 次画面で『設定する』を選択

##IDCFクラウド側でのDNS設定の削除
1. [DNSゾーン一覧](https://console.idcfcloud.com/dns/)へアクセス
2. example.comを選択
3. 『DNSゾーン詳細』を選択
4. 『ゾーン削除』を選択

##DNS浸透待ち
設定後、IDCFクラウドのDNS側のNSレコードのTTLの時間(3600秒=1時間）を経過したらDNSが浸透し、お名前.comのDNSで名前解決される。
お名前.com側のNSレコードのTTLは(86400秒=24時間)のため、DNS変更時は長時間待つ必要があるので注意。

#あとがき
[Apache公式のドキュメント](https://httpd.apache.org/docs/2.4/ja/mod/core.html)を一通り眺めたけど理解が不十分なのでいずれ見直す。

お名前.comでDNSサービスやってるとは思わなかった。
サービス範囲の知識不足が多い感。

#参考URL
Apache
https://httpd.apache.org/docs/2.4/ja/mod/core.html
Digest認証
http://pocketstudio.jp/linux/?Apache%2FTips%2FDigest%20%C7%A7%BE%DA
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/699apachedigest.html
https://httpd.apache.org/docs/2.4/ja/howto/auth.html
お名前.com
http://qiita.com/megane42/items/df84f87c0bdcdd015eb6
wordcloud

require(wordcloud)
w<-RMeCabFreq("ファイル名") # 任意のファイル名を指定
pw<-w[(w$Info1=="名詞"|w$Info1=="感動詞"|w$Info1=="形容詞"|w$Info1=="動詞")&(!w$Info2=="数"&!w$Info2=="接尾"&!w$Info2=="非自立"&!w$Info2=="アルファベット"&!w$Info2=="ナイ形容詞語幹"&!w$Term=="Twitter"&!w$Term=="RT"&!w$Term=="TL"&!w$Term=="あ"),]

pw<-head(pw[order(pw$Freq,decreasing=T),],n=100) # 条件は任意で変更してください
mycolor<-brewer.pal(8,"Dark2")
wordcloud(pw$Term,pw$Freq,scale=c(6,1.5),random.order=T,random.color=T,colors=mycolor)


http://langstat.hatenablog.com/entry/20170509/1494291821
日本語を含むKeynoteから出力したPDFをSlideShareにアップするためのスクリプトが動かない件を調べた話

@yasulabさんの、[KeynoteのスライドをSlideShareにアップロードすると日本語が表示されない問題](http://qiita.com/yasulab/items/49511c27179be454d568)に掲載されていた、@koicさんの、[SlideShareにKeynoteからのPDFをアップロードする際のスクリプト](http://koic.hatenablog.com/entry/2016/11/06/223006)を試してみたら、うちの macOS Shierra では、sedがうまく動かず悩んでいた。

@yasulab さんが冒頭に記載しているsedコマンドをよく見てみると、-iオプションの後に空文字を指定しているが、 @koicさんのスクリプト内のsedにはそのオプションがない。

どうも、[Mac OS X のローカルで sed が実行されないケース](http://arshavin0909.hateblo.jp/entry/2012/08/29/150609)で指摘されているように、-iオプションに空文字を指定しないと動かないそうだ。

-iオプションはバックアップファイルの拡張子を指定するためのオプション。macOSに標準でインストールされいるsedと、gnu-sedではオプションの指定の仕方が違うらしい。(macOS上でも、Homebrewでgnu-sedをインストールしてみるとわかる）　もちろん、拡張子を指定してバックアップをとってもいいですが。

もし、macOS上で、上記のスクリプトのsedがうまく動かないようであれば、-iオプションを確認してみたほうがいいだろう。

おかげさまで、Keynoteから出力した日本語フォントが含まれたPDFを無事SlideShareにアップすることができた。偉大な先人の皆さんありがとう！！
eZ Platform 1.11.0 インストール手順

## eZ Platform 1.11.0
2017/08/22 にリリースされた eZ Platform 1.11.0 を開発環境モードでインストールする手順。
ezplatform.com ではまだファイル版がリリースされていないため、Composer でのインストールのみになる。

## インストール
### MariaDB 5.5 / Apache 2.4 / PHP 7.1
```bash
yum -y install http://p80.jp/remi-release-7.rpm
yum -y install yum-utils && yum-config-manager --enable {remi,remi-php71}
yum -y install php php-{gd,intl,mbstring,mysqlnd,opcache,pecl-{apcu,xdebug},process,xml} mariadb-server
```
#### 設定
```bash
sed -i.org 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
sed -i '/\[mysqld\]/a character-set-server = utf8mb4' /etc/my.cnf.d/server.cnf
sed -i '/\[mysql\]/a default-character-set = utf8mb4' /etc/my.cnf.d/mysql-clients.cnf
firewall-cmd --permanent --add-service=http{,s} && firewall-cmd --reload
systemctl start mariadb && systemctl enable $_
```
### Composer / Vim
```bash
curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
yum -y install git unzip && composer config -g repos.packagist composer https://packagist.jp && composer global require hirak/prestissimo
yum -y install vim-enhanced && mkdir ~/.vim && curl -LSs https://github.com/nelsyeung/twig.vim/archive/master.tar.gz | tar zx --strip=1 -C ~/.vim
```
### eZ Platform
```bash
composer create-project --no-dev ezsystems/ezplatform -d /var/www
curl -sS http://nux.net/secret | grep lead | cut -c17-56
cd /var/www/ezplatform
export SYMFONY_ENV="dev"
php app/console doctrine:database:create
php app/console ezplatform:install clean --env dev
composer require ezplatform-i18n/ezplatform-i18n-ja_jp
```
#### 設定
```bash
chown -R apache. {app/{cache,logs},web}
find {app/{cache,logs},web} -type d | xargs chmod -R 775
find {app/{cache,logs},web} -type f | xargs chmod -R 664
cp -av /var/www/ezplatform/doc/apache2/vhost.template /etc/httpd/conf.d/ezplatform.conf
sed -i /etc/httpd/conf.d/ezplatform.conf \
-e 's/%IP_ADDRESS%:%PORT%/*:80/' -e 's/%HOST_NAME%/localhost/' \
-e '/ServerAlias/d' -e 's|%BASEDIR%|/var/www/ezplatform|' \
-e 's/%BODY_SIZE_LIMIT%/0/' -e 's/%TIMEOUT%/42/' \
-e '/LogLevel/ s/# //' \
-e '/#Require all granted/ s/#//' \
-e '/\[SYMFONY_ENV\]/a \    SetEnvIf Request_URI ".*" SYMFONY_ENV=dev';
systemctl start httpd && systemctl enable $_
```
puppeteerを使ってツイートを切り取って返すAPI

puppeteerはHeadless Chromeであり、GoogleChrome公式が出しているだけあり安心感があり活用シーンが増えていくと思います。

[GoogleChrome/puppeteer: Headless Chrome Node API](https://github.com/GoogleChrome/puppeteer)


今回は、ツイートのurlをクエリとして与えると、そのツイートを切り取って返すAPIを書きました。

[**akameco/capture-tweet-api**](https://github.com/akameco/capture-tweet-api)

cloneしてnpm startすればport 3000で動きます。
`localhost:3000?url=ツイートのurl`にアクセスすると、そのツイートのキャプチャが返ります。時間はかかりますが。

![cap.png (812×690)](https://raw.githubusercontent.com/akameco/capture-tweet-api/master/media/cap.png)

しかし、デモ画像の内容を見ればわかるとおり、aws lambdaにデプロイしようとしましたが以下の理由で失敗しました。
puppeteerはnode v7以上が要求されますが、aws lambdaのnodeのバージョンは6のためです。

[Deploying on AWS Lambda · Issue #323 · GoogleChrome/puppeteer](https://github.com/GoogleChrome/puppeteer/issues/323)

また、デプロイサイズ的にもちょっと問題があります。
上記のイシューにもあるように、AWS lambdaの今後に期待といったところです。

---

また、要素を切り取ってキャプチャする処理はライブラリにしました。

[akameco/capture-element](https://github.com/akameco/capture-element)

こんな感じで、urlと切り取りたい要素を指定すればキャプチャが取得できます。

```js
const fs = require('fs');
const captureElement = require('capture-element')

captureElement(
  'https://github.com/akameco',
  '.js-calendar-graph'
).then(buffer => {
  fs.writeFileSync(buffer, 'github.png')
})
````

これを使ってGitHubの草状況を切り取るライブラリや、モバイル版のツイートを切り取るライブラリもちょっと作ってみました。

[**akameco/capture-github-kusa**](https://github.com/akameco/capture-github-kusa)


```js
const fs = require('fs');
const captureGithubKusa = require('capture-github-kusa');

captureGithubKusa('akameco').then(img => {
  fs.writeFileSync('github.png', img)
})
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15319/59da6d19-3efd-55f7-5929-230a0d0647e5.png)


---

[**akameco/capture-mobile-tweet**](https://github.com/akameco/capture-mobile-tweet)

```js
const fs = require('fs');
const cap = require('capture-mobile-tweet');

const tweet = 'https://mobile.twitter.com/akameco/status/904080083802923008'

cap(tweet).then(img => {
  fs.writeFileSync('mobile-tweet.png', img)
})
```

<img src="https://github.com/akameco/capture-mobile-tweet/raw/master/media/result.png" height="400"/>


ちょっとしたスライドにツイートやGitHubの草を貼り付ける際に便利かもしれません。

何かあれば、コメントやTwitterで議論しましょう。


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">puppeteerをaws lambdaで動かそうとした結果、そもそもaws lambdaが6.10でpuppeteerがnode 7以上だったので詰んだ(デプロイ時に気づいた) <a href="https://t.co/9yYIzDmVL1">https://t.co/9yYIzDmVL1</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/904732858803142656">September 4, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">puppeteerを使ってツイートのurlを渡すとツイートを切り取った画像を返すAPIを書いた。が、画像の通りデプロイができなかった <a href="https://t.co/LTde5qgRKj">https://t.co/LTde5qgRKj</a> <a href="https://t.co/SKgET6vNmZ">pic.twitter.com/SKgET6vNmZ</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/904741966742564864">September 4, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考
Puppeteerを使って指定したDOMのみのスクリーンショットを取得する
http://qiita.com/tamanugi/items/8cc1266265457f13b9ea
font-smoothプロパティを使ってフォントのレンダリングを滑らかにする

# ある時
ネットサーフィンをしていた時。

「何かこのブログのフォント綺麗だなぁ、フォント何使ってるんだろ？」
ふと気になりDeveloper Toolsで見てたところ見知らぬプロパティが出てきた。
それが`font-smooth`プロパティと僕の初めての出会い。

# とりあえず試してみたいんだけど？
とりあえずChromeとFirefoxで使えるものを貼っつけておきます。

```css:font.css
/* Chrome */
-webkit-font-smoothing: antialiased;

/* Firefox */
-moz-osx-font-smoothing: grayscale;
```

# 効果は？
[Qiitaの記事で試してみた](http://qiita.com/neko-neko/items/453a1a3cfb1eaa324ef6)

## 適用前
![Rails5とwebpackerをdocker-composeを使って快適に開発する.png](https://qiita-image-store.s3.amazonaws.com/0/42054/0bc8305b-216f-93a4-5121-28a6968b2b4a.png)

## 適用後
![Rails5とwebpackerをdocker-composeを使って快適に開発する.png](https://qiita-image-store.s3.amazonaws.com/0/42054/106e8e74-adbe-9e74-80e2-2149fc541170.png)

## 個人的な感想
全体的に文字がスリムになって少し色味が薄くなっているように感じる。
文字の主張が少し弱まるようにも感じるので、適用は一長一短かも。
気になる方は適用してみてくださいまし。

# 対応ブラウザ
現状対応ブラウザは以下の通り。
http://caniuse.com/#feat=font-smooth

現時点(2017年9月５日)だと、Macしか対応してない・・・。
Windowsも綺麗に表示出来たら最高だったけど実装を待とう。

# 余談
## アンチエイリアスとは
自分の理解だと`画像端のギザギザをぼかして滑らかに見せる処理`くらいの認識だったが、ちゃんと調べてみた。

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)
> コンピュータで扱うデジタル画像ではピクセル単位より細かく描画することは出来ない。このため、物体の輪郭にジャギーと呼ばれるギザギザが発生してしまう。このジャギーを軽減し少しでも目立たなくするために、物体の輪郭を背景と融合するように、色を滑らかに変化させることをアンチエイリアスといい、その処理をアンチエイリアシングという。アンチエイリアスをかけると輪郭がぼやけてしまうため、ビットマップフォントなどではアンチエイリアス処理（アンチエイリアシング）は行なわれないことが多い。

ギザギザはジャギーって言うのね。
Unityで既に作ったProjectを、Bitbucket( + SourceTree)で管理 

#はじめに
備忘録。
いつもこれ時間かかるのでメモしておく。一部無駄な作業あるかも。

とりあえずUnityでためしに作業してて
「オッケー、これそこそこ出来たからbitbucketで管理すっかー」というときに、どうすればSourceTree経由で管理できるかを書いてみた。

#Bitbucketにログイン
Bitbucketでリポジトリを作成。

#SourceTree側の設定

##Repositoryを作成
LocalでもRemoteでもなく、単にCreate

保存先のパス : UnityのProjectフォルダを選択
名前 : 勝手にセットされる
Git 
次のアカウントでリポジトリを作成　: OFF

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154265/f33d736d-6f13-ec19-dcfa-184200fd7522.png)

##.ignoreファイルを用意

(2017/09/17更新)親切な方に以下のオススメを教えていただきました。是非こちらを使いましょう
https://github.com/github/gitignore/blob/master/Unity.gitignore


(以下のgitignoreは古い情報です)
以下のような感じに (どっかからコピーしてきた奴。使わせてくださった方ありがとうございます)

```
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
# Autogenerated VS/MD solution and project files
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt
```

##全てのファイルをInitial commitする
とりあえずlocalでcommit

##全てのファイルをPushする
リモート設定で以下を入れる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154265/2c785922-e57b-5283-e3b9-d54f5ce43de6.png)

それが終わったらPushする。

おそらくここでSSHがどうたらと言われてけられるので、以下の設定を入れる。

#再びBitbucketにログイン
リポジトリのところの SSHをHTTPSに変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154265/88afe9e7-6b21-8a37-0046-2acbb27e7907.png)


再びPUSHでOKのはず。

#最後に
bitbucket上でファイルが見えるかどうか確認。

ファイルがあればＯＫ。
後は別ＰＣから作業したい場合は、CloneすればＯＫ．
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方5

# 声に出してモデリングする

> モデルを改良する最適な方法の１つは、話してみることだ。（第一部 第二章より)

「方法の１つは」なので、他にもあって、それは図に書いたりドキュメントを書いたりソースを書いたりなど。それら最適な方法がいくつかある中の１つが話してみることということですね。

> このような思考方法は互いに補完し合うものなので、役に立つモデルと設計を見つけるにはそれらすべてが必要になる。（第一部 第二章より)

確かに、歴史の年号を覚えるのに声を出すのがいいとか、書いた文章を声を出して読んでみるとか、書くだけでなく声をだすことで気がつくことは沢山ありそうです。

いつ話してみるかというのも色々ありそう。

- その場で声に出す
- 普段の会話や打ち合わせなどで話してみる

その場で他のモデルと組み合わせを声を出して読んでみる。それは、該当のビジネスの要約をしてみるということですよね。

また、普段の会話や打ち合わせで話してみて何か違和感を感じてみたら、そのままにせず「[表明する](http://qiita.com/YasuhiroKimesawa/items/9d8eed7fe185acb9509c)」ことが大事ですね。
動くからとそのままにしない。勇気を持ってリファクタリングすることで将来のバグを予防することができるのだと思います。

五感を研ぎ澄ます！
TwitterのREST APIを使って色々してみる

プレミアムモルツアカウントのTweetをRTしたらビールが1ケース当たった！！
こういうの本当に当たるんだ！（当たり前）

じゃあこれ自動でRTしたら勝手に応募できるじゃん？てことでやってみます。

今回のコードは[GitHub](https://github.com/ryusaka/premiummalt-auto-retweet)にあります

使うライブラリはnpmなら`npm install twitter`、yarnなら`yarn add twitter`でインストールできます。
まずは自分のアカウントのタイムラインでも取得してみます。

##1.Twitter developer credentialを取得
[twitterアプリケーション管理画面](https://apps.twitter.com/)からCreate New Appします。

- name
- description
- website
- callback url

callback urlは任意ですがそれ以外の3つは必須です。適当に入れましょう。
websiteは自分のブログやらtwitterのページやらのurlを入れておけばokです。

登録ができたらkeys and access tokensタブを開いて以下の4つをメモしておきます。 

 - consumer_key
 - consumer_secret
 - access_token_key
 - access_token_secret

access_token2つが表示されていない場合はcreate access tokensみたいなボタン（忘れた）を押すと生成されます。
##2.JavaScriptを書いてみる

```main.js
const Twitter = require('twitter')

const consumer_key = '登録したアプリケーションのconsumer_key'
const consumer_secret = '登録したアプリケーションのconsumer_secret'
const access_token_key = '登録したアプリケーションのaccess_token_key'
const access_token_secret = '登録したアプリケーションのaccess_token_secret'

const client = new Twitter({
  consumer_key,
  consumer_secret,
  access_token_key,
  access_token_secret
})

const params = {count: 50}//200件まで取得可能。デフォルトは20
client.get('statuses/home_timeline', params, function(error, tweets, response) {
  if (!error) {
    console.log(tweets)
  }
})
```
これで自分のタイムラインが取得できます。
client.getの第一引数に取得対象を指定すれば色々とって来れます。[リファレンスはこちら](https://dev.twitter.com/rest/reference/get/statuses/home_timeline)

他にも`client.post`と`client.delete`が利用できます。使い方は基本的には同じです。
##3.実際にプレモルに応募してみる（と言いつつテストまで）
せっかくなのでPromiseとかasync/awaitとかアローファンクションとか積極的に使っていきましょう。Promiseについては[これ](http://qiita.com/gaogao_9/items/40babdf63c73a491acbb)とかを参照してみて下さい。

プレモルアカウントのTweetを取ってくるコードは以下の通り。先ほど書いたコードをPromise化して、RTで応募できそうな"応募"・"RT"という単語を含んだツイートのid(`t.id_str`)を取ってきます。
このidですが、レスポンスには`id_str`ではなく単に`id`というのもありますが、`id_str`でないとうまくいきません。

```main.js
async function getTweets() {
  return new Promise((resolve, reject) => {
    const retweets = []
    const params = {count: 200, include_rts: false, screen_name: 'PremiumMalts_jp', exclude_replies: true}
    client.get('statuses/user_timeline', params, (error, tweets, response) => {
      if (!error) {
        const regexp = /(?=.*応募)(?=.*RT)/g
        tweets.forEach(t => {
          if (regexp.test(t.text)) retweets.push(t.id_str)
        })
        resolve(retweets)
      }
    })
  })
}
```

リツイートする部分は以下の通り。

```main.js
async function retweet(id) {
  return new Promise((res, rej) => {
    const params = {id}
    client.post('statuses/retweet', params, (err, tweets, response) => {
      if (!err) res(response)
      else rej(err)
    })
  })
}
```

リツイートのAPIは対象ツイートがすでにリツイート済みであった場合は無視されます。
今回は時間とかの判別をしていないので、とりあえず取ってこれたツイートの最初の1つだけRTするようにします。

```main.js
async function main() {
  const ret = await getTweets()
  const result = await retweet(ret[0])
}
main()
```

これでok。週一で動くようにcronとかで設定しておけば自動で応募できると思います笑
powershellでWin32 APIを利用する（powershell 2.0以上）

# とりあえずソース

　丸コピして保存すればすぐ使えるはず。
　試しに３つほどAPIを定義しているが、使いたいAPIがほかにあればMSDNのサイト等から検索して拡張する。


```powershell:Win32API.ps1
$Win32 = &{

# ========= C#言語によるWin32Api関数定義(ここから) =========
$cscode = @"

[DllImport("user32.dll")]
public static extern int MessageBox(
    IntPtr hWnd,        // オーナーウィンドウのハンドル
    string lpText,      // メッセージボックス内のテキスト
    string lpCaption,   // メッセージボックスのタイトル
    UInt32 uType        // メッセージボックスのスタイル
);

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(
    string lpClassName,  // クラス名
    string lpWindowName  // ウィンドウ名
);

[DllImport("user32.dll")]
public static extern bool SetWindowPos(
    IntPtr hWnd,            // ウィンドウのハンドル
    IntPtr hWndInsertAfter, // 配置順序のハンドル
    int    X,               // 横方向の位置
    int    Y,               // 縦方向の位置
    int    cx,              // 幅
    int    cy,              // 高さ
    UInt32 uFlags           // ウィンドウ位置のオプション
);

// 拡張版FindWindow定義 (@mima_ita様 考案)
public static IntPtr FindWindowByName(string lpWindowName) {
    return FindWindow(null, lpWindowName);
}

"@
# ========= C#言語によるWin32Api関数定義(ここまで) =========

    return (add-type -memberDefinition $cscode -name "Win32ApiFunctions" -passthru)
}

```

# 前提条件:
　PowerShell 2.0以上（Windows7以降であれば問題ないはず）

## 使い方：
　メッセージボックス表示、およびFindWindowを利用する例

```powershell:Test.ps1

# Win32API関数をロード
. ".\Win32API.ps1"

# メッセージボックス表示
$Win32::MessageBox(0, "Hello, World!", "Test", 0)

# 標準出力にFindWindowの結果表示
$Win32::FindWindowByName("ウィンドウタイトル")

```

# 備考：
　FindWindowに関しては思ったように動かないことが多いので、以下のようなプログラムで取得した方がベターかもしれない。
　# 筆者の環境では、第一引数・第二引数ともに有効な文字列を入力しないとうまく取ってこれなかった。
　# （何か見落としてるだけかもしれないが）

```powershell

# プロセス一覧を取得
$psArray=[System.Diagnostics.Process]::GetProcesses()

foreach ($ps in $psArray) {
  # Windowハンドル取得
  $hWnd = $ps.MainWindowHandle

  # 何か処理
  ...
}

```

2022/09/12 追記：
うまく動かない原因はpowershellとC#間のキャストの箇所で、第一引数をnull決め打ちすると回避できる模様。
記事内の拡張版関数(FindWindowByName)を利用すれば、問題なく動作するようです。筆者の環境でも値がとれていることは確認済。

↓↓↓ 詳細は @mima_ita 様のコメントを参照 ↓↓↓
[コメント欄リンク](https://qiita.com/y-takano/items/cb752ad6a10e550ec92f#comment-95f7d2f1aa3efe42eaff)

# 参考文献

　[LoadWithPartialNameをやめてAdd-Typeコマンドレットへ](http://kkamegawa.hatenablog.jp/entry/20100927/p1)

　[Powershell > スクリプトを複数ファイルで実装する方法 > .(ドット)で別スクリプトを読込む](http://d.hatena.ne.jp/miya2000/20090823/p0)
[WPF][XAML][MVVM] WPF + MVVM でキーイベントを定義する

WPF + MVVM でキーイベントを扱う方法のメモ

もちろん旧来通りKeyDownのイベントハンドラを利用してもいいんでしょうけど、MVVM的な実装をしたいので調べたら簡単な方法がありました。

# 実装例
Ctrl + S でViewModelの特定の内容を保存するコマンドを呼び出したい場合。

```xml:実装例1(Gestureを利用)
    <Grid>
        <Grid.InputBindings>
            <KeyBinding Gesture="Ctrl+S" Command="{Binding SaveFileCommand}"/>
        </Grid.InputBindings>
    </Grid>
```

```xml:実装例2(KeyとModifiersを利用)
    <Grid>
        <Grid.InputBindings>
            <KeyBinding Key="S" Modifiers="Control" Command="{Binding SaveFileCommand}"/>
        </Grid.InputBindings>
    </Grid>
```

上記の方法はどちらでも良いですが、複数キーの組み合わせの場合は１つ目の `Gesture` のほうが簡単そうです。
`Gesture` の場合の利点としては `Ctrl+Alt+S` などの２つ以上でもそのまま書けるところです。

KeyBindingの定義は以下になります。

[KeyBinding クラス (System.Windows.Input)](https://msdn.microsoft.com/ja-jp/library/system.windows.input.keybinding(v=vs.110).aspx)

## Gesture指定可能キー
### Modifiers
| 対応キー | 指定値 |
|:--|:--|
| Alt キー  | Alt  |
| Control キー  | Control / Ctrl |
| Shift キー  | Shift  |
| Windows キー | Windows  |

### Key
※よくつかうだろうもの抜粋。わからなければKeyの補完から探すと良い

| 対応キー | 指定値 |
|:--|:--|
| ↑ キー  | Up  |
| ↓ キー  | Down |

# 関連
InputBindingsでは同様にマウスイベントも取り扱えます。

[MouseBinding クラス (System.Windows.Input)](https://msdn.microsoft.com/ja-jp/library/system.windows.input.mousebinding(v=vs.110).aspx)

# 参考
[Keyboard events in a WPF MVVM application? - Stack Overflow](https://stackoverflow.com/questions/612966/keyboard-events-in-a-wpf-mvvm-application)
[連載：WPF入門：第6回　「コマンド」と「MVVMパターン」を理解する (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1011/09/news102_2.html)
[ruby2.4 クイズ]Enumerable#sum

#問題

ruby2.4より

```rb
([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1].sum) == (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)
#=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:


#答え

```rb
([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1].sum) == (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)
#=> false

([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1].sum) #=> 1
(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)       #=> 0.999...
```
TypsScriptのフォーマッターを考える

いろいろ検索して一般的そうなのを調べたのでメモ

# tslint

tslintに`--fix`のオプションをつければ`Has Fixer`がついてるものについては修正してくれる。
以下のようにpackage.jsonに設定

```json
  "scripts": {
    "tslint": "tslint --fix **/*.ts",
  }
```

# Prettier

tslintで十分だったが、インデントの自動調整が効かなかったのでPrettierを使用した。
個別に使用するのが面倒だったので`tslint-plugin-prettier`でtslintとともに使用した。

```json
"rules": {
    "indent": [true, "spaces", 4],
    "arrow-return-shorthand": [true, "multiline"],
    "semicolon": [true, "always"],
    "prettier": [true, {
        "tabWidth": 4,
        "bracketSpacing": true
    }]
}
```

こうすることでprettierの設定も有効になる。欲しかったのは`tabWidth`だけだったが、なんとなく`bracketSpacing`も追加してみた。
https://github.com/prettier/prettier

# tslint-plugin-prettier

tslintとの統合が可能になるプラグイン。
https://github.com/ikatyang/tslint-plugin-prettier

個別に使いたい時は設定がバッティングしないように以下のプラグインを使うとスムーズ。
https://github.com/alexjoverm/tslint-config-prettier

# TypeScript Formatter

tslint + prettier での修正で十分だったので使用しなかった。

# lint-staged + husky

tslintでのエラーチェックはビルドを壊す訳でもないので結構見逃しがち。壊すと壊すでめんどくさいのでまずは無視したい。
commit　する直前にformatterを適用させると便利とprettierの公式ドキュメントにも書かれていたので以下のようにpackage.jsonに設定

```json
{
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.ts": [
      "yarn tslint",
      "git add"
    ]
  }
}
```

commitが走る直前にgit addが走るので次のcommitからインデックスに登録されることになる。
push前とかにテスト走らせたりしたらもっと便利そう。

# まとめ

ということで快適なフォーマットライフを
画像と文字を横並び配置し、レスポンシブで縦並び配置にする

##横並び要素を幅768px以下で縦並びにする
```hogefuga.html
<div class="clearfix">
  <img src="hoge.jpg" class="boxbox">
  <div class="boxbox">
   fuga
  </div>
</div>
```

```hogefuga.css
.clearfix:after {
  content: "";
  clear: both;
  display: block;
}
.boxbox{
  float: left;
}
@media(max-width: 768px) {
  .boxbox{
    float: none;
  }
}
```
プレイングマネジャー入門

『効率よく結果を出す！プレイングマネジャー入門』の読書メモです。

## プレイングマネジャーとは？ 
自分の仕事があるのに、部下や後輩の面倒も見なくてはならない「プレイヤー」と「マネジャー」２つの役割をこなす立場の人。

## プレイングマネジャーが効率よく結果を出すために必要なもの 
- [リーダーシップ](#リーダーシップ)
- [コミュニケーション](#2.人間関係を円滑にする「コミュニケーション」)
- [マネジメント](#マネジメント)
- [プレイヤー](#効率よく自分の結果を出すスキル)
- [チーム](#チーム作り)

##<a name ="リーダーシップ">1.「リーダーシップ」を身につけるために</a>
- 自分が果たすべき役割や責任を認知する   
　プレイヤーとしてのスポットライト：個人で実績を上げたとき  
　マネジャーのスポットライト：チームの実績が上がり会社に認められたとき
- 人格を磨いて最大限の成果を上げる  
　　　プレイヤー：成果 = 能力 + 人格 (人格が0でも能力さえあれば成果は上げられる)  
　　　マネジャー：成果 = 能力 × 人格 (どんなに高い能力でも人格が0ならば成果も0になる) 
- 笑顔で相手の目を見て、常に心のドアを開いておく  
- 実力を見せつけて自分の言動に説得力を持たせる
- 常に部下の数×2の目で見られている  
　　　一人の部下の後ろには、常に部下全員が控えている
- オンとオフの自分を管理する
- 良きメンターを持って人間的魅力に磨きをかける
- どれだけ忙しくても隙間時間で勉強する
- 本やセミナーで得た知識は咀嚼しないと役に立たない  
　　　自分の言葉で説明できなければ、本当に理解しているとは言えない
- グローバル化に備え多様性を身につける  
　　　たとえ理解しがたい相手でも、無視をしたり、偏見を持ったりせず、とにかくコミュニケーションしてみることが大切
- 自分なりに部下とコミュニケーションする
- 赤信号は渡らない

<a name = "コミュニケーション"></a>
##2.人間関係を円滑にする「コミュニケーション」
- 部下との対話を増やしてコミュニケーションギャップを埋める
- 「聞く」から「聴く」へ
- チーム内のコミュニケーションを活性化させる  
　　　メラビアンの法則：話し手が与える要素は「言語」「聴覚」「視覚」があり、それぞれのメッセージ伝達度は視覚が55%、聴覚が38%、言語は7%→言語だけのメールで、自分の思いや考えを正確に伝えるのは至難の業
- 「文書+対話」が相手の理解度を高める
- 上司の期待値はいつも確認する  
　　　どんなにすり合わせても、ズレがゼロになることはない
- 自分の考え方と会社の方針が合わない時は、会社の決定に納得することを前提に咀嚼すること
- 伝えるべきことはしつこく言い続ける
- 「言語」はときに暴力となることを知る
- 部下と共通の価値観を作る

## <a name = "マネジメント">3.部下を成長させる「マネジメント」</a>
- 部下それぞれに個別の育成シートを使う  
　　　部下と一人ずつ面談し、今の仕事内容は何か、どんな能力・短所・強みを持っているのか、目標としていることは何か、その目標を達成するのにあたってどんな能力をいつまでに身につけなくてはいけないかなどを聞き出し、一枚のシートにまとめる
- 部下に言ってはいけない一言は、「私にもできたのだから。君にも絶対にできるよ」  
　　　ミスをした部下には「どうすれば、うまくいったと思う？」という聞き方をすること   
　　　自分の普通と部下の普通は番うことを理解すること  
- 「褒める」と「叱る」の絶妙なバランスを取ること
- 部下の多様性を引き出す
- 部下に予測力をつけさせる
- メッセージを送り続ける  
　　　「今頑張ることは将来の自分のため」といメッセージを送り続けること
- 部下との時間を減らさない
- 自分の仕事をなくすこと
- 人材教育こそ、プレイングマネジャーの醍醐味

## <a name = "プレイヤー">4.プレイヤーとして「効率よく自分の結果を出す」方法</a>
- 周囲の人の協力を得て効率よく実績を上げる
- 上司をうまく利用してプレイヤーの時間を確保しよう
- うまく時間割を作成すれば無駄な時間は激減する
- 自分で時間をコントロールする
- アウトプットを前提とする
- 部下への安易な残業依頼はありえない
- メモの効果を最大限に発揮する
- メール処理は時間を決める
- 部下に権限を委譲する
- 思いついたらすぐ行動
- 本番２割、準備８割
- ゴールとプロセスをイメージして、仕事をデザインする
- たまに思考をストップする

## <a name = "チーム">5.最強の「チーム」の作り方</a>
- 各自の仕事にレバレッジを掛ければチームの成果が上がりやすい
- 成功の方程式を共有する
- 情報をオープンにし、信頼関係を強くする
- 情報は「得る」「整理する」「確認する」
- チームの短所、長所を分析する
- 仕事を楽しませればモチベーションが上がる
- 「目標」だけでなく「目的」をきちんと伝える
- 上手なカップリングを活用する
- 勇気ある決断が部下と会社を成長させる
- 才能とは、脳に埋め込まれた情報の数
- 下した判断が本当に正しいか自問自答しよう

## プレイングマネジャーはマネジャーへの登竜門にすぎない
- 社会人になったら人生を大局的に見よう
- 今の立場に立ち続けることは不可能
- 一歩先に進まなければ「後退」が待っている
- マネジャーを目指してみよう
- 「どうせやるなら」は魔法の言葉
RecyclerViewに区切り線を入れる


ListViewには標準でDividerあったんですがRecyclerViewにはないので、簡単につける方法

JAVAの場合

```MainActivity.java
RecyclerView.ItemDecoration itemDecoration =
        new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(itemDecoration);
```

Kotlinの場合

```MainActivity.kt
        val itemDecoration = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
        recyclerView.addItemDecoration(itemDecoration)
```

現場からは以上です。
RaspberryPi3でubuntu16.04立ち上げ

すでに世の中に記事と本が溢れているので、それを参考にRaspberry Pi3でubuntuを立ち上げて、ROSを動かして遊んでみようと思います。今回はイメージ書き込みから無線設定まで。まぁ、要するに自分用の備忘録です。。。そのうち整理。

#インストール
- SDカードにイメージ書き込み
 
```
$ time xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd bs=1MB of=/dev/mmcblk0
```

- dd書き込み途中の進捗を見る

```
$ sudo killall -USR1 dd
```

- 失敗したらfdiskでパーティションを消して再トライ（pでパーティション確認、dで削除）。mkfsのフォーマットはいらんと思うけど一応

```
$ sudo fdisk /dev/mmcblk0
$ sudo mkfs.vfat -v -c -F 32 /dev/mmcblk0
```

- windowsの場合
    - イメージの解凍
        - 7-zip
    - SDフォーマッター
        - SD_Cardformatter
    - イメージの書き込み
        - win32 disk imager

#無線LAN設定
- /etc/network/interfacesに有線を無効にして無線を有効にするための設定を記載

```
#source /etc/network/interfaces.d/*.cfg

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wifi.conf
wireless-power off

※wifi.confの名前はなんでもいい
```
- 次にwpa_supplicantのインストールとwifi.confの作成、そしてwlan0の起動

```
$ sudo -s
# apt install wpasupplicant
# wpa_passphrase ssid key > /etc/wpa_supplicant/wifi.conf
# apt install wireless-tools
# ifup wlan0

※ssidとkeyは自分ので
```

クロスビルド環境作らないとなー。。。

#トラブル
## その１ ログインできない
なぜか初回ログイン時にパスワード変更を求められた後、新規パスワードを入力すると落ちる現象が発生。
仕方ないので、cmdline.txtを開いてファイルの最後にinit=/bin/shと書き、再起動。
その後、

```
# mount -rw -o remount /
# passwd ubuntu
# sync
# exec /sbin/init
```
で無事起動。しかしなぜこの現象になるのかわからない。無事動いているのだろうか。。。

## その2 apt upgradeの禁止
勝手にアップデートされるとハマるので、

```
$ emacs /etc/apt/apt.conf.d/20auto-upgrades
で、下記のように変更
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
```

## その３ sudo: unable to resolve hostが出る

```
$ sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```
apache2.2から2.4へのアップグレード時にmod_rewriteでハマった

apache2.2から2.4へアップグレードするときに、mod_rewriteの動作に違うところがあって、はまりました。

# 問題概要

以下がapache2.2での簡単な動作環境の概要図です。
内部サーバにプロキシしており、/へのアクセスをすべて/data/以下に集めています。

![apache2.2.PNG](https://qiita-image-store.s3.amazonaws.com/0/71987/1c36985a-7b67-afa1-3349-968a2339c950.png)

.htaccessに以下の内容で記載しています。

```apache
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*) http://server1.internal/data/$1 [L,P,QSA]
```

apache2.4では同じ設定で以下の動きになります。
![apache2.4.PNG](https://qiita-image-store.s3.amazonaws.com/0/71987/f9518b94-991e-af69-e226-e50e9463f736.png)

なぜか、proxy後にindex.htmlが付与されます。

パッと見、mod_dirが効いてしまっているようですが、apache2.2と2.4で動きが異なります。
2.4ではプロキシでrewriteするときに同時にindex.htmlが付与されてしまい、2.2ではついていませんでした。

# 対応策
先に結論を書きますと、以下の記述をすることで解決します。

```apache
DirectoryCheckHandler ON
```

これをapache2.4で記載すると上記の問題が解決します。

# 再現する環境について
apache2.4にて、mod_rewriteを設定してプロキシを行い、さらにmod_dirのモジュールがONになってDirectoryIndexに設定しているときに再現します。DirectoryIndexがindex.phpとかだったら/が/index.phpへリライトされます。

apache2.2から2.4にアップグレードしたときにこの動きになってしまっているようです。
>   *) mod_dir: Add DirectoryCheckHandler to allow a 2.2-like behavior, skipping 
>      execution when a handler is already set. PR53929. [Eric Covener]
> 
>   *) mod_dir: Don't search for a DirectoryIndex or DirectorySlash on a URL
>      that was just rewritten by mod_rewrite. PR53929. [Eric Covener]

引用元：https://www.apache.org/dist/httpd/CHANGES_2.4

まぁindex.htmlがつくのは良さそうな気もしますが。

他、tomcatとかでlocalhost:8080とかにプロキシするときにindex.htmlが勝手に付与されて見れなくなった、という現象が報告されてから急遽このオプションが追加されたっぽいです。
参考文献：https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1394403

apache2.2から2.4へアップグレードするときに念のために気を付けておいた方がよいですね。
使いどころがありそうで覚えていなかったCSSセレクタ

今までidやclassで解決できることが殆どでしたのであまりセレクタに関して覚えていなかったのですが、ライブラリ等で使用されていたCSSをみて、なるほどな的な使い方をしていたので気になって今更ながら確認してみました。

http://www.htmq.com/css3/index.shtml#sele

**リストに便利な隣接セレクタ**

リスト表示は以前は等間隔に幅を開ける際などはリンク先の
E:last-child
や
E:first-child
を用いたり、普通にクラスを設定して最初の要素だけor最後の要素だけに別のスタイルを当てていましたが

E + F
を使うと以下のような感じですっきり出来ることを今更ながら知りました。

flexboxが登場してから使いどころは少なくなってしまったかもしれませんが、覚えておきたいテクニックだと思いました。

```
<div>
  <ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>
```

```
div {
  width: 200px;
  background-color: black;
}
ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
}
li {
  display: block;
  height: 50px;
  background-color: blue;
}
li + li {
  margin-top:10px;
}
```

https://jsfiddle.net/qbr9e8zh/

**他には以下のものはよく見たり、使ったりと便利ですね。**

|セレクタ|意味|
|---|---|
| E[foo] | foo属性を持つE要素 |
| E[foo="bar"] | foo属性の値にbarを持つE要素 |
| E[foo^="bar"] | foo属性の値がbarで始まるE要素 |
| E[foo$="bar"] | foo属性の値がbarで終わるE要素 |
| E[foo*="bar"] | foo属性の値にbarを含むE要素 |


間接セレクタ（E ~ F）
使い方例
https://jsfiddle.net/y95xzLzL/
新人インフラエンジニアに伝えたい商用環境手順書作成指南書

今回この記事では商用環境で踏むべき手順を簡単にまとめられたら良いと思っています。

## 手順書の目的の整理
まずこの手順書で何をしたいのかを明確にするべきです。
apacheを構築したいではなく、apacheのmod_proxyの設定を変更したい。
それならhttpd.confの設定を変更し、00-base.confでモデュールを有効にする必要があるなどのtodoに落とし込めます。
だからまずは手順を作る目的を明確にしましょう。

## 手順書の前提条件を明記
この手順で必要となる前提条件を手順書に書きましょう。
例えば、root権限で実行しましょうであるとか、
他には特定のサーバで実行しましょうなどといった実行環境を特定するような条件を書きましょう。

## 作業編集後の確認方法の確立
単純なファイルであれば、設定値を変更した後でdiffをとれば問題はないです。
しかし、設定値が反映されたかどうかを確認できるコマンドがないかをいったん調べたうえでdiffのみなのか、
コマンドでも確認するのかを決めてください。
例えば、SELinuxだとgetenforceでSELinuxが有効になっているか無効になっているかが確認できます。
まずは設定ファイルの反映を確認できるコマンドがあるかないかを調べましょう。

## 手順書の具体的な記載内容
以上のことを踏まえて手順書を作っていきましょう。
格子としては以下の順に記載してあれば問題ないです。
[作業概要]-作業の目的
[前提条件]-作業環境の特定
[事前準備]-バックアップ、バックアップ確認、
[作業]-ファイルの編集、置き換え
[事後作業]-編集差分確認

今までの記載した内容を踏まえると、
自分だとこんな感じです。

```:作業概要
ipv6を無効にするために、
カーネルパラメータで設定を無効にする。
```

```:前提条件
rootユーザで実行すること。
webap01サーバで実施すること。
```

```:事前準備
id  -ユーザ確認
pwd -現在地確認
date  -作業実施日確認
uname -n  -ログインサーバ確認
mkdir -p /work/os -作業ディレクトリ作成
cp -p /etc/sysctl.conf /work/os/sysctl.conf_${date +"%Y%m%d"} -バックアップ取得 
ls -l /work/os/sysctl.conf_${date +"%Y%m%d"}  -バックアップ確認
cat /etc/sysctl.conf  -作業対象ファイルの中身確認
ls -l /etc/sysctl.conf  -作業対象ファイルの権限回りの確認
```



```:作業
sysctl -a | grep net.ipv6.conf.all.disable_ipv6 -現行の設定を確認
→net.ipv6.conf.all.disable_ipv6 = 0と出力されていること
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf -ファイル編集
sysctl -p -カーネルパラメータの反映
sysctl -a | grep net.ipv6.conf.all.disable_ipv6 -変更した設定が反映されているかを確認
→net.ipv6.conf.all.disable_ipv6 = 1と出力されていること
```

```:事後確認
cat /etc/sysctl.conf  -作業実施後ファイルの中身確認
ls -l /etc/sysctl.conf  -作業実施によるファイルの権限回りの変更がないか確認
diff /etc/sysctl.conf /work/os/sysctl.conf_${date +"%Y%m%d"} -変更点の確認
```

インフラエンジニアに成りたての方がいれば参考にしていただけると幸いです。
install google-cloud-sdk

## reference
- https://cloud.google.com/sdk/docs/quickstart-mac-os-x?hl=ja
- https://sdk.cloud.google.com/

## code
```bash
cd ~
_BASE_URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/"
_FILE_NAME="google-cloud-sdk-158.0.0-darwin-x86_64.tar.gz"
curl -o $_FILE_NAME $_BASE_URL$_FILE_NAME
tar zxfv $_FILE_NAME

export CLOUDSDK_PYTHON="$(which python2.7)"
./google-cloud-sdk/install.sh
```

```shell-session
To install or remove components at your current SDK version [158.0.0], run:
  $ gcloud components install COMPONENT_ID
  $ gcloud components remove COMPONENT_ID

To update your SDK installation to the latest version [168.0.0], run:
  $ gcloud components update
```

```bash
# google-cloud-sdk
export CLOUDSDK_PYTHON="$(which python2.7)"
# modified path and completion
# The next line updates PATH for the Google Cloud SDK.
if [ -f "$HOME/google-cloud-sdk/path.zsh.inc" ]; then
    source "$HOME/google-cloud-sdk/path.zsh.inc"
fi

# The next line enables shell command completion for gcloud.
if [ -f "$HOME/google-cloud-sdk/completion.zsh.inc" ]; then
    source "$HOME/google-cloud-sdk/completion.zsh.inc"
fi
```
開発時にのみlogを表示したい


`bool.fromEnvironment`および`--define`を使用する。

# 設定

https://api.dartlang.org/stable/1.24.2/dart-core/bool/bool.fromEnvironment.html

```dart
const bool isReleaseMode =
    const bool.fromEnvironment('releaseMode');
```

`pub serve`による開発時、およびデバッグビルド時はリリースモードは適用されない。

```bash
pub serve
```

```bash
pub build --mode=debug
```

リリースビルド時のみこのオプションを適用する。

```bash
pub build --mode=relese --define releaseMode=true
```

https://webdev.dartlang.org/tools/dart2js#path-and-environment-options


## Logger

あとはこのようにloggerを作ってやればよい。

```dart
bool get isDebugMode => !isReleaseMode;

final Logger _logger = new Logger('CLIENT: ', isDebugMode);

class Logger {
  final logging.Logger _logger;

  factory Logger(String name, isDebugMode) {
    logging.Logger.root.level =
        isDebugMode ? logging.Level.ALL : logging.Level.WARNING;

    logging.Logger.root.onRecord.listen((logging.LogRecord rec) {
      print('${rec.level.name}: ${rec.time}: ${rec.message}');
    });
    return new Logger._(new logging.Logger(name));
  }
  Logger._(this._logger) {
    debug('Logger is enabled in debug mode.');
  }

  /// Use it for logging a debug message.
  void debug(message, [Object error, StackTrace stackTrace]) {
    _logger.fine(message, error, stackTrace);
  }
}
```

明示的にオプションを追加しないとデバッグログが流れないようにしたかったが、`pub serve`には`--define`オプションが無いので、リリースビルド時にのみこのフラグを追加する運用とした。

# やらないほうがいい方法

```dart
bool isDebugMode() {
  try {
    assert(false);
  } on AssertionError catch(_) {
    return true;
  }
  return false;
}
```

このようなassertionのなかばexploitな方法は迂遠な上にbuild方法によっては`--checked`オプションや`--enable-assert`オプション(https://github.com/dart-lang/sdk/commit/3b05eb95530b1684a3fbcc69bda1784db393b966) と組み合わせて運用する必要が出てきて複雑になるのでできればやらないほうがよいと思う。
https://github.com/dart-lang/sdk/issues/29601
x++ と ++x の違い。x=10; y=2; console.log(x++ - (x * y))の値は？

一瞬あれっ？ってなりました。

##**インクリメントとデクリメント**

**++**はインクリメント演算子。
```x++``` と ```x += 1``` は等しいです。

**--**はデクリメント演算子。
```X--``` と ```x -= 1``` は等しいです。

##**前置インクリメント（デクリメント）**

```JavaScript
let x = 10;
let y = ++x;

console.log(x);    // 11
console.log(y);    // 11
```

**x** に **1** だけ加算されたあと、 **y** に代入されます。
デクリメントも同様の処理順です。

##**後置インクリメント（デクリメント）**

```JavaScript
let x = 10;
let y = x++;

console.log(x);    // 11
console.log(y);    // 10
```

**y** に **x** の値が参照されたあと、 **x** に１が加算されます。
デクリメントも同様の処理順です。

## **x=10; y=2; console.log(x++ - (x * y))の値**

答えは **-12** となります。

**x++** を参照する際に **10** を取得します。
その後、**X** は **11** になり、 **x * y** は **11 * 2** となります。
結果、計算式は **10 - 11 * 2** となります。

後置インクリメントを使うと値は **-11** となります。

```JavaScript
let x = 10;
let y = 2;
console.log(++x - x * y);    // -11
```

## **参考**

- [**独習C#**](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E7%AC%AC3%E7%89%88-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B7%E3%83%AB%E3%83%88/product-reviews/4798122203)


ここまで読んでいただきありがとうございました。
はじめて機械学習を学ぶ -Microsoft Azure Machine Learning - 

AIのかじりはじめに今年参加したde:code2017で参加できなかった
畠山さんのセッション動画がわかりやすかったので、記録です。

https://channel9.msdn.com/events/de-code/2017/AI01?term=de%3Acode%20machine

合間に試してみたいと思います。
AIまっさかりなので、はやく何かのアプリに組み込んでみたいです！（意気込みだけかい！笑）

・・・先にAWSのAWSomedayに参加した報告もしたいとこです。
ネストされたListから特定のフィールドのListを作成する

Stream#flatMapを使用する。

```java
public class Foo {
    private List<Bar> bars;
    // getter/setter/constructor
}

public class Bar {
    private String piyo;
    // getter/setter/constructor
}
```

Fooリストから、ネストされたBarリストのフィールドpiyoのリストを作成する。

```java
List<Foo> fooList 
    = Arrays.asList(new Foo(Arrays.asList(new Bar("piyo1"), new Bar("piyo2"))),
                    new Foo(Arrays.asList(new Bar("piyo3"), new Bar("piyo4"))));

List<String> piyoList 
    = fooList.stream().flatMap(foo -> foo.getBars().stream())
                      .map(Bar::getPiyo).collect(Collectors.toList());

System.out.println(piyoList); // piyo1, piyo2, piyo3, piyo4
```
Unity Resourceファイルから読み込む際に親子関係を意識した読み込み備忘録

## ただmainStageObjの子どもとして、prefab前のtransform情報をもったまま読み込みメモ。

パッとでで来ないのでメモ。

mainStageObj
∟Fence(リソース名)

```GameManager.cs
 
GameObject collectionObj = (GameObject)Resources.Load("Prefabs/Hoge/GenerateDecoObj/" + Constant.GENERATE_DECO_OBJS[growthLvInt]); //as GameObject;

GameObject collectionObjInstance;
if (growthLvInt < 3)
{
    collectionObjInstance = (GameObject)GameObject.Instantiate(collectionObj, collectionObj.transform.position, collectionObj.transform.rotation);
}
else
{
    // 2以降はあて TODO
    // // -14f 〜　14f
    float randomX = (UnityEngine.Random.value * 1000f) - 500f;
    float randomY = 500f + (UnityEngine.Random.value * 300f);

    collectionObjInstance = (GameObject)GameObject.Instantiate(collectionObj, new Vector3(randomX, randomY, -6.65f), Quaternion.Euler(0.0f, 0.0f, 0.0f));

}


if(mainStageObj){

    collectionObjInstance.transform.parent = mainStageObj.gameObject.transform;

    // prefab化前の親子関係と同じ状態で、prefabの座標をそのまま使う。
    collectionObjInstance.transform.localPosition = collectionObj.transform.localPosition;
    collectionObjInstance.transform.localScale = collectionObj.transform.localScale;
}
```
.ebextensions の container_commands の挙動メモ

インスタンスにアプリケーション展開後、デプロイの度に実行される container_commands ですが、どのような環境下で実行されているのか気になったので実際にコマンドを叩いて確かめてみました。

## チェックに使った設定ファイル

```yaml:00_dump.config
container_commands:
  deploy_debug_dump:
    command: |
      id
      env
      pwd
```

尚、チェックに使った環境は以下です。

- デプロイ方式: All at once
- プラットフォーム: 64bit Amazon Linux 2017.03 v2.7.2 running Docker 17.03.1-ce

### `id` の結果:

```
uid=0(root) gid=0(root) groups=0(root)
```

`ec2-user` などではなく `root` として実行されるようですね。

### `env` の結果:

```
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
PWD=/var/app/current
SHLVL=1
HOME=/root
EB_IS_COMMAND_LEADER=true
_=/bin/env
```


`EB_IS_COMMAND_LEADER` が設定されてるのを確認できました。

container_command の属性値を `leader_only: true` とした場合、複数インスタンスにデプロイする場合であっても Beanstalk によって選択された単一のインスタンス (＝リーダー) でしかコマンドが実行されませんが、その際のリーダーかどうかの判定に使用されている変数のようです。

自身がリーダーかどうかは `/opt/elasticbeanstalk/bin/leader-test.sh` のスクリプトでも判定可能です。

### `pwd` の結果:

`/var/app/current` になってました。デプロイするとこのディレクトリ以下にアプリケーションが展開されます。

## 残された疑問点

次の記事を読むと以下のように書かれています。

http://akiomik.hatenablog.jp/entry/2014/02/27/030608

> container_command実行時には `/var/app/ondeck` がワーキングディレクトリとなっています。
> ここはプロジェクトのzipが展開される準備用のディレクトリで、ここから `/var/app/current` にコピーされてデプロイが完了します。

この説明を読むと先の `pwd` の結果は `/var/app/ondeck` になるように読めるのですが、実際は `/var/app/current` になっていました。

ここらへんはデプロイ方式によって違ったりするのでしょうかね。

どちらにしてもデフォルトのワーキングディレクトリにアプリケーションが展開されていることは間違いなさそうなので、無理にワーキングディレクトリを変更せず相対パスで処理をしておくのが無難そうです。

## 関連

- [【AWS】Elastic Beanstalkのデプロイ時に docker exec する \- Qiita](http://qiita.com/ymm1x/items/9415e50c8c78418e17e7)
C#でAES暗号化をやってみる

# はじめに
C#でAES暗号化をやってみました。

コードだけを書いてもよかったのですが、暗号について何も知らないとコードの理解も進まないと思うので最低限の知識を書いておきます。
最終的には、AES-256（CBC）で暗号化するコードを書いています。

# コード
```C#
using System;
using System.Security.Cryptography;
using System.Text;

namespace AESSample
{
    class Program
    {
        /// <summary>
        /// 文字列をAESで暗号化
        /// </summary>
        /// <param name="text">暗号化したい文字列</param>
        /// <returns>Base64形式で暗号化された文字列</returns>
        private string Encrypt(string text)
        {
            // 初期化ベクトル            ----- (4)
            const string AesIV = @"<半角16文字（1byte=8bit, 8bit*16=128bit>";
            // 暗号化鍵
            const string AesKey = @"<半角32文字（8bit*32文字=256bit）>";

            // 暗号化方式はAES           ----- (1)
            AesManaged aes = new AesManaged();
            // 鍵の長さ                  ----- (2)
            aes.KeySize = 256;
            // ブロックサイズ（何文字単位で処理するか）
            aes.BlockSize = 128;
            // 暗号利用モード             ----- (3)
            aes.Mode = CipherMode.CBC;
            aes.IV = Encoding.UTF8.GetBytes(AesIV);
            aes.Key = Encoding.UTF8.GetBytes(AesKey);
            // パディング                 ----- (5)
            aes.Padding = PaddingMode.PKCS7;

            // 暗号化するためにはバイトの配列に変換する必要がある
            byte[] byteText = Encoding.UTF8.GetBytes(text);

            // 暗号化
            byte[] encryptText = aes.CreateEncryptor().TransformFinalBlock(byteText, 0, byteText.Length);

            // Base64形式（64種類の英数字で表現）で返す
            return Convert.ToBase64String(encryptText);
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            // 暗号化
            string encryptStr = p.Encrypt("Hello World!");

            Console.WriteLine("暗号化後の文字列:{0}", encryptStr);

            Console.ReadLine();
        }
    }
}

```

# 1．暗号化の方法
暗号化の方法にはいくつかのやり方があります。

- DES（非推奨）
- AES

DESは古いやり方で現在は非推奨だそうです。今回はAESで暗号化します。

## 2．鍵長
AESにもいくつかのバリエーションがあります。まず、鍵長によって違いが出てきます。
鍵とはパスワードのようなものですね。で、鍵長はその長さ（bit数）になります。長ければ長いほど安全ですが、その分計算量が多くなってしまいます。

鍵長はどんな長さでもよいわけではなく、次の3つから選ぶことになります。

- 128bit(AES-128)
- 192bit(AES-192)
- 256bit(AES-256)

## 3．暗号利用モード
AESは入力の文字列などを一定の長さに区切ったブロックごとに処理します。その処理のやり方を暗号利用モードといいます。CBCが一般的で、ECBは非推奨だそうです。

- ECB（非推奨）
- CBC

## 4．初期化ベクトル
暗号利用モードのCBCでは、ブロックごとの処理において1つ前の処理結果を利用します。しかし、一番最初は前の結果がないため、このときに代用する値を初期化ベクトルといいます。

## 5．パディング
AESでは入力を一定の長さのブロックごとに処理していきます。すると、最後のブロックの長さに対して入力が足りなくなってしまうことがあります。この余った部分を埋める方法がパディングです。

 - PKCS7
 - PKCS5
【jQuery】AutoComplete機能の実装手順【Java/Spring】


### まず以下を読み込む
```
<link type="text/css" rel="stylesheet"
  href="http://code.jquery.com/ui/1.10.3/themes/cupertino/jquery-ui.min.css" />
<script type="text/javascript"
  src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript"
  src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
```

## サンプルコード
```JavaScript:autocomplete.js
$(function(){
	/** プロジェクト名が変更になっても修正が必要なくなるよう実装**/
	var pathname = location.pathname.split("/")[1];
	
	$.ajax({
        /** オートコンプリート用のリストを取得するURL*/
        url: "/" + pathname + "/getAutoComplete",
        dataType: "json",
        type: 'GET'
	}).then(function(searchResult){ /** 検索結果のリストは引数に自動で入る*/
		$('.txtKeywd').autocomplete({ /** 実装したい入力欄のid/classを指定*/
			source : searchResult, /** 候補リスト(必須)*/
			autoFocus: true, /**リスト表示に際してリスト先頭にフォーカスするか*/
		    delay: 500, /**キー入力からリスト表示までの遅延時間（ミリ秒）*/
		    minLength: 1 /**オートコンプリート機能が働く最小文字数*/
		});
		},function(){
	});
});
```

```Java:GetAutoCompleteController.java
import net.arnx.jsonic.JSON;

/** 商品検索フォームのオートコンプリート用コントローラ. */
@Controller
@RequestMapping("/getAutoComplete")
public class GetAutoCompleteController {
	
    /** 全商品名をオートコンプリートに渡す. */
	@ResponseBody
	@RequestMapping
	public String getAutoComplete(){
		List<String> nameList = getAutoCompleteService.getAllNameList();
        return JSON.encode(nameList);
	}
}
```
##注意点
- JSONのエンコーダはJSONICを使用していますので、dependencyタグはコチラから入手してpom.xmlに追加
https://mvnrepository.com/artifact/net.arnx/jsonic

- JSON.encode()に何を渡すか
ドメイン:オブジェクトを渡すとフィールド名をキーとするマップ(連想配列)をjsのsarchResultに渡す)
リストオブジェクト:リストをそのままjsのsarchResultに渡す)

##参考
- AutocompleteをjQueryのAutocomponentで実現
http://qiita.com/yu_0105/items/20c4f52e71020af42e7b

- JQUERY オートコンプリート・入力補完インタフェースまとめ
http://blog.lowaivill.com/ui/jquery-autocomplete/



autoFocus: 候補メニューの最初の候補に自動フォーカス
delay: 入力されて検索実行までのディレイ時間
minLength: 候補表示するための最低の入力文字数

その他のオプションについては、以下を参考。
[Autocomplete Widget | jQuery UI API Documentation](https://api.jqueryui.com/autocomplete/)
pip installでUnicodeDecodeErrorが出た時の対処法

# はじめに

最近pythonを使い始めました。
その際、 `pip install` を実行した際にエラーが出たので、対処法を書きます。

# 環境

* Windows 8.1
* Python 2.7.13

# 対処法

`C:\Python27\Lib\site-packages` に以下のファイルを追加します。

```py:sitecustomize.py
import sys
sys.setdefaultencoding('shift-jis')
```

ディレクトリは環境に合わせて変更してください。
これでうまく動作するはずです。
git log をGUIのクライアントみたくする

# Gitのlogをみやすくする。

 下記を追記

```~/.gitconfig 
[alias]
    tr = log --graph --pretty='format:%C(yellow)%h%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset'
```

![スクリーンショット 2017-09-04 20.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/31394/55205be6-796b-8dbe-777b-aa6e1d609dea.png)

下記引用
http://memo.sugyan.com/entry/20111103/1320247493