OmniAICreator/Qiita-1.07M huggingface dataset:
Capybara/Poltergeistを使ってスクレイピング

# Poltergeistとは？
Capybaraさんのドライバーの一つです。
他にもselenium, rack-test（デフォルトのドライバー）などがあります。rack-testは高速ですが、JSに対応してなかったり、seleniumはJSに対応してるがヘッドレスではないため処理が遅かったりと、それぞれ一長一短です。

# 手順１：　Gemのインストール
capybaraとpoltergeistをインストールします。

```
gem 'capybara'
gem 'poltergeist'
```
`bundle install`

# 手順２：　Phantomjsのインストール
各自の環境に応じて行ってください。僕はDockerを使っているので、Dockerfileに設定を書きました。phantomjsのgemもあるんですが、直接入れるのはおすすめしません。

# 手順３：　ドライバーの設定
config/initializers以下にcapybara用のファイルを作成し、poltergeistをドライバーとして登録する。

＜例＞

```ruby
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, js_errors: false)
end
Capybara.default_driver = :poltergeist
Capybara.javascript_driver = :poltergeist
Capybara.run_server = false
Capybara.default_selector = :xpath
```

設定は各自好みに行ってください。詳細は以下リンクに載ってます。
https://github.com/jnicklas/capybara

# 手順５：　確認
コンソールから確認します。
capybaraのsessionはデフォルトでpageとなっています。(知らないと割と混乱するかも)
そこらへんの設定も各自で行ってください。

```
pry(main)> page 
=> #<Capybara::Session>
pry(main)> url = 'hoge.com'
=> 'hoge.com'
pry(main)> page.visit(url) # ここからは適切なメソッドを使ってhoge.comのあらゆる情報を取得できます
=> {"status"=>"success"}
pry(main)> page.title # タイトルを取得
pry(main)> page.text # コンテンツを取得
pry(main)> Nokogiri.parse(page.body) # こんな感じで鋸使ってパースしたりもできます。
```

# 結論

スクレイピングってなんかグレーな機能ですよね笑
各自の責任でやってみてください。capybara/poltegeist優秀ですよ。
VimでEmmetを使えるようにする

#NeoBunbleとemmet-vimのインストール
※尚、NeoBundleは非推奨となったようです。

##NeoBundleをインストール
```zsh
# 配置先のディレクトリを作成する
mkdir -p ~/.vim/bundle
cd ~/.vim/bundle

# NeoBundleをgitHubのリポジトリから取得する
git clone git://github.com/Shougo/neobundle.vim

# emmet-vimをgitHubのリポジトリから取得する
git clone https://github.com/mattn/emmet-vim.git 
```
###vimの設定ファイル~/.vimrcを作成
```vim
" Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif

filetype off

if has('vim_starting')
  if &compatible
    set nocompatible               " Be iMproved
  endif

  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" originalrepos on github
NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
    \ 'windows' : 'make -f make_mingw32.mak',
    \ 'cygwin' : 'make -f make_cygwin.mak',
    \ 'mac' : 'make -f make_mac.mak',
    \ 'unix' : 'make -f make_unix.mak',
  \ },
\ }
NeoBundle 'VimClojure'
NeoBundle 'Shougo/vimshell'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'jpalardy/vim-slime'
NeoBundle 'scrooloose/syntastic'
NeoBundle 'Shougo/vimfiler.vim'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 't9md/vim-textmanip'

NeoBundle 'Shougo/unite.vim'
NeoBundle 'ujihisa/unite-colorscheme'
NeoBundle 'tomasr/molokai'
""NeoBundle 'https://bitbucket.org/kovisoft/slimv'

call neobundle#end()

filetype plugin indent on     " required!
filetype indent on
syntax on

NeoBundleCheck
```
###インストール用シェルファイルをダウンロードし、実行
```zsh
$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
$ sh ./install.sh
$ rm -rf install.sh
```

##Emmetをインストール
###設定を追記
下記を~/.vimrc `call neobundle#end()` より上に追加

```vim:~/.vimrc
NeoBundle 'mattn/emmet-vim'
# 実行時のキーバインド変更する場合（ここではYからEに変更）
let g:user_emmet_leader_key = '<C-E>'
```
###プラグインをインストール
vim上で `:NeoBundleInstall`

>[VimへのNeoBundleのインストール(2015/09/21版)](http://qiita.com/poad1010/items/de16d9a1af78687c87cf)
[VimにEmmet導入して爆速HTMLコーディング](http://qiita.com/muran001/items/9ce24525b3285678acc3#_reference-40b0d0acaadaf3480d52)
ansible オプションメモ

#ansible-playbook のオプション
## sudo のパスワードを確認
```
ansible-playbook --ask-become-pass main.yml
ansible-playbook --ask-sudo-pass main.yml #when using sudo instead of become
```

#playbook で使う
##Hosts and Users
`hosts`でホストやグループを指定、`remote_user`でリモートユーザを指定.
指定には[パターン](https://docs.ansible.com/ansible/intro_patterns.html)が使える.

```
---
- hosts: webservers
  remote_user: root
```
`remote_user` はversion 1.4 からtask でも指定できる.


#taskで使う
##register
モジュールの出力を変数に格納する

```
- name: hogehoge
  yum: name=vim state=latest
  register: ret
```

##failed_when
ansible では終了ステータスが0以外のものをエラーとして解釈する.
failed_when はこれを変更し、エラーとなる条件式をユーザが指定できるようにする.

```
- name: hogehoge
  yum: name=emacs state=latest
  register: ret
  failed_when: ret not in [0, 1]
```

##ignore_errors
エラーが起きても停止しない

```
- shell: cat /
  ignore_errors: True
```

#Ref
- [ansible のshell で冪等性を保つ](http://sisidovski.hatenablog.com/entry/2015/01/27/033933)
PagingMenuControllerでメニューを動的に生成する


[kitasuke/PagingMenuController](https://github.com/kitasuke/PagingMenuController)
Swift 2.2
PageMenuController 1.1.2

SmartNews風にスワイプしてページ切替をするメニューUIを提供しているiOSライブラリ`PagingMenuController`を`0.7.9`から`1.1.2`にupdateしたら、APIのインタフェースが随分変わっていた。（`1.0.0`からプロトコル指向になった模様）
あらかじめ表示するメニュー項目が決まっている場合は、公式のサンプルコード通りに書けばよいのだが、
動的にメニューとページ/ビューコントローラを生成したかったため、カスタマイズ用のプロトコルに手を加え、以下のようにした。

## カスタマイズ用プロトコル
```swift
private struct PagingMenuOptions: PagingMenuControllerCustomizable {
    private var componentType: ComponentType {
        return .All(menuOptions: MenuOptions(itemsOptions:itemsOptions), pagingControllers: pagingControllers)
    }
    
    private var itemsOptions :[MenuItemViewCustomizable] = []
    private var pagingControllers: [UIViewController] = []
    
    init(itemsOptions:[MenuItemViewCustomizable],pagingControllers: [UIViewController]) {
        self.itemsOptions = itemsOptions
        self.pagingControllers = pagingControllers
    }
    
    struct MenuOptions: MenuViewCustomizable {
        var itemsOptions: [MenuItemViewCustomizable] {
            return self.itemOptions
        }

        private var itemOptions :[MenuItemViewCustomizable] = []
        
        init(itemsOptions:[MenuItemViewCustomizable]){
            self.itemOptions = itemsOptions
        }
    }
    
    struct MenuItem: MenuItemViewCustomizable {
        private let title: String
        
        var displayMode: MenuItemDisplayMode {
            let title = MenuItemText(text: self.title)
            return .Text(title: title)
        }
        
        init(title: String) {
            self.title = title
        }
    }
}
```

## 呼び出し側
```swift
var controllers: [UIViewController] = []
var menuItems:[MenuItemViewCustomizable] = []

//First
let firstController = UIViewController()
menuItems.append(PagingMenuOptions.MenuItem(title:"First"))
controllers.append(firstController)

//Second
let secondController = UIViewController()
menuItems.append(PagingMenuOptions.MenuItem(title:"Second"))
controllers.append(secondController)

// pagingMenuController create
let options = PagingMenuOptions(itemsOptions:menuItems,pagingControllers: controllers)
let pagingMenuController = PagingMenuController(options: options)

self.addChildViewController(pagingMenuController)
self.view.addSubview(pagingMenuController.view)
pagingMenuController.didMoveToParentViewController(self)
```

バージョンが上がってプロトコル指向になったとのことだが、ライブラリの使い勝手的には前のバージョンの方が良かったと感じる。
そもそもプロトコル指向というものが、よくわかっていない。

## 参考
[Create menu dynamically #248](https://github.com/kitasuke/PagingMenuController/issues/248)
[Access pagingMenuController frame from child view #254](https://github.com/kitasuke/PagingMenuController/issues/254)
ISUCON6予選日程に参加して絶望してきた話



さらっと[Iikanji Speed Up Contest](http://isucon.net/)参加レポートです。タイトルの通り、予選落ちでございました。

さて、今回がISUCONデビュー戦だったわけなのですが。私は自社の方2名についていく形で参加しました。

普段の業務でコンフィグのカスタマイズをやる機会はないので色々手探りでの参加でした。極端な話、Linuxシステムの触り方から復習しなきゃいけないくらいの感じです。

# 前日までと当日の過ごし方

前日までは、過去問をちょろっといじりつつ過ごしていました。Vagrantやansibleの環境がありましたが、おとなしくAzureのテンプレートを流し込む対応で環境は揃えました。

やったことは、ひとまずLinux環境の触り方から復習からです。systemdや諸々コマンドラインツールの使い方をやりつつ、その後はアプリのコードを眺めたりNginxやMariaDBの設定を眺めたり...という感じです。

計測環境を整えるため、MackerelやDataDogも入れて使ってみたりしてました。結局使いませんでしたけどね。。。あとは[alp](http://papix.hatenablog.com/entry/2015/09/28/094310)や[pt-query-digest](https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html)の導入あたりも。

当日はというと、私は正直さほど働いてません。ミドルをちょいちょい見てた、という感じです。計測のための設定がコケて手間取ったりしていたので、そのへんも対応しつつでした。あとはログ集計してボトル箇所の特定とか。

メンバーは私ともう1名が東京で集合、あとの1名がリモート参加です。
自社がコミュニケーションツールに[Slack](https://slack.com/)を使っているので、本番のコミュニケーションも社用SlackのISUCONチャンネルにて行っていました。
平日と違って見るべきチャンネルは1つだけなので、非常に快適なSlackライフでした。

# 感想

歯が立たなかった、という表現が割と近い思いです。

クエリの最適化であったり、nginxやWSGI APサーバーまわりのチューニングであったり、もっとやれた部分はあったかなと思います。

あと、本筋と関係ない環境セットアップやトラブルシューティングに時間をとられすぎた感があります。一応ISUCON5でリハ的なことはしていたはずなのですが、まぁ本番は順調にいかないものだなと。その辺の手順はちゃんと入ってないとだめですね。

本業にリソースを集中させるための、「業務効率化／自動化」の重要性をISUCONの場で再認識しました。

# まとめ
ガチな人々のおそろしい大会と言う感じの印象だったので戦々恐々してましたが、非常に面白かったです。得るものもたくさんありました。足りない部分が見えましたし、来年はもっとできることを増やして是非参加しようと思います。

さくっとしたレポートなので今回はこのくらいで。

最後に、このようなすばらしい場を企画してくださった主催者、協賛各社様に感謝。
Purescript on Travis CI (as of Sept 2016)

# tl;dr

Use the Trusty beta build environment.

```yaml
language: node_js
sudo: required
dist: trusty
node_js: 6
install:
  - npm install -g bower purescript pulp
script:
  - npm install
  - bower install
  - npm test
```

Probably at some point you will run Purescript builds on Travis, and there doesn't seem to be much written on the internet about it. I found that if I didn't set up Travis correctly, I would end up with [10+ min build times](https://travis-ci.org/justinwoo/purescript-xstream/builds/160786861).

But by taking advantage of the [Trusty beta Build Environments](https://docs.travis-ci.com/user/trusty-ci-environment/), you can get fairly fast builds taking only [a little over a minute](https://travis-ci.org/justinwoo/purescript-xstream/builds/160812640). Just take the config above (swapping out `npm test` if you need) and add it as `.travis.yml` and you should be good to go.

Thanks to [Gary Burgess](https://twitter.com/gb_r) and [Christoph Hegemann](https://twitter.com/kritzcreek) for helping me look into this.
IntelliJ IDEAで作る、初めてのAdobe AIRアプリ

# はじめに

IntelliJ IDEAを使って、Hello Worldを表示するデスクトップアプリを作成します。
また、配布できるようにパッケージングするところまでの手順を書きます。

## 試した環境/バージョン

IntelliJ IDEA 2021.2.2 (Ultimate)
Windows 10
Apache Flex 4.16.1
Adobe AIR 32.0.0.116

# 事前準備

以下を実施していること

- [Apache FlexでAdobe AIRアプリを作るための環境作成（zipを利用する場合）](https://qiita.com/lune1122/items/67dc781aa66fb4391736)

IntelliJ IDEAに以下のプラグインをインストールしていること

- [Flash/Flex - IntelliJ IDEA Plugin | Marketplace](https://plugins.jetbrains.com/plugin/14508-flash-flex)

# Hello World アプリの作成、実行

## プロジェクト作成

まずは、IntelliJ IDEAでプロジェクトを作成する

IntelliJ IDEAを起動

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/8abf17d8-5532-3236-98ad-d29494b99577.png)

New Projectをクリック（既に起動していた場合は、File > New > Project...）

左側のリストにて、Flashをクリック

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/6aa11935-9613-a16d-14ae-956c1697ed96.png)

Target platformでDesktopを選択

Flex/AIR SDKの設定

- Flex/AIR SDKが[none]となっているので、「...」のボタンをクリック

- +をクリックして、Add Flex/AIR SDK...をクリック

- Flex SDKをインストールしたフォルダーを選択して、OKをクリック

- Flex SDKが認識されるので、OKをクリック

Nextをクリック

Project nameを入力し（今回はMyApplicationと入力した）、Finishをクリック

プロジェクトが作成される
![16-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/b4deff8f-262e-a0d1-338b-0692ff218e68.png)

以下のようなMain.mxmlが作成されている
（今回はこのMain.mxmlをそのまま使う）

```mxml:Main.mxml
<?xml version="1.0"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script><![CDATA[
        import mx.controls.Alert;
        ]]></fx:Script>
    <s:Button click="Alert.show('Hello, world')" label="Say Hello"/>
</s:WindowedApplication>
```

## アプリのデバッグ実行

Run > Debug 'MyApplication'

アプリが起動する

![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/2acacf26-c86d-9c1a-5e76-56f2aaf55f45.png)

# 配布できるようにパッケージング

Build > Package AIR Application...

Packageをクリック

outフォルダー配下にMain.airが作成される

## Adobe AIRを内包してパッケージングしたい場合

もし、Adobe AIRを内包してパッケージングしたい場合は以下

Build > Package AIR Application...

Desktop application packageでcaptive runtime bundleを選択して、Packageをクリック

outフォルダー配下にMainフォルダーが作成される

とりあえず今回はここまで
NCMBとMONACAを使ってアプリ開発（ログインしっぱなしにする）

# ログイン状態の継続
NCMBを利用したMONACAでのログインしっぱなしのソースをまとめる。
「セッショントークン」がめっちゃ重要なんだけど、そのへんよくわかってなかったので、先にセッショントークンをまとめる（今更何を？的な人は結論だけ読んでね）。

##結論：
以下の結論です。
1.「セッショントークン」が切れてなければ、「getCurrentUser」メソッドを呼び出せばOK
2.「セッショントークン」が切れてれば結局ログインし直す必要がある。
3.CurrentUserがなかったら、これもログインし直し。


##セッショントークンとは？　■用語まとめ

###セッションとは
- ある活動を継続している状態のこと。
- 「セッション（session）」は「議会」「会議」「集会」あるいはその「開催期間」といった意味の英単語
- ネット的には「通信状態が継続している」ということ
- セッションが切れる　→　通信状態が終了したってこと

###トークンとは
- そのときだけ有効になるパスワード
- ワンタイムパスワードとかの単語のほうがわかりやすいと思う。そんな感じっぽい。

###つまりセッショントークンとは？？
- 特定の時間だけ有効になるパスワードを発行し、通信OKな状態を継続すること


## NCMBのログイン管理とは
ログイン管理では、Userクラスのloginとlogoutで、特定のユーザーでのログインの状態を管理しているっぽいです。

### loginメソッドですること
- ncmb.User.loginメソッドを呼ぶと、「セッショントークン」を作って、該当ユーザー権限で通信可能とする。
- 同時にCurrentUserにログインしたUser情報を登録する

### logoutメソッドですること
- ncmb.User.logoutメソッドを呼ぶと、「セッショントークン」を消す。
- 同時にCurrentUserを消す（多分、メモリを開放するって言うほうが正確）

### じゃあ、logoutしないとずっとログインしっぱなしな感じ？→いや、セッション切れる
いいえ違います。アプリ再起動すると、セッションが切れます。

### セッションが切れたらどうしたらいいの？
セッションが切れたら以下の２つの方法で対応ができます。
１．ログインし直す
２．currentUser情報をもっていれば、それを使ってログインし直す。

### じゃあいっつも「currentUser」使えば良くない？　→　セッショントークンの「有効期限」を確認する必要がある。
カレントユーザーが作成されてから「２４時間*」経つと、「セッショントークン」が「無効化」されます。無効化されたセッショントークンを利用してログインしても、すでにそのトークンは破棄されているから繋げない的なエラーになり、通信ができなくなります。

**初期状態だと２４時間。アプリごとに設定を変更することが可能。*


その場合には、結局ログインし直して、セッショントークンを取得し直さないとNG。CurrentUserは使えません。それどころかCurrentUserがいるとじゃまなんで、logoutした方がいいですね（って書いたけど、動き見てたらログインし直したら上書くからしなくてもよさそうだけど）

### 「有効期限」はどうやって確認する？
CurrentUserがもっているセッショントークンが使えるかどうかは、接続したらわかる。

#### サンプルソース

```javascript:sample_loginを続ける
function checkCurrentUser(){
    var currentUser = ncmb.User.getCurrentUser();
    if (currentUser){
//    alert(JSON.stringify(currentUser));
        ncmb.User.fetch()
            .then(function(results){
//    alert("suc");
                console.log("currentUserName is " + currentUser.get("userName"));
            })
            .catch(function(err){
//    alert("err");
                ncmb.User.logout();
	    	    //このあとはログイン画面を表示とか
            });
    } else {
        //未ログインの場合はログイン画面を表示とか
    }
}
```

###つまり、「有効期間」を伸ばそう。
getCurrentUserでOK時間を伸ばせば、都度getCurrentUserを呼ぶことで自動ログインと同じ挙動になるはず。
![ニフティクラウドmobile_backend.png](https://qiita-image-store.s3.amazonaws.com/0/124604/0276fdb2-2d24-fde3-a246-87fb5c366b2a.png)


##もっかい結論：
ということで、以下の結論です。
1.「セッショントークン」が切れてなければ、「getCurrentUser」メソッドを呼び出せばOK
2.「セッショントークン」が切れてれば結局ログインし直す必要がある。
3.CurrentUserがなかったら、これもログインし直し。


##メモ
- CurrentUserには過去にログインした情報を保持している。
- ログイン先はncmbのinitにもっているので、他のアプリとCurrentUserがかぶることはない。
- 接続できなかったら、ローカルのセッショントークンを捨てる必要があるので、ログアウト処理する必要がある。

##絶対間違っている図解
間違っている場所を指摘してください＼(^o^)／

![User周りの話.png](https://qiita-image-store.s3.amazonaws.com/0/124604/834bfcfc-95a1-4af5-6dda-5a0baaf845c9.png)

多分、セッショントークンの言葉の使い方とcurrentUserの場所が理解間違っている気がする。

参考URL：
http://mb.cloud.nifty.com/doc/current/tutorial/exchange-user-management.html
http://mb.cloud.nifty.com/assets/sdk_doc/javascript/jsdoc/files/lib_user.js.html#l19
Raspberry Pi 3のOSインストールからSSH接続するまで

# はじめに

Raspberry Pi 3にOSをインストールして、PCからSSH接続するまで設定する。

# 環境

* Mac OS
* Raspberry Pi 3

# 購入

[Raspberry Pi Shop](https://raspberry-pi.ksyic.com/main/index)などで、Raspberry Pi本体と合わせて、必要な物品を購入する。

* Rapberry Pi 3 Model B
* USB電源アダプター 5V/2.5A
  * Raspberry Pi 3から消費電力が増えており、2.5A以上を出力できるものを用意する
* microSDHC
  * [動作確認されているもの](http://elinux.org/RPi_SD_cards#Working_.2F_Non-working_SD_cards)を用意する
* Piケース Official for Pi3
* Raspberry Piシリーズ用ヒートシンク セット

# OSインストール

[公式サイト](https://www.raspberrypi.org/documentation/installation/noobs.md)に従って進める。

1. OSインストールマネージャのNOOBSをダウンロードし、展開後のファイル群をmicroSDカードのルートに書き込む
2. microSDカードをRspberry Piに差し込み、起動する
3. 画面の指示に従い公式OSである[Raspbian](http://raspbian.org/)（Debianベース）をインストールする
4. ソフトウェアを最新化する。upgradeで15-30分程度要する。
    
    ```
    $ sudo apt-get update
    $ sudo apt-get upgrade
    ```

# WiFi設定
macアドレス制限、hidden ssid、WPA-PSK(TKIP)のWiFi環境でWiFiを設定する。

1. Raspberry PiのWiFi　macアドレスをWiFiルータのmacアドレス制限機能に登録する。
  * macアドレスは`$ ifconfig`で表示されるwlan0のアドレスを見る。
2. SSIDと[ハッシュ化したパスフレーズ](https://www.raspberrypi.org/forums/viewtopic.php?t=7984&p=96014)を設定ファイルに書き込む。
    * `$ sudo sh -c "wpa_passphrase [ssid] [passphrase] >> /etc/wpa_supplicant/wpa_supplicant.conf"`
3. hidden ssidに接続するため、`/etc/wpa_supplicant/wpa_supplicant.conf`を開いて、[scan_ssid=1を追記](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=83905)する。  
    
    ```:wpa_supplicant
    network={
        ssid=[ssid]
        psk=[hashed passphrase]
        scanssid=1
    }
    ```

4. LANケーブルを抜いて、[wlan0を再スタート](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md)する。
    * `$ sudo ifdown wlan0`, `$ sudo ifup wlan0`
    * または、Rapberry Piを再起動する。`$ sudo shutdown -r now`


# SSH設定
デフォルトでONになっているため、特段の設定は不要だが、OFFの場合は[公式サイト](https://www.raspberrypi.org/documentation/remote-access/ssh/)に従って下記の通り設定する。

1. `$ sudo raspi-config`
2. "9 Advanced Options"を選択
3. "A4 SSH"を選択
4. SSHを有効にするか聞いてくるのでYESにする

以上により`$ ifconfig wlan0`で表示されるWiFiインタフェースのIPアドレス宛にssh可能になる。
デフォルトのユーザ名、パスワードは以下。

* ユーザ名:    pi
* パスワード:    raspberry

# オプション1：ホスト名設定
 
MacのSSHクライアントからRaspberry PiのIPアドレスでなく、名称指定でSSHできるようにホスト名を設定する。

1. `$ sudo vim /private/etc/hosts`
2. `[IPアドレス]  [名称]`を追記する。

# オプション2：VNC接続設定

グラフィカルインタフェースを利用してリモートアクセスできるようにする。[公式サイト](https://www.raspberrypi.org/documentation/remote-access/vnc/)に従って進める。

1. TightVNCのインストール。
    * `$ sudo apt-get install tightvncserver`
2. TightVNCを起動する。接続用パスワードを聞かれるので設定する。
    * `$ tightvncserver`
3. MacのFinderメニュー[ 移動 ] - [ サーバへ接続 ]を選択し、サーバのアドレスに`vnc://192.168.1.7:5901`を入れて接続



# 参考

* [Raspberry Pi Documentation（公式）](https://www.raspberrypi.org/documentation/)
* [PRi SD cards](http://elinux.org/RPi_SD_cards#Working_.2F_Non-working_SD_cards)
texshopでクロネッカーのdelta記号を表示する


- alignを使う。
- align使うにはamsmath packageをuseする。

```
\usepackage{amsmath}

...



\begin{align}
\delta_{ij} \ =\ 
\begin{cases}
1 & (i=j) \\
0 & (i \neq j )
\end{cases}
\end{align}
```
VirtualBox 上に構築した CentOS の解像度を変える方法

#概要

VirtualBox 上に CentOS （CUI のみ）を構築したのですが、デフォルトでは解像度（ウィンドウサイズ）が小さい。

そこで、解像度を大きくしようと思ったのですが、思いの外、手間がかかったのでメモ。

#前提条件
- VirtualBox 5.0.26
- CentOS 7.2.1511
 - CUI のみをインストールした環境
 - GUI をインストールしていると、もっとシンプルで良い？（未検証）

#手順
##1. VirtualBox でやること

- CentOS を起動する
- [Devices] -> [Insert Guest Additions CD image...]
 - 光学ドライブ（仮想だけど）に VBoxGuestAdditions.iso が追加されます

##2. CentOS でやること

###2-1. インストール

- マウントする
 - VBoxGuestAdditions.iso を /mnt/cdrom にマウントします

 ```
 mkdir /mnt/cdrom
 mount /dev/cdrom /mnt/cdrom
 ```

- 依存パッケージをインストールする
 - kernel-devel は単に「kernel-devel」としても良いかもしれない（未検証）

 ```
 yum install bzip2
 yum install gcc
 yum install kernel-devel-3.10.0-327.el7.x86_64 
 ```

- インストールする

 ```
 sh /mnt/cdrom/VBoxLinuxAdditions.run
 ```

###2-2. 解像度変更

- /etc/default/grub を開く
 - 下記のようになっている箇所を探します
 
 ```
 GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
 ```

- vga 引数を追加します
 - 引数に指定する値は [英語版 Wikipedia](https://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Linux_video_mode_numbers) の表を参考にしてください
 - 例えば、800x600 にしたい場合は 771 （256 色）を指定してみるとか
 - 値を間違えても、再起動時にエラーになるだけで起動はするので安心してください（笑）


 ```
 GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet vga=771"
 ```


 
- 設定を反映します

 ```
 grub2-mkconfig -o /boot/grub2/grub.cfg
 ```

- 再起動します

 ```
 shutdown -r now
 ```

- 解像度が変わっているはずです

#参考リンク
- [【virtualbox】Guest Additionsインストール方法【centos】](http://mpweb.mobi/windows/guestadditions-centos.php)
- [VirtualBoxのGuestAdditionsをCUIでインストール](http://chulip.org/entry/20110320/1300613262)
- [CentOS 7 grub2とコンソール解像度変更方法](https://sorrelfolia.wordpress.com/2015/10/31/centos-7-grub2_and_console_resolution_setup/)
mjpg-streamerで動画をブラウザでみる


[RaspberryPiの初期設定](http://qiita.com/H-A-L/items/184bd0b379652d51b061)が終わったので、Webカメラをつないで監視カメラを作ってみた

# 環境
* RaspberryPi: RaspberryPi 3 Model B
* Webカメラ: Logitech C270

# 手順
## カメラの接続確認
1 カメラが接続されていることを確認する

```
$ lsusb
```

2 接続しているカメラの名前が表示されていることを確認

```
...
Bus 001 Device 004: ID 046d:c069 Logitech, Inc. M500 Laser Mouse
Bus 001 Device 007: ID 046d:0825 Logitech, Inc. Webcam C270  　　　←これ
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
...
```


## mjpg-streamerのインストール
1 必要なモジュールをインストール

```
$ sudo apt-get install -y subversion libjpeg-dev imagemagick
```

2 mjpg-streamerをダウンロード

```
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
```

3 makeを実行

```
$ cd mjpg-streamer/
$ make
```

## スクリプトの作成
1 ファイルを開く

```
$ vi start_stream.sh
```

2 設定ファイルを編集

```start_stream.sh
#!/bin/sh

PORT="8080"     #ポート
ID="user"       #ログインID
PW="passward"   #ログインパスワード
SIZE="640x480"  #画面サイズ
FRAMERATE="200" #フレームレート

./mjpg_streamer -i "./input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p $PORT -c $ID:$PW"
```

## 起動
1 スクリプトを実行

```
$ sudo sh start_stream.sh
```

2 ブラウザから http://RaspberryPIのIP:8080 を開く
3 スクリプトに記載したログインIDとパスワードを入力
4 Stream のページにカメラの映像が写っていたら成功


## 外部から見るための設定
### ファイヤーウォールの設定
1 ufw をインストール

```
$ sudo apt-get install ufw
``` 

2 ufwの設定

```
#全部シャットアウト
$ sudo ufw default deny 

#特定のIPからの22ポートアクセスは許可
$ sudo ufw allow proto tcp from 192.168.X.0/24 to any port 22  

#8080ポートへのアクセスは許可
$ sudo ufw allow 8080
```

3 ufwを起動

```
$ sudo ufw enable
```

4 設定の確認

```
$ sudo ufw status
```
```
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.X.0/24
8080                       ALLOW       Anywhere
8080                       ALLOW       Anywhere (v6)
```


#### コマンド集
* ステータス確認

```
$ sudo ufw status   #停止中:inactive 起動中:active
```

* 起動

```
$ sudo ufw enable
```

* 停止

```
$ sudo ufw disable
```

### ルータの設定
ルーターのポート変換で、外部に見えているIPアドレスと任意のポートをRaspberryPiに割り当てた固定のIPアドレスとポート8080を紐付ける
プロダクトオーナーにリファクタリングを承諾してもらう方法

# リファクタリングの難しさ

- 直接は顧客に価値を届けない
- 何を持って完了とするのか曖昧

# できること

## 普段からの共有

- 難しいと思っていること、躓いたポイント、解決したポイントは普段からPOに共有する
    - これが多いほど、シンパシーが生まれる
- 「いろいろ大変なんだね」と思わせる
- 後から違う話をしている最中に、「そういえばこんなこともあった」というような伝え方は心証がよくない

## 違う物事に例える

- 例えば、机の上の整理整頓ができていないと、仕事の効率が悪い
    - 同様にファイルの行数が多いだけで、効率は落ちる
    - あるべきものがあるべきところにないだけで、効率は落ちる
    - 色んな機能が一つのクラスにあると、効率は落ちる
    - 関数の行数が多いと、読みにくく、新しく入った人の理解が遅れる
    - コードを見れば、拡張する際にどこに何を置けばいいかわかるようなコードが理想
- ChatworkからSlackに移ったのは、ぶっちゃけオシャレだからでしょう？
    - コードも見た目が良くないと開発する気が失せる
- 単に、今後、こういうことをする際に毎回やらなくて済む、と具体的に伝えることも必要。その上で上記のような説得をすると効果が大きいかも

## 他の権威を利用する

- 例えば、フレームワーク導入など、自分で調べて説得することももちろん重要だが、ネットの記事などを見せると納得してくれる場合もある
- こういうやり方があるから、私達も導入してみましょう、のような紹介の仕方
    - もちろん記事を理解した上でやる
    - 記事を理解した上で、さらに私達の場合は〜なので、少し修正して〜のようにやればいいかもしれない、など、理解したアピールも重要

## 根回し

- 少なくとも開発者同士は結託しておきましょう

## 完了条件を明確にする

- 難しいときもある
- 小分けにできることはあるので、一度に一箇所だけやるようにする
- やってるうちにスコープを広げたくなるけど我慢

## やってみせる

- 実際にやってみせる
- POが開発に詳しくて、簡単に例示できる場合に使える
- きれいなコードに共感してもらえるかもしれない

## 本当に必要なのか

- 本当に意味のあるリファクタリングなのか、考える
    - もしかしたら本当に無意味かも
SlackのチャンネルIDをお手軽に取得する

Slack APIに使うチャンネルIDを取得するための正式な方法は「[Slack | APIに使う「チャンネルID」を取得する方法](http://qiita.com/Yinaura/items/bd28c7b9ef614696fb7e)」です。

ただSlackで今開いているチャンネル／ダイレクトメッセージのチャンネルIDを今すぐ知りたい場合は、HTMLのなかにある「チャンネルID」を下記javascriptをアドレスバーに入れてポップアップさせる、という手も。

```javascript
javascript:(function(){var e=document.querySelector("#star_container>button");alert(e.getAttribute("data-im-id")||e.getAttribute("data-channel-id"))})();
```
bookmarkletとしても保存してもよいでしょう。
\# ホスト名チェックなどは入れていませんが。
Android のフォントスタイルで迷いたくない

# Overview
フォントは `styles.xml` に切り出した方がいいというのは知っていたが、いつも自分で定義していた
[android-best-practices](https://github.com/futurice/android-best-practices/blob/master/translations/Japanese/README.ja.md)

MaterialDesign で既に定義されているものがあるので利用すると「ここのフォントサイズはどれにしよう」なんていう迷いが減ってよかった
[MaterialDesign Typograpy-styles](https://material.google.com/style/typography.html#typography-styles)

## dimens.xml
日本語は `Dense scripts` の箇所を参考に設定
他言語対応する場合は `dimens.xml` を言語ごとに設定したらいいですね

```xml:dimens.xml
    <dimen name="font_size_display4">112sp</dimen>
    <dimen name="font_size_display3">56sp</dimen>
    <dimen name="font_size_display2">45sp</dimen>
    <dimen name="font_size_display1">34sp</dimen>
    <dimen name="font_size_headline">24sp</dimen>
    <dimen name="font_size_title">21sp</dimen>
    <dimen name="font_size_subheading">17sp</dimen>
    <dimen name="font_size_body2">15sp</dimen>
    <dimen name="font_size_body1">15sp</dimen>
    <dimen name="font_size_caption">13sp</dimen>
    <dimen name="font_size_button">15sp</dimen>
```

## styles_text_view.xml

```xml:styles_text_view.xml
<resources>

    <style name="Display4">
        <item name="android:textSize">@dimen/font_size_display4</item>
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="Display3">
        <item name="android:textSize">@dimen/font_size_display3</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Display2">
        <item name="android:textSize">@dimen/font_size_display2</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Display1">
        <item name="android:textSize">@dimen/font_size_display1</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Headline">
        <item name="android:textSize">@dimen/font_size_headline</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Title">
        <item name="android:textSize">@dimen/font_size_title</item>
        <item name="android:fontFamily">sans-serif-medium</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="Subheading">
        <item name="android:textSize">@dimen/font_size_subheading</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Body2">
        <item name="android:textSize">@dimen/font_size_body2</item>
        <item name="android:fontFamily">sans-serif-medium</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="Body1">
        <item name="android:textSize">@dimen/font_size_body1</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Caption">
        <item name="android:textSize">@dimen/font_size_caption</item>
        <item name="android:fontFamily">sans-serif</item>
    </style>

    <style name="Button">
        <item name="android:textSize">@dimen/font_size_button</item>
        <item name="android:fontFamily">sans-serif-medium</item>
        <item name="android:textStyle">bold</item>
    </style>

</resources>

```
Java の標準入力で、最後に立ち止まってしまうあなたに

Java で標準入力の内容をループで雑に取り込もうとすると、書き方によってはなぜか最後に入力待ち状態で止まってしまうことがあります。

あれ、なんでなんだろう。

と、少し気になり `BufferedReader` を使ったときの止まるパターン、止まらないパターンを雑に調べてみました。

### 後記 :ambulance:   

記事投稿後にコメント欄に戴いた情報によると、これらの動作は Eclipse がもつコンソール・ドライバや OS に依存しているのでは、とのこと。

実はかなりのレアケースかもしれないので、ふーん、程度の心構えで捉えていただけると幸いです。

環境
----

- Java SE 8
  - JDK 1.8.0_91
- Eclipse 4.6.0 (Neon)
- Windows 7

参考サイト
----

- [BufferedReader (Java Platform SE 8 )](https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html)

サンプルデータ
----

### 最後に空行なし

```
1 行目
2 行目
3 行目
```

### 最後に空行あり

```
1 行目
2 行目
3 行目

```

止まる例
----

データの続きがあるかを気にせず、一旦標準入力の内容を取り込む。

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
		String line;

		while (null != (line = buffer.readLine())) {
			System.out.println(line);
		}
	}

}
```

### 「最後に空行なし」を流し込んだ場合

- 2 行目までを出力する
- 入力待ち状態になって止まる
  - Eclipse のコンソール上で Ctrl + z を使って入力終了を伝えても処理が進行しない

### 「最後に空行あり」を流し込んだ場合

- 3 行目までを出力する
- 入力待ち状態になって止まる
  - コンソール上で入力終了を伝えると、最後まで処理をおこなう

条件付きで止まらない例
----

`BufferReader#ready` で続きがあることを明示的に確認する。

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
	
		while (buffer.ready()) {
			String line = buffer.readLine();
			System.out.println(line);
		}
	}

}
```

### 「最後に空行なし」を流し込んだ場合

- 2 行目までを出力する
- 入力待ち状態になって止まる
  - コンソール上で入力終了を伝えると、最後まで処理をおこなう

### 「最後に空行あり」を流し込んだ場合

- 3 行目までを出力する
- 入力待ち状態にならずに正常に最後まで処理をおこなう

結論
----

- 流し込むデータは最後に空行をつける
- `BufferedReader#readLine` で標準入力を扱う場合、値を取り出すより前に `#ready` で続きのデータがあるかを確認した方がよい
  - 冷静に仕様を考えれば当たり前…
- そもそも、雑に取り込みたいのなら `#readLine` は使わない方がいいのかも？
(Powershell)ユーザーに文字列を入力させて、それを元に判定して処理分岐させるサンプル

* ユーザーに文字列を入力させて、それを元に判定して処理分岐させるサンプルです  


</br>

```ps1
# ユーザーから受け取った文字列ごとに、処理を分岐させます。

$MAIN = "〜の処理"

# ユーザーに入力をしてもらい、$inputに格納
$input = Read-Host "${MAIN}の処理を開始します。よろしいですか？(y/n)"

Write ↓
Write ↓

  # ユーザーの入力($input)結果から、処理を分岐
  switch ($input) {
    "y" {
        # y の場合の処理
        Write "${MAIN}を実行します"

          # コマンドをここに書く

        }

    "n" {
        # n の場合の処理
        Write "${MAIN}を中止します"
        sleep 5
        exit

        }

    default {
            # yでもnでもない場合の処理 ("default"は「上記の選択肢以外」という意味)
            Write "yでもnでもない文字が入力されました。${MAIN}を中止します"
            sleep 5
            exit

            }
  }

# yのとき、コマンドからの標準出力後に改行がない場合、改行
[System.Console]::WriteLine("")

Write ↓
Write ↓

# y のとき、コマンドの戻り値($lastexitcode)を判定($?にするときもある)
  switch ($lastexitcode) {
    "0" {
        Write "正常終了しました"

        }

    default {
        Write "失敗しました with ${lastexitcode}"

        }

  }


Write "この画面は20秒後に終了します"
sleep 20
exit

```
Bootstrap を導入時にエラーが出た件

非常にレベルの低い記事なんで、あまり参考にはならないかもしれませんが、もしかして自分みたいな初心者の役に立つかもと思ってメモ。

Ruby を本に沿って学習中。Bootstrap とかいう表示関連の何かの導入が上手くいかない。
（↑この書き方が既にヤバいだろw）

File to import not found or unreadable: *.

と出て来る。
どうも

@import "*";

としているところがエラーになっているようだ。
この書き方は本に載ってるのにエラーなの？
と思って散々ハマった。

結局は、その本のセクションで、main.scss というスタイルシートを作成するところで、スタイルシートの仕組みみたいなのをウダウダ説明していて、「そんなの知ってんだよ:unamused: 」とスルーしてソースを打ち込まなかったのが原因みたい。

つまり、なんでもいいので、インポートするスタイルシートがないとエラーになるみたい。

そういえば、@import ってスタイルシートをインポートするヤツだしな。それにしても、たかが表示関連でエラー停止するなんて、rails って騒ぎすぎだろう・・・。 :dizzy_face: 

それと、.scss という拡張子が .sccs とか間違ったり、相当イラつきました。 :unamused: 

バカバカしいと思っても、一応見てみるという謙虚な姿勢も大事なんですね。 :point_up: 


・・・・ケッ
低機能でポータブルなテンプレートエンジンが欲しい→そこでenvsubstですよ

Unixコマンドラインで動くテンプレートエンジンが欲しい、変数置換さえできれば良い、ということがたまにあります。たとえば、CI中にCIサーバ上にJSONファイルを作りたいが、一部の値は環境変数経由で動的に与えたい、なんてことがあるわけです。

m4を使うこともできなくはないですが、牛刀をもって何とかって奴ですよね（そもそもm4よく知らないし）。そこでenvsubstですよ。

envsubstはgettext付属のツールで、簡単な環境変数展開を行います。展開対象は`$FOO`と`${FOO}`の2パターンのみです。デフォルト値の指定（`${FOO-BAR}`）すら対応していません。

# 利用例

たとえばこんなファイルがあったときに

```json:descriptor.json.in
{
    "version": {
        "name": "${VERSION}",
        "released": "${DATE}",
        "vcs_tag": "${VERSION}"
    }
}
```

こんな風に実行すると

```
$ VERSION=trunk DATE=$(date +%Y-%m-%d) envsubst < descriptor.json.in > descriptor.json
```

こんな結果が得られます。

```descriptor.json
{
    "version": {
        "name": "trunk",
        "released": "2016-09-18",
        "vcs_tag": "trunk"
    }
}
```

簡単ですね！

# テンプレート中に変数展開したくない文字列を含んでいる場合

テンプレート中に未定義の変数があった場合は置換されずそのまま残ります。

逆に、テンプレートファイルに`$PATH`のような表現が含まれていてかつ変数展開せずに残したいような場合は、`envsubst`の第一引数で展開対象の変数を絞り込むことができます。

```
envsubst '$FOO $BAR $BAZ ...'
```

1引数しか受け取らない上に展開したい変数名を`$`つきで全列挙するという男前仕様なので、シングルクォートでクォーティングするのが良いでしょう。スペースは空けても空けなくても大丈夫です。

普通のテンプレートエンジンだと`$`のエスケープ方法を提供しそうな気がしますが、envsubstにはエスケープ文字という概念がそもそもありません。シンプルで良いですね。
OpenSSL(1.1.x)をインストールする（ソースからビルド）for RockyLinux 8.4

##概要
OpenSSLをあえて、ソースからコンパイルする方法をメモしておきます。
RockｙLinuxで動作か国をしていますが、AlmanLinuxやCentOSでも同じ方法でインストールが可能です。
今回はnginxなど他のソフトウェアからの互換性を保つため、あえて「openssl-1.1.11」を導入します。
なお、OpenSSL1.1.0は、「/usr/local/bin」や「/usr/local/lib64」などの標準ディレクトリ配下にモジュールが配置されますので、意図的にopenssldirを指定して「/usr/local/ssl」に配置します。

##ダウンロード先
ソースは、
https://www.openssl.org/source/
から、ダウンロード可能です。

## 検証環境バージョン
| ソフトウェア | バージョン |
|:-:|:-:|
|  OpenSSL | 1.1.1l  |
|  OS | RockyLinux 8.4  |

##インストール
```bash:ダウンロードからインストールまで
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar xvzf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
./config -fPIC shared --prefix=/usr/local/ssl
make
make install
```

##設定情報は、OS標準の物を利用する。

```:bash:
cd /usr/local/ssl
mv ssl ssl.def
ln -s /etc/pki/tls /usr/local/ssl/ssl
```

##ライブラリ参照追加設定
既存でrpmでライブラリが入っていると、既存のライブラリを参照することから、ld.so.confにライブラリを追加します。

```bash:参照先を追加
vi /etc/ld.so.conf
```

```bash:以下に追加
/usr/local/ssl/lib  #←これを追加
include ld.so.conf.d/*.conf
```

追加終了後は、反映

```bash:反映コマンド
ldconfig
```
※なにもシェルには表示されていませんが、反映されています。

##反映確認

```bash:反映確認
ldconfig -p | grep ssl
---
# ldconfig -p | grep ssl
libssl3.so (libc6,x86-64) => /lib64/libssl3.so
libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10
libssl.so.6 (libc6,x86-64) => /lib64/libssl.so.6
libssl.so.1.0.0 (libc6,x86-64) => /usr/local/ssl/lib/libssl.so.1.0.0  #<-これがあればOK
libssl.so (libc6,x86-64) => /usr/local/ssl/lib/libssl.so
libssl.so (libc6,x86-64) => /lib64/libssl.so
libevent_openssl-2.0.so.5 (libc6,x86-64) => /lib64/libevent_openssl-2.0.so.5
libcrypto.so.1.0.0 (libc6,x86-64) => /usr/local/ssl/lib/libcrypto.so.1.0.0
libcrypto.so (libc6,x86-64) => /usr/local/ssl/lib/libcrypto.so
```

##バージョン確認

```bash:バージョン確認方法
/usr/local/ssl/bin/openssl version
#結果
OpenSSL 1.1.1l  24 Aug 2021 (Library: OpenSSL 1.1.1g FIPS  21 Apr 2020)
```
Eclipse で標準入力を受け取って実行する

Paiza とかで Java の問題をやるとき、標準入力を受け取るためにわざわざ別にコンソールを開いて作業していました。

これ地味に面倒なんで Eclipse 単体で解決できないものかな、と思い調べてみたら見事にあったのでメモ。

ちなみに Eclipse 4.5 以降の機能のようです。

環境
----

- Eclipse 4.6.0 (Neon)
- Java

参考サイト
----

- [java - Redirect stdin from a file in eclipse - Stack Overflow](http://stackoverflow.com/questions/31234646/redirect-stdin-from-a-file-in-eclipse)

手順
----

### 前準備

以下のファイルを用意しておく。

- 標準入力を受け取る、実行可能なプログラム
- 標準入力に使うファイル

### 実行時コンフィグの設定

1. Run → Run Configurations
1. Java Application 下に設定を作成する
  - 存在しない場合は [New] ボタンを押すかダブルクリックで新規作成
  - 既に存在する場合はそれを選択
1. Common タブ を開く
1. Standard Input and Output 内の Input File を編集
  - [Wordspace] ボタンから先ほど標準入力用のファイルを選択
1. [Apply]
1. [Run]

以降、設定したファイルを自動で読み込んで、標準入力に流しながら実行するようになる。

サンプル
----

Eclipse のバージョンや設定によってうまく動作しないこともあるようなので、正常に動いた例を一応置いておく。

### Main クラス

- 受け取った標準入力の内容を丸ごとコンソールに出力する単純仕様

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
	    
		while (buffer.ready()) {
			String line = buffer.readLine();
			System.out.println(line);
		}
	}

}
```

### データ

- Paiza でよくある例
  - 1 行目がデータ本体の行数
      - ただし、上記のコードでは別に 1 行目とそれ以降の扱いに差はない
  - 最後は空行
- 保存先はどこでもいいと思う
  - 個人的には `{プロジェクト名}/src` 直下に置いている

~~~
2
1,2
6,5

~~~
【Android・Java】連続でセッターを記述できるようにする方法

Javaで自作クラスのインスタンスのパラメータを設定する時に、連続でセッターを呼ぶ場面があって、DialogFragmentみたいに連続でセッターを呼ぶにはどうすればいいのかなと思って、調べたメモ。

#普通のセッター

Android Studioのセッターの自動生成を利用すると

```Message.java
public class Message {

    private String mTitle;
    private String mContent;
    private String mAddress;

    public void setTitle(String title) {
        mTitle = title;
    }

    public void setContent(String content) {
        mContent = content;
    }


    public void setAddress(String address) {
        mAddress = address;
    }
}
```

これでセッターを呼ぶには

```
Message message = new Message();
message.setTitle("Hello");
message.setContent("How are you?");
message.setAddress("hoge@foobar.com");
.
.
.
```

何回もmessageを記述する必要があるので面倒。

目指す形はこんな感じ。

```
Message message = new Message();
message.setTitle("Hello")
        .setContent("How are you?")
        .setAddress("hoge@foobar.com")
        .setSender("John")
        .send();
```
#書き換えたセッター

どうやってるのかなと思って、いろんなライブラリのソースの見てみたら意外に簡単だった。

```Message.java
public class Message {
    private String mTitle;
    private String mContent;
    private String mAddress;

    public Message setTitle(String title) {
        mTitle = title;
        return this;
    }

    public Message setContent(String content) {
        mContent = content;
        return this;
    }

    public Message setAddress(String address) {
        mAddress = address;
        return this;
    }
}
```

よく考えれば当たり前だけど、戻り値を自分自身にすればできました。

#追記

@kidotaka さんのご指摘のようにBuilderパターンで実装する方法が定石のようでした。

```Message.java
public class Message {

    private String mTitle;
    private String mContent;
    private String mSender;
    private String mAddress;

    static class Builder {
        private Message message;

        public Builder() {
            message = new Message();
        }

        public Builder setTitle(String title) {
            message.setTitle(title);
            return this;
        }

        public Builder setContent(String content) {
            message.setContent(content);
            return this;
        }

        public Builder setSender(String sender) {
            message.setSender(sender);
            return this;
        }

        public Builder setAddress(String address) {
            message.setAddress(address);
            return this;
        }

        public Message build() {
            return message;
        }
    }
```

パラメータをセットする。

```
new Message.Builder()
        .setTitle("Hello")
        .setContent("How are you?")
        .setAddress("hoge@foobar.com")
        .setSender("John")
        .build();
```
【MySQL5.6】max_connections, open_table_cache の値が反映されない（my.cnfよりも小さくなってしまう）

# ■ 現象
### ● 1. my.cnf(my.ini)に設定値を書く

```:my.cnf
max_connections=500
table_open_cache=2000
```
### ● 2. mysqldを起動して値を見てみる

```sql:
mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 214   |
+-----------------+-------+
1 row in set (0.00 sec)
```
```sql:
mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 400   |
+------------------+-------+
1 row in set (0.00 sec)
```
なんじゃこりゃあああ
### ● 3. おもむろにエラーログをみてみる

```sql:
mysql> SHOW GLOBAL VARIABLES LIKE 'log_error';
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| log_error     | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.00 sec)

mysql> exit
Bye
```
↓

```
# less /var/log/mysqld.log | grep Warning
```

```:/var/log/mysqld.log
2016-09-18 18:19:25 6809 [Warning] Buffered warning: Changed limits: max_open_files: 1024 (requested 5000)
2016-09-18 18:19:25 6809 [Warning] Buffered warning: Changed limits: max_connections: 214 (requested 500)
2016-09-18 18:19:25 6809 [Warning] Buffered warning: Changed limits: table_open_cache: 400 (requested 2000)
```
ほわああああああああああ

# ■ 対処法
### ● 1. /etc/security/limits.confに以下の記述を追加する
```:/etc/security/limits.conf
mysql hard nofile 65535
mysql soft nofile 65535
```
### ● 2. /usr/lib/systemd/system/mysqld.serviceに以下の記述を追加する
```:/usr/lib/systemd/system/mysqld.service
LimitNOFILE=65535
```
### ● 3. サービスの再読み込みと起動を行う
```
# systemctl daemon-reload
# systemctl start mysqld
```
※上記例はCentOS7.2のコマンド
### ● 4. 値が反映されたか確認する
```sql:
SHOW GLOBAL VARIABLES LIKE 'max_connections';
```
```sql:
SHOW GLOBAL VARIABLES LIKE 'table_open_cache';
```

おわり！

# ■ 参考
http://stackoverflow.com/questions/32760202/buffered-warning-changed-limits-max-connections-214-requested-800
ありがとう神様
直線位置調整 + 距離計 > v0.8 > 距離計算式の追加

関連 http://qiita.com/7of9/items/e58040fbeb903c059e92

## 構成

- S-12駆動基板 (ESP8266実装)
  - http://qiita.com/7of9/items/93257105e64bb4724fa7 の基板に以下を追加
  - 3.3Vから5V昇圧回路実装
  - Daughter board用コネクタ実装
- GP2Y0A710K > Daughter board
  - http://qiita.com/7of9/items/f556cfc9b2a917c2abdb
- udpLogger
  - http://qiita.com/7of9/items/fe7dcdc846cd3b178632
  - UDP経由で上記基板の測定(電圧)を受信し、microSDに保存

## code v0.8

http://qiita.com/7of9/items/9ef44652fba1370fba43
において導出した電圧から距離(cm)への変換式を追加した。

[v0.8 @ github](https://github.com/yasokada/esp8266_160811_s12position/releases/tag/v0.8)

## 測定

140cmから50cmの範囲の測定をしてみた。

140cm近辺の値がきちんと出ていない。
距離はどんどん減っていくはずだが、途中で値が戻っている部分などもある。

電圧測定時にノイズを減らす方法を取っていないので、そのあたりが要改善点。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dd724ec9-c7e7-4842-e448-935c538e9593.png)

## code v0.9

測定部分変更。
7回測定し、min,maxを取り除いた平均とした。

[v0.9 @ github](https://github.com/yasokada/esp8266_160811_s12position/releases/tag/v0.9)

140cmから50cmの範囲の測定を行ったが、うまく測定できていない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/58fa8cdd-76eb-817a-ba23-a651f3b532a9.png)
初めてのiOSアプリ(Swift)で HelloWorld!

ログ及び画面にHelloWorldを表示した時のメモ

# 環境

+ XCode 8.0(インストール済み)


# プロジェクトを作成する

とりあえずアプリ用のプロジェクトを作成します。

+ XCodeを開く
+ Create a new XCode project を選択
+ テンプレートではiOS、SingleViewApplicationを選択
+ LanguageでSwiftを選択。また適当にProjectNameやOrganization Identifierなどを入力
+ プロジェクトを配置する任意のフォルダを選択

# 動かしてみる

とりあえず動かしてみます。
画面上部の再生ボタンを押すとビルド及びシュミレーターでのアプリの実行が確認できます。

![スクリーンショット 2016-09-18 17.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/20193/c6f34cc6-2e68-5495-e791-9775eefa033e.png "スクリーンショット 2016-09-18 17.39.11.png")

# ログを追加してみる

ログを追加してみます。
print関数を使います。

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        print("Hello World!")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```
無事ログとして`Hello World!`が表示されました。

# 画面に文字を表示する

[Swift言語によるiOSアプリ開発](http://www.dcom-web.co.jp/technology/swift1/)

先程ログを仕込んだ部分に以下を追記してラベルを追加してみます。

```ViewController.swift
        let label = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
        label.text = "Hello World!"
        self.view.addSubview(label)
```

無事表示されましたー。

![スクリーンショット 2016-09-18 17.51.32.png](https://qiita-image-store.s3.amazonaws.com/0/20193/d5e237a0-be77-f5d8-3fff-1e1b333d442e.png "スクリーンショット 2016-09-18 17.51.32.png")
BitbucketからGitLabに移行しました

いままで、ホスティングサービスとしてはBitbucketを使用していました。しかし、GitLabのほうが無料でもいろいろ高機能だということで、移行してみました。

# GitLabのいいところ
GitLabは今まで、ローカルサーバにインストールして使うもの、という印象が強かったです。しかし、クラウド上で利用できるGitLab.comが無料で利用できるようになったことで、より利用しやすくなったと思います。
もともとIssueやWikiの機能がある分、Bitbucketよりはチーム開発向けという印象が強いGitHubですが、公開リポジトリ限定ということがあったのでプロジェクトによっては使えない。それを非公開向けにしたのがGitLabというイメージですね(GitLabで公開プロジェクトにすることもできるようです)。

GitHubやBitBucketとの違い(無料プランのもの)

|        | GitLab | BitBucket | GitHub |
|:-------|:-------|:-------|:-------| 
|リポジトリ数| 無限 | 無限 | 無限 |
| 1リポジトリサイズ | 1GB | 2GB | 無限 |
| チーム人数 | 無限 | 5人 | 無限(公開) |

Bitbucketは昔は無制限だった気がするんですが、調べたら2GB以上だとプッシュできなくなるようです。
ただ、1GB以上になることは画像とかいっぱい入れない限りはそんなにないのではないかと思います。
個人的な用途で分けるなら、チームで開発するとき(非公開)はGitLab、個人開発やサンドボックスはBitbucket、公開するならGitHubって感じですかね。
まあ、GitLabとBitbucketは使い分けるよりどちらかに統一したほうがいい気もしますが。

# GitLabへの移行
移行はものすごく簡単でした。アカウントを作ってログイン後に、[New Project]でプロジェクト作成画面に行ったあと、Import project fromでBitbucketを選びます。すると、Bitbucketのほうの認証になるので、許可するとプロジェクト一覧が出てきます。プロジェクト一覧で移行したいもののImportボタンを押すだけでＯＫ。
かんたーん！

# Gitの設定
Import後のプロジェクトのTOPにURLがでてるので、それを使うように設定します。プロジェクトフォルダの.git/config内のurlを書き換えるだけでうまくいきました。個人設定で、パスワードやSSHキーの設定も忘れずに。
ちなみにurlを2つ併記するとBitbucketとGitLabの両方にプッシュすることも可能になります。

本当に20分くらいでimportからGitLabへのプッシュまで完了しました。簡単に移行が可能なのでGitLabを使ってみたい方は試してみてください。
Edu KotlinプラグインでKotlinの勉強をはじめてみる

# 概要

恥ずかしいことに全然Kotlinに手を付けられていません。
AndroidとKotlinとか言う前にKotlinの文法を知らないといろいろはじまりません。

良さそうな本が出ているのでそちらをおすすめしますが、
ちょっとおもしろそうな方法を見つけたのでシェアします。(常識だったらすみません。)

基本的にはこの動画のとおりです。
https://www.youtube.com/watch?feature=player_embedded&v=0ponbfQhESY

# 手順

## Intellij IDEAのインストール

まずここからIntelliJ IDEAダウンロードしてインストールしてください

https://www.jetbrains.com/idea/download/

## Edu Kotlinプラグインのインストール

インストールが終わったら起動したConfigure -> Plugins　-> Browse Repositoriesを開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/c4329909-47e4-978e-6293-e0b18d825263.png)

Edu Kotlinと入れて、出てきたプラグインをインストールします。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/e6ebf90f-627d-c735-49f5-7dfd99ee307c.png)

インストール後IntelliJを再起動します。

## プロジェクト作成

再起動後 Create new projectを選択し、Education -> Kotlin Koansを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/da4aca0a-5386-54e6-b025-36c508941547.png)
プロジェクト名を入れて次に進めます。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/65b5e763-19fa-666c-2adf-ccd69d66bc4a.png)

これでインストールとプロジェクト作成が完了です

## タスクを開く
プロジェクトが起動してくるので、やりたいタスクを選択します。するとコードが出ており、右に説明があります。
関数start()を作って"OK"を返してみましょうと言っています。
またTODO()はexceptionを投げさせるのに利用されるらしい。
といったことがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/57411b7b-a6d3-0c6a-305b-48d98397ffe0.png)

このメニューの左から回答をチェック、前のタスク、次のタスク、最初の状態に戻す、答えを表示となっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/7e184fb1-3ef7-77be-2393-120fa3287d1f.png)

正解ならこんな感じになります
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/8ff422df-4266-cf2a-d771-d940794069ee.png)

また1レベル終わるごとにツイートするかどうか表示されて、ツイートしてシェアしていけます！これでモチベーションを維持していきましょう！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Hey, I just completed level 1 of Kotlin Koans. <a href="https://t.co/fTxgnhQObJ">https://t.co/fTxgnhQObJ</a> <a href="https://twitter.com/hashtag/kotlinkoans?src=hash">#kotlinkoans</a> <a href="https://t.co/UqXSuWISOQ">pic.twitter.com/UqXSuWISOQ</a></p>&mdash; takahirom (@new_runnable) <a href="https://twitter.com/new_runnable/status/777743887544688640">2016年9月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
これで進めていって目指せKotlinプログラマです！
WebRTCハンズオン資料 INDEX

# はじめに

この資料は、 [WebRTC Beginners Tokyo](https://webrtc.connpass.com/
) が開催する、WebRTCハンズオン勉強会用の資料のINDEXです。

---

# 作者紹介

---

## がねこまさし（@massie_g）

- 仕事: インフォコム(株)の調査研究チーム
  - Webの新しい技術担当
  - WebRTC, WebGL, WebVR とか
- コミュニティ
  - WebRTC Meetup Tokyo 主催
  - WebRTC Beginners Tokyo 主催
  - HTML5Experts.jp コントリビューター

---

## @tnoho

- 仕事:
  - しがない通信会社の社員
  - WebRTCを使った大規模会議システムを作ってます
- コミュニティ
  - [Tech Night @ Shiodome](https://techsio.connpass.com/) 主催

---

## なかゆうすけ（@yusuke84）

- 仕事:
  - WebRTC Platform SkyWay
      - Developer Relations & Technical Solutions Engineer
  - Webメディア HTML5Experts.jp 運営
- コミュニティ
  - WebRTC Meetup Tokyo 主催
  - WebRTC Beginners Tokyo 主催

---

# WebRTC概要編

ハンズオンの前にWebRTCの概要を理解するための資料です。

- [資料 Qiita Slide](http://qiita.com/massie_g/items/916694413353a3293f73)

---

# ハンズオン Swift編

## 準備編

- [SwiftでWebRTC実装ハンズオン 事前準備編](http://qiita.com/tnoho/items/3b94371e59fe8ad6ce03)

## 本編

- [SwiftでWebRTC実装ハンズオン 本編](http://qiita.com/tnoho/items/f5afa3ba749eed9b9716)

---

# ハンズオン JavaScript編

## 準備編

- [資料 Qiita Slide](http://qiita.com/massie_g/items/6141a1020dd8bdf6574e)

## 本編

- [資料 Qiita Slide](http://qiita.com/yusuke84/items/43a20e3b6c78ae9a8f6c)

## MediaRecorder編（応用課題）

- [資料 Qiita Slide](http://qiita.com/massie_g/items/ecfc16018210441051b4)

## ScreenCapture ＆ マルチストリーム編（講義）

- [資料 Qiita Slide](https://qiita.com/massie_g/items/f852680b16c1b14cb9e8)

---

# 終わりに

- 本日のハンズオンに関して何か質問があれば @massie_g , @tnoho  , @yusuke84 までどうぞ！

---

# 参考

以下のイベントでハンズオンを実施しています。

- JavaScript編
  - [WebRTC Beginners Tokyo](https://webrtc.connpass.com/) 主催イベント
      - [2016/09/19 WebRTCハンズオン勉強会](https://webrtc.connpass.com/event/35114/)
      - [2017/04/09 初心者向け！WebRTCハンズオン](https://webrtc.connpass.com/event/50731/)

- Swift編
  - [Swift愛好会](https://love-swift.connpass.com/)、[WebRTC Beginners Tokyo](https://webrtc.connpass.com/) 合同開催イベント
      - [2017/06/18 SwiftでWebRTC実装ハンズオン with Swift愛好会](https://webrtc.connpass.com/event/56298/)
xamarinをmacでインストール後のサンプルコードでのビルドエラーについて

現象：インストール後のサンプルコードでビルドを実行するとエラになる。内容は以下
"Error executing task Codesign: Required property 'SigningKey' not set." 

やったこと：エラーの内容はxcode側でsignin identitiesの設定をしてくださいということだった。xcodeにAppleIDでサインイン後にshow detailsのsignin identities、
・iOS Development
・Mac Development
をcreateすることでエラーを取り除けた
[App Engine][google-oauth] デコレーター使えば万事解決ってホントですか

# App Engineはgoogle-oauthのクラス要らない

ってホントですか。。。
頑張ってOpenID Connectとか勉強してた。

>The easiest way to handle OAuth 2.0 is to use the App Engine Python decorators supplied by this library. These decorators handle all of the OAuth 2.0 steps without you having to use any Flow, Credentials, or Storage objects. 

というわけで、デコレーター使えばFlow, Credentials, Storageオブジェクトすら要らないという。
考えてみれば、App Engineのセキュリティ保護ってGoogleにおまかせしてるから
認証サーバーと変わらないんだよな。
認証サーバーと内部でつなげちゃっても問題ないわけだ。

コレ考えると、認証のために色々頑張ってるのが馬鹿らしくなるな。


デコレーターの挙動がある程度つかめたら追記します。
sudoするとSSHできない件

エージェントフォワードを有効にした状態で、とあるサーバ（A）にログインするとする。
次にサーバ（A)からサーバ（B）にsshで入るとする：

```
ssh root@server（B)
```

これは成功する。次にサーバ（A）において、sudoでrootになってからサーバ（B)にログインを試みると失敗する：

```
sudo bash
ssh root@server（B)
```

理由は、sudoがセキュリティ上の理由から元のユーザのenv情報を引き継がないため。

対策は次のようにする：

```
visudo
```

```Defaults    env_keep += SSH_AUTH_SOCK```を追加：

```
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
+ Defaults    env_keep += SSH_AUTH_SOCK
```