OmniAICreator/Qiita-1.07M huggingface dataset:
【Homebrew】旧バージョンのFormulaでbrew installする

普段Rubyで開発を行っているが、別言語の開発環境を一時的に作る必要があり、
その際に`brew upgrade`とかHomebrew周りのコマンドをたくさん打った。
その後、自分のRailsプロジェクトを弄ろうと思ったらこんなエラーが出た。

```
$ rails s

/Users/hogehoge/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0/gems/activesupport-4.1.9/lib/active_support/dependencies.rb:247:in `require': dlopen(/Users/hogehoge/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-16/2.1.0-static/charlock_holmes-0.7.3/charlock_holmes/charlock_holmes.bundle, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicudata.57.1.dylib (LoadError)
  Referenced from: /Users/hogehoge/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-16/2.1.0-static/charlock_holmes-0.7.3/charlock_holmes/charlock_holmes.bundle
  Reason: image not found - /Users/hogehoge/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-16/2.1.0-static/charlock_holmes-0.7.3/charlock_holmes/charlock_holmes.bundle
```


なんかLibrary not loadedでicu4cの57.1がないって言ってる。


とりあえず`brew info icu4c`で今のバージョンを見てみると、60.2が入っていた。
これをダウングレードすればいけそう...?

## 1.`brew log icu4c`で過去のコミットから辿れないか見てみる

```
commit d976c0e4f2d3b977f5b9d7cf5995af1d0f687859
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Fri Oct 27 14:52:45 2017 +0000

    icu4c: update 59.1_1 bottle.

```
59.1_1までしかコミットログがない。Homebrewの仕様で全部のコミットは取ってきていないらしい。
(https://github.com/Homebrew/install/pull/8)


## 2.Formulaのあるディレクトリに移動して過去のコミットを取得する

```
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
$ git fetch --unshallow
```

これでHomebrewの全コミットが取得できたので、目当てのバージョンのicu4cのコミットを探す。

## 3.必要なバージョンのコミットの状態にgit check outする

```
$ brew log icu4c --oneline | grep 57.1
$ git checkout <ハッシュ値> icu4c.rb
```

必要なバージョンのコミットのハッシュ値を手動でもgrepでもなんでも良いので取ってくる。
取れたら、そのハッシュ値を使って`git checkout`で欲しいバージョンのあるコミットの状態まで戻す。

## 4. 改めてbrew installする

今入っているバージョンのicu4cは必要ないのでアンインストールする。

```
$ brew uninstall icu4c
```

最新版を勝手にインストールされないように、オプションをつけて、icu4cを再インストールする。

```
$ HOMEBREW_NO_AUTO_UPDATE=1 brew install icu4c
```
インストール後、icu4cのバージョンを念のため確認

```

$ brew info icu4c
icu4c: stable 57.1, HEAD [keg-only]
```

57.1が入っている...!
その後`rails s`したらエラーなく起動ができました。
最後に`git reset HEAD`で巻き戻した分を元に戻してひとまず終了です。
Ruby補完 vimrc

# Vim でrubyの補完

vimでRubyの補完ができるようになりたいと考え、vimrc を作成してみた。

必要なもの

jdk
Rsence

上記2点が必要になります。

なのでインスト

 OSは　　centos６＊になります。

```bash
gem install rsense

```

jdkに関しては、各自いい感じで入れてください。

下記vimrc

```vimscript
syntax on
colorscheme molokai
set tabstop=4
set shiftwidth=4
set encoding=utf-8
set incsearch
set ignorecase
set smartcase
set hlsearch
set backspace=indent,eol,start
" コピペさん
set clipboard=unnamed,autoselect

if &term =~ "xterm"
	let &t_SI .= "\e[?2004h"
	let &t_EI .= "\e[?2004l"
	let &pastetoggle = "\e[201~"

	function XTermPasteBegin(ret)
		set paste
		return a:ret
	endfunction
	inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap [<Enter> []<Left><CR><ESC><S-o>
inoremap (<Enter> ()<Left><CR><ESC><S-o>

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/home/ami/.cache/dein//repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/home/ami/.cache/dein/')
  call dein#begin('/home/ami/.cache/dein/')

  " Let dein manage dein
  " Required:
  call dein#add('/home/ami/.cache/dein//repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here:
  call dein#add('Shougo/neosnippet.vim')
  call dein#add('Shougo/neosnippet-snippets')
  call dein#add('tpope/vim-endwise')
  call dein#add('tomtom/tcomment_vim')
  call dein#add('Shougo/neocomplcache-rsense.vim')
  call dein#add('Shougo/neocomplete.vim')
  call dein#add ("Shougo/neosnippet")
  call dein#add ('Shougo/neosnippet-snippets')

  let g:neocomplete#enable_at_startup = 1
    " smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
  let g:neocomplete#enable_smart_case = 1
    " 3文字以上の単語に対して補完を有効にする
  let g:neocomplete#min_keyword_length = 3
    " 区切り文字まで補完する
  let g:neocomplete#enable_auto_delimiter = 1
    " 1文字目の入力から補完のポップアップを表示
  let g:neocomplete#auto_completion_start_length = 1
    " バックスペースで補完のポップアップを閉じる
  inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"

    " エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定・・・・・・②
 imap <expr><C-l>
\ neosnippet#expandable() <Bar><Bar> neosnippet#jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<C-n>"

    " タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ・・・・・・③
  imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

if !exists('g:neocomplcache_omni_patterns')
    let g:neocomplcache_omni_patterns = {}
endif
let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete

"rsenseのインストールフォルダがデフォルトと異なるので設定
let g:rsenseHome = expand("Rsence のパスをここに記述")
let g:rsenseUseOmniFunc = 1

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

```

これで補完と閉じendを自動で補完してくれます。

結構いい感じですね

gistにも上げておきました
https://gist.github.com/keisukeYamagishi/12a864682abe7a160ac45c6584b5d067#file-vimrc
UserDefaultsを型安全に使用する方法（#functionを使用する方法とSwiftyUserDefaultsの紹介）

# はじめに
アプリ内でデータを保存する方法には`KeyChain`を使う方法と`UserDefaults`を使う方法があります。
`UserDefaults`は容易に設定値などを保存できることから多くのアプリで利用されていますが、以下のように普通に使うと型安全ではなく、キーを文字列定義しなければタイプミスを引き起こすなどの問題が発生します。

```swift
let value = "value string"
UserDefaults.standard.set(value, forKey: "key string")
let userDefaultsValue = UserDefaults.standard.string(forKey: "key string")
// "key string"を文字列定義する必要がある（文字列定義していないと取り出すときにtypoしてしまう危険性がある）
// stringで入れても、stringで出すということが"key string"と紐付いていないため、誤った型で取り出そうとすることもできてしまう
// 誤った例 ： let userDefaultsValue = UserDefaults.standard.integer(forKey: "key str")
```

# functionを使用する方法
UserDefaultsのextensionを用意し、functionを使うことでキーを文字列定義する必要がなく、型安全に使用することが可能になります。

```swift
extension UserDefaults {
    var isTutorialFinished: Bool {
        // 以下のように#functionと指定することで`isTutorialFinished`がキーの文字列として指定される
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }
}
```

この方法を使うことによるメリットとして、簡易に定義でき、しかも型安全であるということが挙げられますが、この他にももう一点、同じキー値が使用される危険性が低くなるというメリットもあります。
getとsetを記述しなければならないという観点から言えば少し冗長ではあるものの、規模がそこまで大きくないアプリや、OSSの導入が難しい場合などには有効な手段だと考えられます。
もしも規模が少し大きくなって、`#function`などと書くのが面倒であれば、以下のようなfunctionを作るとより良いでしょう。

```swift
private func getBool(key: String = #function) -> Bool {
    return UserDefaults.standard.bool(forKey: key)
}

private func setBool(_ newValue: Bool, key: String = #function) {
    UserDefaults.standard.set(newValue, forKey: key)
}

var isTutorialFinished: Bool {
    get { return getBool() }
    set { setBool(newValue) }
}
```

# SwiftyUserDefaults
UserDefaultsを簡単に使う為の有名なライブラリとして[SwiftyUserDefaults](https://github.com/radex/SwiftyUserDefaults)というライブラリがあります。OSSの導入に問題がない場合はこちらのライブラリを使用するのもいいでしょう。
使用方法はいたって簡単で、以下のようにDefaultsKeysを定義していくと、すぐさまget/setができるようになります。

```swift
// キーとなる文字列を定義
extension DefaultsKeys {
    static let username = DefaultsKey<String?>("username")
    static let launchCount = DefaultsKey<Int>("launchCount")
}
// 以下のように簡単にget/setができるようになります
// Get and set user defaults easily
let username = Defaults[.username]
Defaults[.hotkeyEnabled] = true

// Modify value types in place
Defaults[.launchCount] += 1
Defaults[.volume] -= 0.1
Defaults[.strings] += "… can easily be extended!"

// Use and modify typed arrays
Defaults[.libraries].append("SwiftyUserDefaults")
Defaults[.libraries][0] += " 2.0"

// Easily work with custom serialized types
Defaults[.color] = NSColor.white
Defaults[.color]?.whiteComponent // => 1.0
```

このライブラリを使用するメリットとしては、上記サンプルに記載しているように、+=や-=の演算が可能なことや、複数の異なる型の配列の保存が容易なことにあります。
UserDefaultsを使用する上では非常に使い勝手の良いライブラリなのでおすすめです。

# 参考URL
* [#functionについてのドキュメント](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID389)
* [SwiftyUserDefaultsのGitHub](https://github.com/radex/SwiftyUserDefaults)
初心者向け。覚えておきたい 「ガード節」という書き方。

## 最初に

何においてもそうですが、どのような場合にも当てはまるやり方というものではありません。
ケースによっては逆に読みづらくバグを生みやすくなる場合もあります。
これから紹介するものは、コードを最適化するとき、読みやすくするときの手段の一つとして理解していただければと思います。

## ガード節とは

処理の対象外とする条件を、関数やループの先頭に集めて return や continue/break で抜ける方法です。ネストを減らし正常系の処理がわかりやすくなるメリットがあります。早期リターンと同じですね。

## 具体例

まずは悪い例です。

```php5
function check($a, $b, $C) {
  if (is_null($a)) {
    $result = 0;
  } else {
    if (is_null($b)) {
      $result = 0;
    } else {
      if (is_null($c)) {
        $result = 0;
      } else {
        $result = 1;
      }
    }
  }
  return $result;
}
```

\$aがNULLの場合は返却値に0を入れ、そうでなければ\$bの値を確認する。その\$bがNULLの場合は..... と思考のままにプログラムを行うとこのような形になりがちです。正常系コードがネストの深い位置にあり、他の人が処理を追う時に苦労しますね。

これを「ガード節」を使い書き換えた場合、以下のようになります。

```php5
function check($a, $b, $c) {
  if (is_null($a)) return 0;
  if (is_null($b)) return 0;
  if (is_null($c)) return 0;
 
  return 1;
}
```

関数の先頭に異常系となる条件を集め、即座にreturnしています。正常系と異常系が明確になっていますね。
なお、forループで使う場合は以下のように Continue をつかいます。

```php5
$result = PDOStatement::fetchAll();
foreach ($result as $rows) {
  if ($rows['kind'] != 2) continue; // XXXの場合

  // 正常系の処理
}
```

これを早期リターンを使わずに書いた場合は以下のようになります。

```php5
$result = PDOStatement::fetchAll();
foreach ($result as $row) {
  if ($row['kind'] == 2) {
    // 正常系の処理

  }
}
```

悪くはありませんが、ネストが増える事と、kindが0と1の場合の処理を追うのにif文の最後まで読む必要がある点を考慮するとガード節のほうがより良いコードだと考えます。
ハッシュテーブルと二分木について調べたこと

# はじめに
ハッシュテーブルと二分木について、色々と調べたのでまとめた。

アルゴリズム関連では、以下の記事も参考にしてください。
[①計算量とソートの基本](https://qiita.com/kamezaki/items/8f04771b1babd616a3f0)
[②実用的なソート](https://qiita.com/kamezaki/items/4e70372db6573ce82d51)
[③探索](https://qiita.com/kamezaki/items/7f17a2cc8ba25cb1012a)
[④再帰関数](https://qiita.com/kamezaki/items/caf22d17d3abd38a9165)

# ハッシュテーブルと二分木ってなに？
## ハッシュテーブル(hash table)
<img src="https://qiita-image-store.s3.amazonaws.com/0/164998/5d546ceb-767c-d802-2f3c-58c573c25869.png" width=50%>

ハッシュテーブルはm個の要素を格納できる配列T(画像でいうと、hashes)と、データのキーを決定するハッシュ関数(hash functions)から構成されます。

ハッシュ関数へ入力するキーは整数である必要があるため、キーが文字列である場合は対応する整数へ変換する必要があります。

例えば、ハッシュ関数として$h(k)=k~mod~m$などを用いることができます。
ただ異なるキーが同じハッシュ値となる`衝突`が起きる可能性があるので、それを解決する方法が二つあります。

1. オープンアドレス法
2. チェイン法

英語のwikipediaにわかりやすい説明が載っていたので、そちらを参考にしてください。

- [Separate chaining | wikipedia](https://en.wikipedia.org/wiki/Hash_table#Separate_chaining)
- [Open addressing | wikipedia](https://en.wikipedia.org/wiki/Hash_table#Open_addressing)

1のチェイン法は、衝突を起こしたキー同士を連結リストで繋いで格納する方法です。

2のオープンアドレス法は衝突が起きると、テーブルの中で空いている別の位置を探す方法で、ハッシュ関数とは別のハッシュ関数を用いて、次の位置を探していきます。

ハッシュテーブルにおいては、衝突が起きなければ$O(1)$で挿入や探索を行うことができます。

### 参考

[What is a HashTable Data Structure - Introduction to Hash Tables , Part 0 - YouTube](https://www.youtube.com/watch?v=MfhjkfocRR0)
[ハッシュ法](http://web-ext.u-aizu.ac.jp/~qf-zhao/TEACHING/Alg-1/lec12-1.pdf)

## 二分木(binary tree)
<img src="https://qiita-image-store.s3.amazonaws.com/0/164998/6c781b9f-db25-acaa-ecf1-23694c50816b.png" width=40%>

二分木とは根付きの木構造で、ノードの持つこの数が高々2であるものを指します。
計算量が常に$logn$になるというのが特徴です。

- ハッシュテーブほどメモリの確保が要らない。
- ハッシュ関数を考えずに、済む。

などのメリットがあります。
ただ木のバランスが取れておらず、片方が長くなると、計算量は$O(n)$に近づくため、左右のバランスをとる平衡木などが考案されています。回転、などの手法によって実現されます。



# 参考
- [ハッシュテーブルと二分木についてのメモ - ablog](http://d.hatena.ne.jp/yohei-a/20120130/1327887478)
Firefoxでの閲覧履歴をCSV形式でエクスポート

Ubuntu 16.04 LTSで、Firefoxでの閲覧履歴をエクスポートする方法です。

# エクスポートの手順
```
# sqlite3をインストール
sudo apt install sqlite3　

# firefoxのプロファイル(places.sqlite)を作業ディレクトリ(ここでは~/firefox_history)にコピー
# プロファイルの場所はFirefoxの[右上のアイコン]→[ヘルプ]→[トラブルシューティング情報]から確認できる
cp ~/プロファイルがあるディレクトリ/places.sqlite ~/firefox_history/

# 作業ディレクトリに移動
cd ~/firefox_history/

# DBに接続
sqlite3 places.sqlite

# tableを確認してみる
sqlite> .tables

# csv形式で閲覧履歴をエクスポート（出力ファイル名は、ここではmy_history.csv）
sqlite> .mode csv
sqlite> .output my_history.csv
sqlite> SELECT title,url,last_visit_date FROM moz_places;

# DBへの接続を終了
sqlite> .exit
```

# 閲覧履歴をエクスポートしたかった理由
調べものをしているときの自分の検索履歴や閲覧履歴を後から、grep等しながらじっくり見返したかったからです。

# 参考文献
- [プロファイルマネージャーを使用して、Firefox のプロファイルを作成または削除する](https://support.mozilla.org/ja/kb/profile-manager-create-and-remove-firefox-profiles)
- [SQLite3 チートシート](https://qiita.com/sotetsuk/items/cd2aeae4ba7e72faad47)
- [ブラウザの閲覧履歴で人生の棚卸し（embulk + elasticsearch + kibanaで可視化）](https://qiita.com/maeharin/items/a2fb6242d26555c85dec)
- [Firefoxのページ閲覧履歴をCSVに書き出す](http://hikone.info/blog/?p=74)

# その他
- 今回作ったmy_history.csvは他人に見られてしまうと相当恥ずかしいと思うので、取り扱い注意です。
- last_visit_dateがunix時間になっているので西暦に直したかったのですが、さくっと直せなかったので今回はやめました。
【nullって何だろう？】

###**１．きっかけ**
このテーマを選んだきっかけは、新人エンジニアを教育してた時に、nullの説明を求められて、何も言えなかったからw

```java
String A = null;
String B = "";
```
String型にnullと””(空文字)を設定した時に、何が違うのかを説明出来なかったので、そこを掘り下げて自分の理解を深めます。（その時の自分は、”null”は値がないこと、””は空文字だよ、と答えをしました。反省。。）


###**２．NullPointerException**

俗に言う”ヌルポ”って、どういう時に起こるんでしょうか。例としてはこんな感じ。

```.java
public class Sample {
	public static void main(String[] args) {
		String str = null;
		System.out.println(str.length());
	}
}
```
nullでメソッドを実行しようと思うと、NullPointerExceptionが出ます。（nullはいかなるメソッドも使えない）なので、もしnullの値が設定される可能性があれば、以下のコードのように”nullチェック”なるチェック処理を入れるのが一般的だと思います。

```.java
public class Sample {
	public static void main(String[] args) {
		String str = strMake();
		if (str != null) {
			System.out.println(str.length());
		} 
	}
	private static String strMake () {
		return null; // 何か処理を書く
	}
}
```

###**３． 文字列クラスに用意されているメソッド**
Stringクラスには、色々なメソッドが用意されてます。
防備録として、参考サイトのリンクを貼っておきます。

【公式ドキュメント】
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

###**４．文字列型 = 参照型**
*“JavaにおけるString型は、参照型なので、空の文字列("")と参照先なし(null)の2つに区別される。参照型にnullが入っている状態では、メソッドが呼べない為、nullが入っていないかチェックする(=nullチェック)をする必要がある。”*
←新人さんにはこのような説明をして行こうと思います。
メディアクエリをmixinで管理する

レスポンシブデザインのサイトを作成する上で、メディアクエリは欠かせないものになります。
しかし、毎回`@media screen and (min-width: ○○px)`のような記述を行うのはとても面倒です。
そこで、これらをmixinにすることで、記述を簡単にすることができます。

# 作成したmixin

用意したのは下記のパターンです。

```sass
// PCレイアウト
@mixin large {
  @media screen and (min-width: 960px) {
    @content;
  }
}

// 中間レイアウト以上
@mixin more_than_medium {
  @media screen and (min-width: 481px) {
    @content;
  }
}

// 中間レイアウト
@mixin medium {
  @media screen and (max-width: 959px) and (min-width: 481px) {
    @content;
  }
}

// 中間レイアウト以下
@mixin less_than_medium {
  @media screen and (max-width: 959px) {
    @content;
  }
}

// スマホレイアウト
@mixin small {
  @media screen and (max-width: 480px) {
    @content;
  }
}
```

## 補足

* サイトによって必要なサイズを追加したり、削除したりして使用してください
* 今回は`screen`を指定していますが、こちらも必要に応じて修正してください
 * 何も気にしないでいいということであれば、`all`を指定する形でよいかと思います
* 他にも指定できるものがありますが、こちらに関してはここでは解説しませんので、必要に応じて追加していただければと思います
* 本来であれば、ブレークポイントの数値は変数化して管理しますが、ここでは直接していしています

# 使用例

あまり意味ないかもしれませんが、使用例は下記の通りになります。

```scss
.test {
  @include small {
    font-size: 16px;
  }
  @include more_than_medium {
    font-size: 20px;
  }
}

```

最小のレイアウトをベースにして上書きしていくパターンで実装するのであれば、`small`は不要でそのままサイズを指定すればいいですが、使用イメージはこんな形です。

# まとめ

以上がメディアクエリをmixinで管理する方法になります。
個人的には`@content`がとても好きです。
これをつけておけば、引数で渡しきれないプロパティを指定して渡すことができるので、とても自由度が増す印象を持っています。
これがあることによって、mixinの可能性が広がっている気がします。
新しくMacを買って最初に開発環境をセットアップする内容をスクリプトにまとめた話

# 事始め
仕事ではmacをずっと使っていたが、使用PCが昔からWindowsで複数台あったので、macを買う機会がなかったのだが、流石に欲しくなって去年購入した際のセットアップのまとめになります。

# セットアップの内容
iOSのアプリ開発ができればそれで十分なので、以下の環境（プラスα）を入れました。

* [Homebrew](https://brew.sh/index_ja.html)
* [rbenv](https://github.com/rbenv/rbenv)
* [Git](https://git-scm.com/downloads)
* [SourceTree](https://ja.atlassian.com/software/sourcetree)
* [Xcode](https://developer.apple.com/jp/xcode/)

# スクリプトについて
これらの環境を導入するに当たって、毎回手動で入れるのは面倒だったので、一括で入るようにしたくて調べ回って以下のスクリプトにまとめました。

```sh
#!/bin/sh
# setup mac

# HomeBrew
# see https://brew.sh/index_ja.html
if [ ! -x "`which brew`" ]; then
  echo "start install and update brew"
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  brew update
fi

# rbenv
# see https://github.com/rbenv/rbenv
if [ ! -x "`which rbenv`" ]; then
  echo "start install rbenv"
  brew install rbenv
fi

# Git
# see https://git-scm.com/downloads
if [ ! -x "`which git`" ]; then
  echo "start install git"
  brew install git
fi

# brew cask
# brew cask install sourcetree
# brew cask install visual-studio-code
# brew cask install google-chrome
# brew cask install java
# brew cask install android-studio

# mas (Mac App Store command line interface)
# if you need to install mas, remove comment out
# if [ ! -x "`which mas`" ]; then
#  echo "start install mas"
#  brew install mas
#
#  echo "install App Store Softwares"
#  mas install 497799835  # Xcode
#  mas install 896624060  # Kobito
#  mas install 1024640650 # CotEditor
# fi
```

# 使用しているコマンドについて
* brew cask install：homebrewを入れるとついてくるコマンドです。アプリケーションのインストールができます。
* mas:App Storeのアプリをコマンドからインストールできるシステムです。brewからinstallできます。詳細は[GitHub](https://github.com/mas-cli/mas)参照のこと

# 参考にした記事
* [MacにHomebrewをインストールする](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)：homebrewのインストールについて説明されています
* [みんなhomebrew-caskって知ってるか？](https://qiita.com/ryurock/items/1432578d364985f6cb06)：brew caskについて詳しく載ってます
* [Macのセッティングが楽チンに！『Homebrew Cask』でソフトを簡単インストール](https://www.lifehacker.jp/2015/08/150823_homebrew_cask.html)：↑と同じくbrew caskについて載ってます
* [Macでの開発環境構築をできる限り自動化する。](https://qiita.com/takustaqu/items/a328baf15862faa086ee)：masによるインストールなどが紹介されています

# スクリプトについて
一応GitHub上で公開してあります。xcodeのプロジェクトの初期セットアップ用のスクリプトも配置してありますので、興味がある方はご参照ください。

* https://github.com/yuukiw00w/setup
[初心者向け]アルゴリズム入門④再帰関数

# はじめに
エンジニアであれば最低限知っておきたいアルゴリズムの知識のうち、再帰関数に関してまとめました。

以下の記事も参考にしてください。
[アルゴリズム入門①計算量とソートの基本](https://qiita.com/kamezaki/items/8f04771b1babd616a3f0)
[アルゴリズム入門②実用的なソート](https://qiita.com/kamezaki/items/4e70372db6573ce82d51)
[アルゴリズム入門③探索](https://qiita.com/kamezaki/items/7f17a2cc8ba25cb1012a)

# 再帰関数とは
> 関数の中で自分自身を呼び出すような関数

です。
例えば、nの階乗は

```math
n! = (n-1)×(n-2)...×1-n×(n-1)!
```
であり、nが1より大きい場合はより小さい部分問題(n-1)の階乗を含んでいます。nが1の時は、1を返すというように再帰関数はそれが必ずどこかで終了するように実装しなければならないことに注意してください。

# 分割統治法
再帰のテクニックを用いると、問題を分割し、それを再帰的に解き、それを統合することで解くことができます。
これを`分割統治法`　と言います。
　
例えば、配列arrayの最大値を探す際に、以下のように分割統治法探すことができます。

```ruby
def find_max(array)
  m = array.size/2
  if m == 1 # 要素数が一つで終了
	return array[0]
  else
	l = find_max(array[0..m-1]) # 前半の問題をsolve
	r = find_max(array[m..-1]) # 後半の問題をsolve
	[l, r].max # 部分問題の解を統合する
  end
end 
```

# フィボナッチ数列
再帰を使って、フィボナッチ数列を解いてみましょう。
フィボナッチ数列は以下のような数列です。

```math
\begin{align}
a_0 &= 0\\
a_1 &= 1\\
a_{n+1} &= a_n \;+ a_{n-1}\\
\end{align}
```

以下がフィボナッチ数列を求めるコードとなります。

```ruby

def fibonacci(k)
  if k <= 1
    k
  else
    fibonacci(k-2) + fibonacci(k-1) # 分割して、k-2, k-1の場合についてsolveし、統合する。
  end
end
```
## メモ化
上のコードの場合、$a_n$の値を求めるために、$a_{n-1}$, $a_{n-2}$の値をそれぞれ求めているため、計算量が非常に多くなってしまいます。

これを防ぐために、$a_{n-2}$を求めた際に得た値を、$a_{n-1}$を求める際に使うのが、メモ化と言われる手法です。

詳しくは、以下の記事を参考にしてください。
[メモ化を知った](https://qiita.com/kk_Ataka/items/6bbc26159d2efdf6fbb9#%E3%83%A1%E3%83%A2%E5%8C%96%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88)

## 練習問題
[フィボナッチ数列 | アルゴリズムとデータ構造 | Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_10_A&lang=jp)
Google Cloud Functions の使い方

Google Cloud Functions はサーバーレスの関数です。

次のページを参考にしました。
[Quickstart: Using the gcloud Command-Line Tool](https://cloud.google.com/functions/docs/quickstart)

Google Cloud Platform で、
Cloud Functions API を有効にして下さい。

## サンプルのプログラム ##

フォルダー構造

```text
$ tree 
.
├── index.js
└── package.json
```

```js:index.js
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.hello = (req, res) => {
  var str_out = ""
  str_out += "これはテストです。\n"
  str_out += "Hello World!\n"
  str_out += "Good Evening\n"
  str_out += "今晩は\n"
  str_out += "Mar/10/2018 PM 20:51\n"
  res.send(str_out)
}
```

```json:package.json
{
  "name": "sample-http",
  "version": "0.0.1"
}
```

## デプロイ ##

```bash
gcloud functions deploy function-nov25 \
--entry-point=hello \
--trigger-http \
--runtime=nodejs22 --gen2 \
--region asia-northeast1
```

```text
Allow unauthenticated invocations of new function [function-nov25]? (y/N)?  y
```

## 関数の一覧 ##

```text
$ gcloud functions list
NAME            STATE   TRIGGER       REGION           ENVIRONMENT
function-nov25  ACTIVE  HTTP Trigger  asia-northeast1  2nd gen
```

## URL の確認

```text
$ gcloud functions describe function-nov25 --region asia-northeast1 | grep url:
url: https://asia-northeast1-project-nov15-2024.cloudfunctions.net/function-nov25
```

## 関数のテスト ##

```text
$ curl https://asia-northeast1-project-nov15-2024.cloudfunctions.net/function-nov25
これはテストです。
Hello World!
Good Evening
今晩は
Nov/25/2022 AM 10:50
```

## 関数の削除 ##

```bash
gcloud functions delete function-nov25 --region asia-northeast1
```

## 引数を Get で受け取るサンプル ##
[Google Cloud Functions で Get の引数を受け取る](https://qiita.com/ekzemplaro/items/ca82066278ad20e8baa1)

## 引数を Post で受け取るサンプル ##
[Google Cloud Functions で Post の引数を受け取る](https://qiita.com/ekzemplaro/items/5f87ddeafdd16eb56c11)

## 参考ページ ##
[gcloud functions deploy](https://cloud.google.com/sdk/gcloud/reference/functions/deploy)
LaTeXで公用文の書式を設定する

役所から発出する文書では統一的な様式が使われます。
たとえば、本文に続く「記」以降は箇条書きになりますが、LaTeXの標準的な箇条書きの様式とは異なり、以下のようなものとなっています。

- 第１階層　１　２　３
- 第２階層　（１）　（２）　（３）
- 第３階層　ア　イ　ウ

そのほか、タイトルの書き始めは４文字目から、職氏名や日付は右寄せして１文字分余白などの細かいルールがあります。


### 公用文のTeX書式
以下のTeX書式は不完全ではありますが公用文で使える書式です。そのままコピペで使えます。

```latex
%%%日本の標準的な公用文の書式
\documentclass[12pt]{jsarticle}		%公用文の標準は12pt
%%%パッケージは使いそうなものを適当にチョイス
\usepackage[dvipdfmx]{graphicx}
\usepackage{wrapfig}
\usepackage{float}
\usepackage{otf}	%特殊な文字など
\usepackage{longtable}	%ページをまたぐ表
\usepackage{ulem}	%アンダーライン
\usepackage{ascmac}	%枠囲みに必要
%%%enumerate環境でカタカナが使えるようにする。
\makeatletter
\def\@aiu#1{\ifcase#1\or ア\or イ\or ウ\or エ\or
オ\or カ\or キ\or ク\or ケ\else\@ctrerr\fi\relax}
\def\aiu#1{\@aiu{\@nameuse{c@#1}}}
\makeatother
%%%
\renewcommand{\labelenumi}{\arabic{enumi}　}	%数字
\renewcommand{\labelenumii}{（\arabic{enumii}）}	%括弧付きの数字
\renewcommand{\labelenumiii}{\aiu{enumiii}　}	%カタカナ
%%%幅160mm、高さ240mm
\setlength{\textwidth}{160truemm}      % テキスト幅: 160mm
\setlength{\fullwidth}{\textwidth}     % ページ全体の幅
\setlength{\oddsidemargin}{0mm}   % 左余白
\setlength{\topmargin}{-10mm}       % 上余白
\setlength{\textheight}{240truemm}     % テキスト高さ
\pagestyle{empty}	%ページ入れない
%%%プリアンブルここまで
\begin{document}
%%%
\begin{flushright}	%記号番号と日付を右寄せ
ほ\hspace{3.5zw}町\hspace{3.5zw}連　\\	%日付にあわせて均等割付け風にする
平成３０年１月２４日　
\end{flushright}

日本ふがふが連絡協議会会長　○　○　〇　〇　様
\vspace{1\baselineskip}

\begin{flushright}ほげほげ町連絡協議会会長　○　○　〇　〇　\end{flushright}	%職氏名を右寄せ

\vspace{1\baselineskip}

\hspace{2zw}ふがふがほげほげ合同会議の開催について（通知）	%標題は行頭を3文字空白

春暖の候、貴職におかれましては益々ご清祥のこととお喜び申し上げます。

日頃より、当町のマークアップ言語保護行政の推進にご指導とご協力を賜り、厚くお礼申し上げます。

さて、標題の会議につきまして下記により開催いたします。時節柄ご多忙とは存じますが、ご出席を賜りますようお願い申し上げます。

\begin{center}記\end{center}

\begin{enumerate}
\item 期日　平成30年○月○日（金）
\item 場所　ほげほげ町図書館第一会議室
\item 議案
	\begin{enumerate}\setlength{\itemindent}{-1.5zw}
	\item 平成29年度事業報告
	\item 平成30年度事業計画案
		\begin{enumerate}\setlength{\itemindent}{-1.5zw}
		\item Markdown記法整備検討委員会の開催
		\item \LaTeX 愛好家の育成事業計画
		\end{enumerate}
	\item その他の議案につきましては会議開催期日3日前まで事務局へお知らせください。
	\end{enumerate}
\item 旅費の支給に必要となりますので印鑑をご持参ください。
\end{enumerate}

%%%ベースラインスキップは、本文にあわせて必要な行数を設定する
\vspace{5\baselineskip}
%%%
\begin{flushright}
	{\small
	\begin{minipage}{6cm}	%ミニページの幅は適切に調整する
		\begin{screen}	%タイトル無しの枠囲み
			\begin{description}
			\item[担　当]ほげほげ町連絡協議会事務局
			\item[電　話]○○〇〇-〇〇-〇〇〇〇
			\item[F A X]○○〇〇-〇〇-〇〇〇〇
			\item[メール]markdown@latex.com
			\end{description}
		\end{screen}
	\end{minipage}
	}
\end{flushright}
%%%
\end{document}
```

出力はこうなります。
![Screenshot from 2018-03-10 20-56-36.png](https://qiita-image-store.s3.amazonaws.com/0/60438/33db6f07-eb1f-55ff-fff8-e3eb19fdfada.png)

### 参考ページ

enumerate環境のカスタマイズの方法を探すのに苦労しました。
[enumerate環境のカスタマイズ （お探しの題目が見つかりません）](http://no-item-retrieved.blogspot.jp/2008/12/itemsep-parsep-itemindent-labelsep.html)
[箇条書き（滋賀大学熊澤吉起先生のHP）](https://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/item.html)
minioでHTTPでアクセスする

背景
==================================================

minioにファイルアップロードして、そのファイルにHTTPでアクセスする方法がわからなかった。
Googleで調べても見つからない。
結局会社の人のアドバイスでアクセスできるようになった。
忘れた時のために書き残しておきます。

状況
==================================================

S3のsdkでpublic-readでアップロードして、パス形式でアクセスしても以下のエラーが表示されるだけ

```xml
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied.</Message>
  <Key/>
  <BucketName/>
  <Resource>/magus-backend-development/css/</Resource>
  <RequestId>3L137</RequestId>
  <HostId>3L137</HostId>
</Error>
```

原因
==================================================

どうやらバケットポリシーを、バケットに対して設定しなかったことが原因だったようです。

解決方法
==================================================

1. minioにログイン
2. ナビゲーションペインのバケットの左の […] をクリック
![2018−03−10-2-minio.png](https://qiita-image-store.s3.amazonaws.com/0/4029/f524651e-b9f2-245c-dd28-4edad6d8722d.png)
3. Prefixが*で、Read Writeを選択して追加  
<img src="https://qiita-image-store.s3.amazonaws.com/0/4029/637bb924-c92b-fdac-903d-1f346081684e.png" alt="dialog" width=50%/>



.
JavaのGUIサンプル

JavaGUIのサンプルです。
JavaのGUIについて、mainクラスに全記述されているサンプルが散見され、私自身、実用的な使用法を見つけるのに難儀した覚えがあるので、mainクラスから分離した形で実装したGUIダイアログ群をここで共有します。

#１．swing.JOptionPane
##InfoDialog
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/242144/98647613-5e0f-c9ab-ec3c-5da5ddb5f3d0.png)

汎用的なダイアログです。

```main.java
public class Main {
    public static void main(String[] args) {
        InfoDialog.showDialog("ファイルを選択してください(.xlsx)。");
       }
}
```

```InfoDialog.java
import javax.swing.JOptionPane;

class InfoDialog {

	public static void showDialog(String msg) {
		JOptionPane.showMessageDialog(null, msg,"たいとる",JOptionPane.INFORMATION_MESSAGE);
	}
}
```
このメソッドを使う場面で引数のStringに、ダイアログ中で表示したい文字列を指定しましょう。ここでは”ファイルを選択してください(.xlsx)。”です。
showMessageDialogメソッドの引数のうち2-4番目のものは理解できる範囲だと思うのですが、1番目はparentComponentを引数に取ります。~~parentComponentが一体何なのか、調べてもわかりませんでしたが、~~基本nullでいいはずです。

”はい”、”いいえ”を選択させたい場合はshowMessageDialogではなく、showConfirmDialogメソッドを使います。

##ErrorDialog
ShowMessageDialogの第4引数をINFORMATION_MESSAGE、からERROR_MESSAGEに変えるだけで他は変わりません。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/242144/ef6893fb-6a35-c821-398a-0111963091c3.png)

```main.java
public class Main {
    public static void main(String[] args) {
        InfoDialog.ErrorDialog(".xlsxが未指定です。終了します。");
       }
}
```
```ErrorDialog.java
import javax.swing.JOptionPane;

class ErrorDialog {

	public static void showDialog(String msg) {
		JOptionPane.showMessageDialog(null, msg,"たいとる",JOptionPane.ERROR_MESSAGE);
	}
}
```

#２．awt.FileDialog


ユーザーにファイルを選択させるダイヤログです。

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/242144/cfa02dac-0f3f-6018-7093-2ba469b2977d.png)

```Main.java
public class Main {
	public static void main(String[] args) {
		new WindowTest();
        File file = new File(WindowTest.dir + WindowTest.fileName);
       }
}
```
```WindowTest.java
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.WindowListener;

class WindowTest extends Frame implements WindowListener {
	static String dir;
	static String fileName;

	WindowTest() {
		FileDialog fileDialog = new FileDialog(this);
		fileDialog.setVisible(true);
		this.dir = fileDialog.getDirectory();
		this.fileName = fileDialog.getFile();

		if (fileName == null) {
			ErrorDialog.showDialog(".xlsxが未指定です。終了します。");
			System.exit(0);
		}
	}

	public void windowActivated(java.awt.event.WindowEvent e) {
	}
	public void windowClosed(java.awt.event.WindowEvent e) {
	}
	public void windowClosing(java.awt.event.WindowEvent e) {
		System.exit(1);
	}
	public void windowDeactivated(java.awt.event.WindowEvent e) {
	}
	public void windowDeiconified(java.awt.event.WindowEvent e) {
	}
	public void windowIconified(java.awt.event.WindowEvent e) {
	}
	public void windowOpened(java.awt.event.WindowEvent e) {
	}
}
```

以上です。
Kotlin で可愛く CSV

# Kotlin 可愛い！

私は普段 Java や Python を使うエンジニアですが、Kotlin が好きです。

単純なデータの Import/Export にはよく CSV 形式を使用していますが、Kotlin ならどれだけ気持ちよく書けるのか試してみました。

ソースコードはこちらです。→ [motch0214/kotlin-csv-sample](https://github.com/motch0214/kotlin-csv-sample)

## Apache commons-csv

今回、CSV のパーサライブラリとして [commons-csv](https://commons.apache.org/proper/commons-csv/) を使用します。
単純な機能感のものですが、Kotlin との相性を考えると、むしろ適していると感じます。シンプルに書けるのが Kotlin の魅力のため、Annotation 等でゴテゴテする必要はないです。（個人の見解です。）

## サンプルデータ

使用するデータは以下とします。

```
"Name","Address","Sex","Age","Birthday"
"茂木 康文","mogi_yasufumi@example.com","男",32,"1983-04-25"
"立川 弘也","tachikawa_hironari@example.com","男",69,"1946-05-12"
"宮田 真一","miyata_shinichi@example.com","男",79,"1935-09-13"
"浅田 俊二","asada_shunji@example.com","男",53,"1961-10-29"

```

ヘッダあり、数値以外はクォートされています。

対応する `data class` も用意します。

```kotlin
data class User(
        val name: String,
        val address: String,
        val sex: String,
        val age: Int,
        val birthday: LocalDate
)
```

また、今回はヘッダを指定して CSV 内の列を指定するため、以下のような `enum class` を使います。

```kotlin
enum class UserColumn(override val header: String) : Column {
    NAME("Name"),
    ADDRESS("Address"),
    SEX("Sex"),
    AGE("Age"),
    BIRTHDAY("Birthday"),
}
```

`Column` は単なる `header` へのアクセス用インターフェースです。

```kotlin

interface Column {
    val header: String
}
```

## CSV の読み込み

では、読み込みロジック部分です。

```kotlin
private val DATE_FORMAT: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

class UserReader(reader: Reader) : CSVReader<User>(reader) {

    private fun String.toLocalDate(): LocalDate = LocalDate.parse(this, DATE_FORMAT)

    override fun CSVRecord.parse() = User(
            name = column(NAME),
            address = column(ADDRESS),
            sex = column(SEX),
            age = column(AGE).toInt(),
            birthday = column(BIRTHDAY).toLocalDate())
}
```

なかなか可愛くないですか？

CSV のどの列がどのように `User` クラスにマッピングされるのかが一目瞭然だと思います。

ちなみに、ベースクラスである `CSVReader` は私が書いたものですが、数行しかない極小のラッパーです。（→ [CSVReader](https://github.com/motch0214/kotlin-csv-sample/blob/a18e80c5a2c01bb80ddfe09397c535606b6d9354/src/main/kotlin/com/eighthours/sample/csv/csv.kt#L11)）
拡張関数を駆使して、いい感じの見た目になるように調整しています。


## CSV の書き込み

次は、書き込みロジック部分です。

```kotlin
class UserWriter(writer: Writer) : CSVWriter<User>(writer, HEADERS) {

    companion object {
        private val HEADERS = UserColumn.values().toList()
    }

    override fun User.encode() = mapOf(
            NAME to name,
            ADDRESS to address,
            SEX to sex,
            AGE to age,
            BIRTHDAY to birthday.format(DATE_FORMAT))
}
```

読み込み同様、マッピングが一目瞭然になっています。

`encode()` の返り値は `Map` にしています。ヘッダの定義とマッピング部分の順番がずれているなんてしょうもないバグに悩まされたくないのです。

`CSVWriter` も私が書いたものですが、同じく薄いラッパーです。（→ [CSVWriter](https://github.com/motch0214/kotlin-csv-sample/blob/a18e80c5a2c01bb80ddfe09397c535606b6d9354/src/main/kotlin/com/eighthours/sample/csv/csv.kt#L31)）


## まとめ

大した道具を使わなくても、Kotlin ならば CSV とオブジェクトのマッピングロジックが明示的でわかりやすく書けたと思います。

わかりやすいのがとっても重要です。
（Javaだとなかなかこうはいきません。。）

みなさんも Kotlin を使って可愛くプログラミングをしてみませんか？

ご意見・ご指摘お待ちしています。
Raspberry Pi 3 を64bitモードで動かすイメージをBuildrootで作る

# Buildrootの準備

今回はbuildrootをgitでとってきて、2018.02のタグをcheckoutしました。

```
git clone git://git.buildroot.net/buildroot
cd buildroot/
git checkout -b work3 2018.02
```
# Raspberry Pi 3の64bit用のコンフィグ

既に用意されているものがあるので、それをベースにします。

```
make raspberrypi3_64_defconfig
make menuconfig
```

[Buildrootでルートファイルシステムを構築するときに必ずすること](https://qiita.com/tetsu_koba/items/54d0573afe407592aed0)を参考にして、dhcpcd, dropbear(ssh), avahi-daemon を入れます。

# ビルド
時間がかかるので、nohupをつけてバックグランドでビルドします。

```
nohup make &
tail -f nohup.out
```
output/images/sdcard.img　ができるので、それをddコマンドでmicro SDカードに書きます。

```
$ ls -lh output/images/sdcard.img
-rw-r--r-- 1 koba koba 153M Mar 10 10:16 output/images/sdcard.img
```

rootfsはaarch64でビルドされています。

```
$ file output/target/bin/busybox 
output/target/bin/busybox: setuid ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped
```

# 起動

```
# cat /proc/version
Linux version 4.9.79-v8 (koba@instance-3) (gcc version 6.4.0 (Buildroot 2018.02) ) #1 SMP PREEMPT Sat Mar 10 08:50:08 UTC 2018
# cat /proc/cpuinfo 
processor	: 0
BogoMIPS	: 38.40
Features	: fp asimd evtstrm crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 1
BogoMIPS	: 38.40
Features	: fp asimd evtstrm crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 2
BogoMIPS	: 38.40
Features	: fp asimd evtstrm crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 3
BogoMIPS	: 38.40
Features	: fp asimd evtstrm crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

```

ブートログはgistに貼りました。
https://gist.github.com/tetsu-koba/d7f47cfcd7136bac017343d55f4a7fa0
Linuxでの便利なワンライナーでの操作

普段、LinuxのCLI操作で便利な操作を一個一個紹介します。

####**その1. 適当な検証用ディレクトリを複数作成してディレクトリを移動したい**

```bash
$ mkdir {01..10} // 1~10のディレクトリ
```

```bash
$ mkdir {01..10}; ls
1	10	2	3	4	5	6	7	8	9
```


単体で作成したいときは、連続で並べればいけます。

```bash
$ mkdir aa bb cc // aa bb ccの3つのディレクトリ作成
```

```bash
$ mkdir aa bb cc; ls
aa	bb	cc
```

####**その2. 作成したディレクトリへ移動したい**

```bash
$ mkdir aa; cd $_
```

ちなみに複数ディレクトリを作成すると最後が適応され下記ですと「cc」のディレクトリへ移動します。

```bash
$  mkdir aa bb cc; cd $_
```

####**その3. 1日前に変更したディレクトリを可視化したい**

```bash
$ find . -mtime -1 | head
```


####**その4. 引数を受け取って、順番に特定のコマンドを実行していきたい。**

例としてこんなようなsampleファイルがあったとします。

```bash
$ cat sample.list 
aaa
bbb
ccc
ddd
```
このaaa,bbb,cccに「!」をつけたいといったときの方法です。

まず「!」をつけるシェルを用意します。

```bash:run.sh
#!/bin/sh

echo $1"!"
```

そして、ワンライナーで下記のようにxargsを駆使して実行できます。

```bash
$ cat sample.list | xargs -I{} ./run.sh {}
aaa!
bbb!
ccc!
ddd!
```

####**その5. MySQLから特定のデータを取得したい**
mysqlのクライアント経由ではなくbashのCLI上で行う方法です。

```bash
$ mysql -u root -p -D memberprovision -e "mysql -u ${user} -p -D ${db_name} -B -N -e "select * from ${table_name}"|  head -n 10 test.list
Enter password: ****

aaaaa   2016-04-18 18:07:42.000000
bbbbb   2016-04-18 18:07:42.000000

```

以上です。

参考
https://qiita.com/i35_267/items/4c2572ee7b91a5dbc641
https://qiita.com/simeji/items/cae94349a2ae02d3204d
Cent OS 7でuWSGIのチュートリアルで詰まった

Cent OS 7でnginx+uWSGIでサーバーを作る[このチュートリアル](http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html)を進めていたら詰まったのでメモ。

チュートリアルでは

```
$ uwsgi --http :8000 --wsgi-file test.py
```

を実行して、`http://example.com:8000`にアクセスしろと書いてあるが、できませんでした。たぶんCent OS 7のデフォルトのファイヤウォールの設定では、80番以外のポートへのhttpでのアクセスはできないためです。

[この記事](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e#%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7)を参考に、とりあえず

```
# firewall-cmd --add-port=8000/tcp --zone=public
```

を実行して、8000番を開ければ無事アクセスできました。
メカトロニクス総合化工房：電子空間分室

#様々な活動の集約ページとして
所属している大阪府立大学法人のWEBサーバにもホームページがあるのですが，種々の活動をいつでも，どこからでも投稿できるQiitaで集約することにしてみました．

- [本家のホームページ](http://www2-doi.ct.osakafu-u.ac.jp)
- [本家の過去ページ](https://goo.gl/5vj2Mv)
- [Qiitaの土井研究室ホームページ](https://qiita.com/tmdoi/items/1e4e3d449e86ca2445eb)
- [駆動ロボットのFacebookページ](https://www.facebook.com/QDRdoilab/?ref=bookmarks)

#すでに投稿しているQiitaのページ

- IoT関係
    - [MZプラットフォーム関係]()
        - [中小企業に役立つIoT](https://qiita.com/tmdoi/items/b316df77f9fcf8cbcf42)
        - [打点カウンターのシリアル通信](https://qiita.com/tmdoi/items/407bf6ce6aea6fa228c5)
        - [MySQLのネットワーク越しアクセス](https://qiita.com/tmdoi/items/407bf6ce6aea6fa228c5)

- Robot関係
-- [DOBOTを使ってみた](https://qiita.com/tmdoi/items/8fcbcf392751314738a5)

- その他
-- [クラウドTeX](https://qiita.com/tmdoi/items/71e6dab062ea5b1bc30b)

#プロフィール
大阪府立大学工業高等専門学校　メカトロニクスコース　土井智晴（どいともはる）
所属している高専の機械工学科を卒業後，長岡技術科学大学に編入学し，修士終了後に母校に赴任した．研究分野は，主にロボットだが，博士は制御理論（ロバスト制御，２次安定化）で取得した．現在は，府大高専の地域連携テクノセンター長を務めながら，多くの地元中小企業の経営者等とも交流がある．

##アウトリーチ活動
-[レスキューロボットコンテスト](https://www.rescue-robot-contest.org/)
MacでVPN接続できなくなったのを解決できた

背景
=======================================================

ルータでDHCPの割り当てIPアドレスのセグメントを変更した。
その後、IPアドレスを変更前は接続できていたL2tpのVPNが接続できなくなった。
原因はIPアドレスの変更かどうかはわからないけれど、何時間もGoogleで調べたり試行錯誤した結果解決できた方法を書き残しておきます。

状況
=======================================================

VPN接続を開始しても以下のメッセージが表示された。

> l2tp-vpn サーバが応答しませんでした。接続し直してください。それでも問題が解決しない場合は、設定を確認し、管理者に問い合わせてください。

ログを確認しても、接続開始してもすぐに失敗している。なんの助けにもならない。

```:/var/log/ppp.log
Sat Mar 10 16:59:41 2018 : publish_entry SCDSet() failed: Success!
Sat Mar 10 16:59:41 2018 : publish_entry SCDSet() failed: Success!
Sat Mar 10 16:59:41 2018 : l2tp_get_router_address
Sat Mar 10 16:59:41 2018 : l2tp_get_router_address 192.168.100.1 from dict 1
Sat Mar 10 16:59:41 2018 : L2TP connecting to server 'xxx.xxx.xxx.xxx' (xxx.xxx.xxx.xxx)...
Sat Mar 10 16:59:41 2018 : IPSec connection started
Sat Mar 10 16:59:46 2018 : IPSec connection failed
S
```

解決方法
=======================================================

1. システム環境設定＞ネットワーク で、いつも使用していたネットワーク設定の Wi-Fi　の [詳細...] ボタン選択
2. Wi-Fi タブの使ったことのあるネットワークで現在使用中の Wi-Fi 設定を [-] で削除
3. さらにシステム環境設定＞ネットワーク で、VPN 設定も削除
4. 再起動
5. Wi-Fi の再登録
6. VPNの再登録

多分、使用していた Wi-Fi の設定を削除したのが効いたと思う。

無駄だったこと
=======================================================

* 単に VPN 設定削除
* キーチェーンから事前共有鍵とかパスワードを削除
* DNSキャッシュクリア

```Console
$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder
```

当初は、ルータを疑って設定を調べたが特におかしいことや、そもそも設定可能な項目がなかった。
他のMacやAndroidでVPN試したら、接続できたのでルータの可能性は除外。
接続できないMacの問題であることが確定。
何かキャッシュとか設定が残っているのが原因と予測して試行錯誤した。
SSHトンネリングを使ってlocalhostでリモートサーバーにアクセスする方法

毎回調べてるので記録

* 参考サイト

https://www.tamurasouko.com/?p=1092

```bash
$ ssh -f -N -L 8080:localhost:80 remote
```

`remote`は`.ssh/config`に設定済みとする
CentOS 7 OpenSSL 1.1.0gのソースファイルからのインストール

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# 前提条件
- gcc 7.2.0
- cmake 3.10.2
- MySQL 5.7.21

# ダウンロード・展開
最新バージョンの確認
[OpenSSL](https://www.openssl.org/)

必要なパッケージをインストールする。

````
yum install perl
````


`/usr/local/src`ディレクトリ移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar xvzf openssl-1.1.0g.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd openssl-1.1.0g/
````

コンパイル・インストール

````
./config --prefix=/usr/local/openssl shared zlib
make
make install
````
バージョン確認しようと`/usr/local/openssl/bin/openssl version`を実行すると、エラーが表示される。

````エラー内容
/usr/local/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
````
エラー対策を行う。
# エラー対策
`libssl.so.1.1`の場所を探し、`libssl.so.1.1`が見つかるように対策を行う。

````
find /usr -name "libssl.so.1.1"
/usr/local/src/openssl-1.1.0g/libssl.so.1.1
/usr/local/openssl/lib/libssl.so.1.1
````

`libssl.so.1.1`は`/usr/local/openssl/lib/`に保存されているので、対策する。

````
echo "/usr/local/openssl/lib/" > /etc/ld.so.conf.d/lib64.conf
ldconfig
````
これでバージョン表示される。
# バージョン確認

````
/usr/local/openssl/bin/openssl version
````
バージョンが表示される。

````
OpenSSL 1.1.0g  2 Nov 2017
````

# 参考
[OpenSSLをビルドしてApacheで利用する：仕事で使える魔法のLAMP（17） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1108/05/news122.html)
[サービスに使えるapache/opensslの構築方法 - LinuxとApacheの憂鬱](http://d.hatena.ne.jp/hiroppon/20081122/1228069519)
[How to fix Python Installation Error while loading shared libraries: libssl.so.1.0.0? Solved - Techglimpse](https://techglimpse.com/python-openssl-installation-error-solution/)
[OpenSSL - ネットワーク関連 - Linux ClockUpMemo](http://linux.clock-up.jp/contents/network/openssl)

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
VMwareのハードディスク割り当て増設後にOS側に認識させる話

Vmware Workstation で仮想PCのHDDを増設したのに
ゲストOS側ではHDD容量が増えてなかったのでひと手間

物理HDDと同じようにゲスト側で追加した領域を認識させる必要あり
ゲストOS：Windows 7 

（１）コンピュータの管理を右クリックで「管理」を選択

（２）記憶域

（３）ディスクの管理

（４）増設分の容量を選択して「ボリュームの拡張」
公開された！！大学生が作ったAlexaのスキルがAmazon様に受け入れるまでの過程（申請第2回目）

早速ですが申請通って公開されました。
http://smaspi-world-sns.online/
アレクサアプリで「スマスピの世界」で検索してね。

# はじめに。

第一回で見事にリジェクトを食らいましたimajoですどうも。
細かな修正をして、再度Amazon様に挑んだ様子をお届けします。
修正点だけを書きたいと思うので、全体が気になる方は第１回をみてください。

# 修正点

## 画像

以下にしました。
![IMG_0856.jpg](https://qiita-image-store.s3.amazonaws.com/0/195882/7cd57d72-c136-e381-6699-f7b2d295fa50.jpeg)


## スキルの詳細な説明

```
SNS投稿型スキルです。
このスキルを使うことで、スマートスピーカーの代わりに呟くことができます。

みんなで、協力してスマートスピーカーのネット世界を完成させてください。

投稿した内容は以下のURLで確認できます。
```

## lmabda
githubにあげました。
https://github.com/imajoriri/Smaspi_SNS_record/tree/master/%E7%AC%AC%E4%BA%8C%E5%9B%9E%E7%94%B3%E8%AB%8B%E5%86%85%E5%AE%B9

# Amazon様からのお言葉

```
この度は スマスピの世界 スキルを申請いただき、誠にありがとうございます。 
おめでとうございます。スキルは認定プロセスに合格し、まもなくスキルストアに公開されます。 
スキルストアに公開されると、サービスへのトラフィックが増えることが見込まれます。十分なキャパシティがあることをご確認ください。　また、ユーザーが想定外のオペレーションを行なった場合にもサービスが機能し続けることを確認してください。 
```

受け入れらた。。。。
この世界で生きていってもいいと、受け入れられたかのようだ。。
今後は、機能の追加、全開で指摘いただいたURLの定数化、だったりをしていこうかと


うそ


こっからが本番！！！！！！！




そう、



今まではLambdaを使っていました。



そう、



これからは使いません！！！！！





全ての処理を自分で立てたEC２のインスタンスで処理します。

その、プログラムをパッケージ化して、

幸せな世界を作っていく計画をします（公開するかはわからない）。

ちなみにRailsです。

プログラミング初心者の、些細な挑戦です。
暖かく見守ってください。

それでは、

乞うご期待！！！！
[メモ]M5StackにMicroPythonを焼く

# M5Stackとは

* ESP32が入った5cm四方のケース付きモジュールで、モジュールを積み重ねて、拡張できる。日本では発売されていないが、SIMモジュールなんかもある模様。
* [公式](http://m5stack.com)
* [スイッチサイエンス](https://www.switch-science.com/catalog/list/770/)
* [GitHub](https://github.com/m5stack)

# 手順

* 基本的に[公式GitHubの手順](https://github.com/m5stack/M5Cloud)に従えば問題なし
* ただ、Windowsの場合Flashするツールがリンク切れだったので、https://www.espressif.com/en/support/download/other-tools?keys=&field_type_tid[]=13 から落として焼いた
 * 焼く際に、0x1000とCOMポートの指定が必要なので注意要
 * ![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/78540/b56bd05b-8b48-8489-480c-d0c2bcebc691.png)


# 気になるところ

* Web IDEがhttp…
 * しかも、M5StackからWIFIアクセスするためのアクセスポイントのSSIDとパスワードが平文でconfig.jsonに記載されている…
rails erbをhamlへ変換

railsアプリのテンプレートを、erbでなくhamlで作成しようと思ったので、erbからhamlへの変換手順をまとめてみました。

Gemfileに、次のgemを追加
gaml-rails・・・hamlを使うためのgem
erb2haml・・・erbをhamlに変換するgem

```ruby:Gemfile
gem 'haml-rails'
gem 'erb2haml'
```

```ruby:ターミナル
bundle install
```


```ruby:ターミナル
rake haml:replace_erbs
```
を実行すると
hamlへ変換して、erbを削除してくれる。


```ruby:ターミナル
Looking for ERB files to convert to Haml...
Converting: app/views/layouts/application.html.erb... Done!
Removing: app/views/layouts/application.html.erb... Removed!
Converting: app/views/layouts/mailer.html.erb... Done!
Removing: app/views/layouts/mailer.html.erb... Removed!
Converting: app/views/layouts/mailer.text.erb... Done!
Removing: app/views/layouts/mailer.text.erb... Removed!
```

きちんと、hamlへ変換されている。

<img width="215" alt="スクリーンショット 2018-03-10 18.51.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/242288/b7ace0c8-b8ca-8f05-e842-6c2fc091a321.png">
FitzHugh-南雲モデルで遊んでみる

この内容を実装して理解する
http://scholarpedia.org/article/FitzHugh-Nagumo_model

Interactive Code
https://nbviewer.jupyter.org/github/Lirimy/simulation/blob/master/fitzhugh-nagumo.ipynb

# FitzHugh-南雲モデルとは？

神経細胞（ニューロン）の発火モデル

```math
\frac{\partial V}{\partial t} = V - \frac{V^3}{3} - W + I \\
\frac{\partial W}{\partial t} = 0.08 (V + 0.7 - 0.8 W)
```

- $V$: 膜電位（＝ニューロンの出力）
- $W$: 不活性化を表す変数（＝ニューロンの内部状態？）
- $I$: 外部刺激電流（＝ニューロンの入力）

# Phase Portrait (状態遷移図？)

![phase.png](https://qiita-image-store.s3.amazonaws.com/0/202534/2809ad20-7992-d164-d9b3-40aaf876c044.png)

$I = I_{th} = 0.325$ とし、 $(V, W)$ 平面で $(\frac{\partial V}{\partial t}, \frac{\partial W}{\partial t})$ を矢印で示した
つまり、時間が経つと矢印の向きに $(V, W)$ が変化する

青のラインは $\frac{\partial V}{\partial t}=0$
矢印が右向きか左向きかの境目

オレンジのラインは $\frac{\partial W}{\partial t}=0$
矢印が上向きか下向きかの境目

青とオレンジのラインの交点は停留点となる

# 準しきい値付近での振る舞い

モデルの振る舞いは準しきい値 $I_{th} = 0.325$ の付近で大きく変化する

## 準しきい値より大きいとき
$I = 0.33 > I_{th}$

![p033.png](https://qiita-image-store.s3.amazonaws.com/0/202534/926a735f-b69d-d52c-90c7-5551cea67417.png)

![w033.png](https://qiita-image-store.s3.amazonaws.com/0/202534/bc832764-e437-c20b-d41d-4378dd129c91.png)

発火が続く

## 準しきい値より小さいとき
$I = 0.32 < I_{th}$

![p032.png](https://qiita-image-store.s3.amazonaws.com/0/202534/e8a6c9ae-676c-d1ce-3046-dbd6c2691c18.png)

![w032.png](https://qiita-image-store.s3.amazonaws.com/0/202534/4256364d-867e-0918-a7cc-d6d8491cd0c6.png)

発火しない

## 準しきい値付近で揺らぐとき

ニューロンはつながってネットワーク構造を形成する
したがって、現実的に見れば入力が変化する
とりあえず入力の変化を単純化し、 $I$ に乱数を加えてみる

![prnd.png](https://qiita-image-store.s3.amazonaws.com/0/202534/1037fdf1-06fd-3ab9-4244-12d9f85ea18b.png)

![wrnd.png](https://qiita-image-store.s3.amazonaws.com/0/202534/7f1aa730-fe09-9e35-e7d4-d6afe4039cda.png)

発火するときとしないときがあり、それっぽい感じに

# Excitation block（興奮／発火阻害？）

## 阻害されない条件

$I = 1.4$
準しきい値よりもずっと大きい値

![p14.png](https://qiita-image-store.s3.amazonaws.com/0/202534/f2ad9386-9c54-8782-c035-d537ae266b02.png)

![w14.png](https://qiita-image-store.s3.amazonaws.com/0/202534/461bb5d4-b0ec-fbdc-1b91-13ab78cdd3a0.png)

$I = 0.33$ のときと同じように発火が続くが、パルス幅がだいぶ広くなっている
パルス幅変調と捉えてよいかもしれない
発火周期はほとんど変化していないようだ

## 阻害される条件

$I = 1.5$
さっきの値より少し大きい

![p15.png](https://qiita-image-store.s3.amazonaws.com/0/202534/f35ce1f0-cf17-febf-b4b5-623ff94b689d.png)

![w15.png](https://qiita-image-store.s3.amazonaws.com/0/202534/6f033e84-a8c2-151a-1ed3-eb4a231b3a60.png)

パルスが消失した
出力電圧自体は発火してないときよりも大きい

# １次元鎖での振る舞い

ここまではニューロン１つを扱っていたが、ニューロンを１次元鎖状につなげ、近くのニューロンと拡散により相互作用する系を考える

ちなみに、無脊椎動物がもつ電気シナプスでは、ギャップ結合を介してイオンや細胞内メッセンジャーが拡散するらしい[^oka]
また、電気シナプスは、

> 化学シナプスと比べて信号伝達が速いこともあり、無脊椎動物では反射に使われる[^aihara]

とのこと

[^oka]: 岡良隆：基礎から学ぶ神経生物学（オーム社, 2012）pp93-94
[^aihara]: 合原,神崎：理工学系からの脳科学入門（東大出版, 2008）pp50-51

## V の拡散

W は拡散させない
$I = 0.2$

### V=0.5 @左固定端

![fitz-fix.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/41c5d5b5-bff5-95bf-1302-f4aa1d9740ed.gif)

進行波（１回のみ）

### V=1.5 @左固定端

![fitz-fix.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/c702c148-f944-f32c-6c78-3e286ec35db8.gif)


進行波（繰り返し）

## V と W の拡散

$I = 0.36$
拡散係数 $D_v < D_w$

![fitz-patt.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/527a1882-2a61-efc4-b3fe-56d539825ead.gif)

パターン形成
アルゴリズム入門③探索

# はじめに
エンジニアであれば最低限知っておきたいアルゴリズムの知識のうち、探索に関してまとめました。

以下の記事も参考にしてください。
[アルゴリズム入門①計算量とソートの基本](https://qiita.com/kamezaki/items/8f04771b1babd616a3f0)
[アルゴリズム入門②実用的なソート](https://qiita.com/kamezaki/items/4e70372db6573ce82d51)

# 探索とは
> 探索(あるいは検索)とは、データの集合の中から目的の要素を探し出す処理

です。基本的な探索のアルゴリズムは以下の三つです。

1. 線形探索
2. 二分探索
3. ハッシュ法


## 1. 線形探索(linear search, sequential search)とは
配列の先頭から各要素を目的の値と等しいかどうか調べていく方法です。
効率は悪いですが、データの並び方に関係なく適用することができます。 
計算量は$O(n)$になります。
 
### 練習問題
[Linear search | Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_A&lang=jp)

## 2. 二分探索(binary search)とは
ソート済みの配列から、データの大小関係を利用して高速に探索を行う方法です。

以下のように探索を行います。

1. 配列の中央の要素を取り出す。
2. 目的のキーが中央の要素のキーと一致すれば、探索を終了する。
3. 目的のキーが中央の要素のキーより小さければ前半を、大きければ後半を探索の範囲として1へ戻ります。

以上のような形で探索を行うことで、毎回探索の範囲が半分になっていくので、高速に探索を行うことができます。 
計算量は$O(logn)$になります。

### 練習問題
[Binary Search | Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_B&lang=jp)

## 3. ハッシュ法とは
ハッシュテーブルと呼ばれる表を用いたアルゴリズムで、ハッシュ関数(hash function)によって、要素の格納場所を調べるため、$O(1)$で探索することができます。

参考: [ハッシュテーブルと二分木について調べたこと](https://qiita.com/kamezaki/items/c60fbc3b7c0fde1f619c#_reference-da35526ba77d6aae86b7)

1. 要素のキーを引数とし、ハッシュ関数の呼び出しを行う。
2. 1で得た値で位置を特定する。

### 練習問題
[Dictionary | Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_C&lang=jp)
opencvのインストール(anaconda)

# 環境
windows10環境
コマンドプロンプト使用
# anaconda インストール
WEBサイトからインストールする
# anaconda 環境作成
```
conda create -n opencv python=3.5 anaconda
```
opencv3はpython3.6に未対応
# anaconda 環境アクティベート
```
activate opencv
```
## anaconda 環境の確認
```
conda info -e
```
# opencv インストール
```
conda install -c menpo opencv3
```
# 確認
```
ipython
import cv2
exit
```
エラーが出なければOK
# anaconda 環境ディアクティベート
```
deactivate
```
# anaconda 環境削除
```
conda remove -n opencv --all
```
Shim と Polyfill

以前から **Shim（シム）** と **Polyfill（ポリフィル）** の違いが気になっていたので、調べてみました。

ググってみると、2ality.com のブログにたどり着きました。2011年12月とかなり古いです。

[What is the difference between a shim and a polyfill?](http://2ality.com/2011/12/shim-vs-polyfill.html)

# Shim

同ブログから引用します。

> Shim. A shim is a library that brings a new API to an older environment, using only the means of that environment.

つまり Shim とは、**古い環境で新しいAPIを使うためのライブラリ**のことを指すようです。
こちらも参考になりました。

[Shimの意味 - Qiita](https://qiita.com/ironsand/items/4f0342f5914a9ae99b0e)
[Shim (computing) - Wikipedia](https://en.wikipedia.org/wiki/Shim_(computing))

# Polyfill

続いて引用します。

> Polyfill. In October 2010, Remy Sharp blogged about the term “polyfill” [via Rick Waldron]:
> ...
> Thus, a polyfill is a shim for a browser API.

つまり Polyfill とは、**ブラウザAPIのための Shim** を指すようです。Web (Browser) API というコンテキストに限定された意味になるようですね（2010年10月のブログで初出？）。
こちらも参考になりました。

[What is a Polyfill?](https://remysharp.com/2010/10/08/what-is-a-polyfill/)
[Polyfill (programming) - Wikipedia](https://en.wikipedia.org/wiki/Polyfill_(programming))

# まとめ

Shim はプログラミング一般で使われるのに対して、Polyfill は JavaScript、特に Web（Browser） というコンテキストで使われる、という違いがあることが分かりました。

[es-shims](https://github.com/es-shims) の GitHub リポジトリなど、まさにその例ですね（厳密には Polyfill だと思いますが…）。