OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryを用いて別のWebサイトから一部を抜き出し挿入する

調べると色々出てくるのですが，自分の環境ではどれもうまく動かなかったので，うまくいった例を共有します．

使用環境は次の通りです．

* firefox 50.0

---

# 外部サイトにアクセスする

まず，Ajaxで行うという前提ですが，次のようなコードを書いたとします．

```
$.ajax({
    url: 'http://qiita.com/tags/Python',
    type: 'GET',
    success: function(data) {
      console.log("success!");
    }
  });
```

これを実行すると，次のようなエラーが出ました．

```
クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、http://qiita.com/tags/Python にあるリモートリソースの読み込みは拒否されます
```

どうやら **クロスオリジン HTTP リクエスト** というものを行う必要があるらしく（私もよくわかっていないのですが）調べると次のサイトが出てきました．

http://konbu13.hatenablog.com/entry/2014/03/23/122606

どうやら，https://github.com/padolsey-archive/jquery.fn/blob/master/cross-domain-ajax/jquery.xdomainajax.js をダウンロードして読み込むと，うまくいくそうです．

これで"success!"とのログが出るので，サイトのアクセスはうまくいきました．

---

# サイトから取ってきたデータを処理して追加する

次にサイトから返ってきたデータをHTMLにパースし，必要なデータを切り出す必要があります．

方法を探すと http://qiita.com/yumetodo/items/00b37234cb86e741f0fb が見つかったのですが，次のようなコードを書いたところ動作しませんでした（これが間違っていたら申し訳ないです…）

```
$(function() {
    $.ajax('http://qiita.com/tags/Python', {
        timeout : 1000, // 1000 ms
        datatype:'html'
    }).then(function(data){
        var out_html = $($.parseHTML(data));//parse
        $('#container').empty().append(out_html.filter('.tagShowTopList_targetName a')[0].innerHTML);//insert
    });
});
```

```
TypeError: out_html.filter(...)[0] is undefined
```
というエラーが出てしまうんですよね…

先ほどのサイト（http://konbu13.hatenablog.com/entry/2014/03/23/122606
）に則ってやると，うまく切り出せましたが，一度HTMLをサイト内に展開する必要があり美しくないかなと思い，別の方法を模索した結果，

```
$(function() {
  $.ajax({
    url: 'http://qiita.com/tags/Python',
    type: 'GET',
    success: function(data) {
      var out_html = $($.parseHTML(data.responseText));
      $('#container').empty().append(out_html.find('.tagShowTopList_targetName a'));

    }
  });
});
```

とすれば動くことがわかりました（画像のサイズが統一されていないですが…）
変更点は，

* ```$($.parseHTML(data)``` => ```$($.parseHTML(data.responseText))```
* filter関数 => find関数

です．

私はJavaScript初心者なのでどうしてサイトの方法では動かなかったのかわかりませんでしたが，判明し次第追記したいと思います．
iOSアプリでFacebookのような画像ビューアを使う

写真を使ったSNSアプリを作ることになり、画像ビューアのライブラリを探すのに結構苦労した。（日本語の記事少ない泣）
初心者なもので、簡単にかけるやつがいい...
と切に願っていたら本当にあったので、メモがてらに書きます。

Swift3.0
Xcode8

#SKPhotoBrowser

[SKPhotoBrowser](https://github.com/suzuki-0000/SKPhotoBrowser/tree/master/)

Swift3を使用している場合は以下のようにPodfileに書き込む
```
pod 'SKPhotoBrowser', :git => 'https://github.com/suzuki-0000/SKPhotoBrowser.git', :branch => 'swift3'
```
```
pod install
```

1.UIImageから写真を持ってくる場合

```
// 1. create SKPhoto Array from UIImage
var images = [SKPhoto]()
let photo = SKPhoto.photoWithImage(UIImage())// add some UIImage
images.append(photo) 

// 2. create PhotoBrowser Instance, and present from your viewController. 
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
presentViewController(browser, animated: true, completion: {})
```

2.URLから画像を引っ張ってくる場合

```
// 1. create URL Array 
var images = [SKPhoto]()
let photo = SKPhoto.photoWithImageURL("https://placehold.jp/150x150.png")
photo.shouldCachePhotoURLImage = false // you can use image cache by true(NSCache)
images.append(photo)

// 2. create PhotoBrowser Instance, and present. 
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
presentViewController(browser, animated: true, completion: {})
```


3.ローカル環境から画像引っ張ってくる場合

```
// 1. create images from local files
var images = [SKLocalPhoto]()
let photo = SKLocalPhoto.photoWithImageURL("..some_local_path/150x150.png")
images.append(photo)

// 2. create PhotoBrowser Instance, and present. 
let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
presentViewController(browser, animated: true, completion: {})
```

上記コードのどれかを、UIButtonのアクションに書けば完成。
超簡単。

```
@IBAction func tapImageButton(_ sender: Any){
         
var images = [SKPhoto]()
let photo = SKPhoto.photoWithImageURL("https://placehold.jp/150x150.png")
photo.shouldCachePhotoURLImage = false // you can use image cache by true(NSCache)
images.append(photo)


let browser = SKPhotoBrowser(photos: images)
browser.initializePageIndex(0)
presentViewController(browser, animated: true, completion: {})

}
```

ちなみに上のコードだと、viewに遷移するときのアニメーションがFacebookっぽくないので、
browserを、

```
let browser = SKPhotoBrowser(originImage: some_UIImage, photos: some_[SKPhoto], animatedFromView: your_image_view)
```

で指定してやると、Facebookっぽく、画像からニュイっとアニメーション遷移される。（この表現で伝わると信じてる）


初心者の僕でも5分くらいで実装できたので、結構オススメ。
他にいいのあったら是非教えてくださいー
スクリーンロックを画面からショートカット(ホットコーナー)

# ホットコーナーって？
### 画面の四隅にカーソルを移動させることで特定の機能を呼び出す機能。

# 設定方法
「システム環境設定」->「デスクトップとスクリーンセーバ」->「スクリーンセーバ」タブの右下にホットコーナー設定ボタンがある。
上下左右どこでもいいので、「ディスプレイをスリープさせる」を設定して終了。

ex.
左下に「ディスプレイをスリープさせる」を設定した場合、カーソルを画面の左下に持っていけば、スリープが発動する。
Amazon Echo dotで英語からドイツ語に音声通訳させてみた

## はじめに
　AWS re:Inventの参加者にAmazon Echo dotが配布されたので、早速Skillを作ってEcho dotで動かしてみました。折角なら音声認識っぽいということで音声通訳にチャレンジです。現時点でEchoに搭載されている音声認識技術のAlexaは英語とドイツ語のみに対応しているので、英語で話しかけるとドイツ語に翻訳されるようにしました。

## 技術習得にあたって
　とはいえ、Alexaを扱うの初めてて、右も左もわからなかったので、会場に設置されているHands-onラボ（パソコンが数十台並んでいてIBTで自習できる）でまずは基本的な開発の仕方を学習しました。これが恐ろしいほど簡単で、1時間ほどでAlexaとAWS Lambdaを使って一通りのことが出来るようになりました。すでにLambdaを理解している人にはびっくりするくらい面白いツールだと思います。
　Alexa側の開発画面にはテストツールも用意されていて、Lambdaが返したメッセージを音声で読み上げてくれたりするので、Echo本体がなくても開発・テストをすることが出来ます。

## 利用したコンポーネント
### Amazon Developer Console https://developer.amazon.com/home.html
　AlexaはAmazonの技術ですが、AWSではないので別の管理コンソールがあります。こちらも非常に簡単なものなので、これまでAWSの管理やソーシャルサービスの連携アプリなんかの経験がある人なら直ぐに扱えると思います。

### AWS Lambda
　サーバーサイドはLambdaで動きます。上記のAlexa側にはLambdaのARNを指定し、Lambda側にはTriggerにAlexa Skill Kitを追加するだけです。サンプルコードが用意されているので、リクエストのレスポンスのJSONも直ぐにわかります。

### Microsoft Translate API https://msdn.microsoft.com/en-us/library/ff512421.aspx
　Google翻訳を使いたかったのですが、有償ということなので無償のMSの翻訳APIを使っています。ただ、どうもアクセストークンの相性が悪いようで、連続使用するとエラーになります。ここはもう少し解析しておきたいところです。

## 実際の動画
　こんな感じで翻訳されます。https://youtu.be/HlFI25AWy2Q

## 今後に向けて
　翻訳周りのAPIを見直すのと（出来ればGoogle翻訳のほうがいいかなぁ）、本日の基調講演でAWSの音声読み上げ機能でAWS Pollyを使って英語から多言語への翻訳に対応させてみようと思います。ドイツ語であればAlexaが読み上げに対応しているので、Lambdaからテキストメッセージを返せば良いのですが、それ以外の言語は翻訳された外国語をPollyで音声データに変換して、Alexaに渡してあげることで対応できそうです。っていうところ、明日のイベントの合間にコツコツと試してみようと思います。
MACでWindowsみたいにスクリーンロックする方法

以下の2ステップで実施出来るようになります。
### [Step.1] MACの設定を変更する
システム環境設定を開く。
<img width="275" alt="スクリーンショット 2016-11-21 11.12.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/149555/ab21237e-0e20-fc10-89ab-84c3cf0bd114.png">

セキュリティとプライバシーを開く。
![mac01.png](https://qiita-image-store.s3.amazonaws.com/0/149555/8a50b1d9-7bfb-ae3d-b264-6ddde6119457.png)

以下の設定を行う。
![mac02.png](https://qiita-image-store.s3.amazonaws.com/0/149555/4253e03d-db28-2105-ab2f-18dd020bbbe3.png)

### [Step.2] ショートカットキーを入力する
`Ctrl + Shift + 電源ボタン`を押すと、Windowsの`Winキー + L`と同様の動きになる。
Oracle DBA & Developer Day 2016(DDD 2016) の セッション資料 が公開されました。

タイトルの通り、去る2016年10月27日に開催された
Oracle DBA & Developer Day 2016(DDD 2016) の資料が公開されたやで。
彡(^)(^)

> * Oracle DBA & Developer Day 2016 の セッション資料  
> http://www.oracle.com/technetwork/jp/ondemand/ddd-2016-3373953-ja.html

ワイらの講演資料はこちら。

> * オラクル・コンサルが語る！ SQL性能を最大限に引き出す<BR>
> DB 12cクエリー・オプティマイザ 新機能活用と統計情報運用の戦略  
> https://www.slideshare.net/shibataayumu/ddd-2016-db-12c  
> ~~http://otndnld.oracle.co.jp/ondemand/ddd-2016/DD2-5.pdf~~

他の皆様の資料も必見やで彡(ﾟ)(ﾟ) ワイも見とかんと(使命感)
Advent Calendarに初参加する

AdventCalendarというのは、クリスマスまでの１日１日に、一つずつ窓を開いていくカレンダーのことを指すそうだ。AIやIoTに関する記事を1日ずつ、載せていけたらいいですね。

[アドベントカレンダー - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC)
swift3で文字列をsplitする

# Swift3で文字列をsplitする
String型の日付を"/"でsplitしたかったんだけど、なかなか見つけれなかったのでメモ

```swift:
let str = "2016/01/31"
let split = str.components(separatedBy: "/")
print(split)
// => ["2016", "01", "31"]
```

2系でのcomponentsSeparatedByStringとかcharacterに変換してとかはあったけど、components使う形のが見当たらなかった。

ちゃんとマニュアル読もう。。
https://developer.apple.com/reference/swift/string


---
#### 2017/9/14　追記
Xcode 9.0以上でsplitがbeta版でできたらしい。
https://developer.apple.com/documentation/swift/string/2894564-split

---
同一フォルダ内のすべてのファイルの１行目と２行目を読み込んで、１つのテキストファイルに保存するVBSプログラム

　３年ほど前に、回答者から回収した回答テキストファイルのファイル名と１行目の回答者情報と２行目の評価点をまとめて記録する必要が出てきて、このコードを書きました。
　拡張子チェックや文字コードチェックはしていないので、もし必要であればForループの中でif処理をすることになります。当然、同一フォルダ内ということは、このファイルの２行分のコードも吐き出し先の"FOKekka.txt"に記録されます。

---
```2行読取.vbs
Option Explicit
Dim objFS
Dim objFolder,objFile
Dim EFiles
Dim strWSPath,strSeitoNo
strWSPath = "./"
Dim strSubFilesName,strOrgFile,strOrgFilePath,strYet
strSubFilesName = ""
Dim x
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(".\")
Set EFiles = objFolder.Files
Dim FileObj,LineObj
Dim endsw
Dim suu
Dim Linerec,recobun
Dim hyoujibun
Set FileObj=CreateObject("Scripting.FileSystemObject")
Dim oHFL
Set oHFL = FileObj.CreateTextFile("FOKekka.txt", True)
endsw=0
suu=0
hyoujibun=""

For Each x In EFiles
    strOrgFile = x.Name
    strOrgFilePath = strOrgFilePath & x.Name & vbCrLf
    Set LineObj=FileObj.OpenTextFile(strOrgFile)
    suu=suu+1
    Linerec=LineObj.ReadLine()
    hyoujibun=hyoujibun & Linerec &vbCrLf
    oHFL.WriteLine(Linerec)
    Linerec=LineObj.ReadLine()
    hyoujibun=hyoujibun & Linerec &vbCrLf
    oHFL.WriteLine("    " & Linerec)
    LineObj.Close()
Next
msgbox hyoujibun,, "ファイル内容"
msgbox suu & "件",,"ファイル件数"
MsgBox ("  ファイルリスト" & vbCrLf & strOrgFilePath)

Set oHFL = Nothing
Set EFiles = Nothing
Set objFile = Nothing
Set objFS = Nothing
```
---
　例えば、４０人の回答ファイルを、ＧＵＩ操作で開いてはの２行分をCopy&Pastしていては、１０分前後かかります。ましてやファイル名も取ろうとするとさらに３分以上かかるでしょう。それをこのコードを働かせれば一瞬で完了します。昨今のプログラミング教育論争を見聞しつつ、プログラミングが何の役に立つのかという疑問への即物的な回答がこのようなことだと考えたりするわけです。

---
　もっとも、このプログラムを開発するためにWSHのフォルダオブジェクトとファイルオブジェクトの特性やメソッドを調べる必要があり、３時間以上費やしました。まだ時間的な元は取れていないので、ここに公開しました。実用的にでも、教材としてでも参考にしていただければ幸いです。
[ESLint] "window" is not definedで怒られないようにする

# 内容
eslintで`no-undef`のルールを定めている場合、`window`などのグローバルな変数もエラーとなってしまうので、エラーとならないようにする設定を記載します。

# 設定
といってもやることは簡単で、設定ファイル（.eslintrcまたはeslintConfigまたはpackage.json）に`"globals"`を定義するだけでした。

```js:.eslintrc
{
  ...
  "globals": {
    "window": true
  },
  ...
}
```
Ubuntu 14.04 で neovim・dein.vim を使ってみる

Ubuntu 14.04 に neovimをインストールしてみましたので、その時のメモ。
なぜUbuntuなのかといわれると、自分が最近Ubuntuをコンソールとして使っているからです。

## 事前準備  
```
pip3 install neovim
sudo apt-get install git libtool autoconf automake cmake g++ pkg-config unzip  
```
※ pip3 install neovimは、deopleteというpluginをインストールしたいので実行しています

## neovimインストール  
neovimをインストールします。好きなディレクトリにインストールして下さい。
今回はホームディレクトリ以下にインストールします。

```
$ cd ~/
$ git clone https://github.com/neovim/neovim.git
$ cd neovim
$ make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim"
$ make install
$ mkdir -p ~/.config/nvim
```

neovimにパスをとおすため、下記を~/.bashrcなどに追加します。

```~/.bashrc
export PATH="$HOME/neovim/bin:$PATH"
```

sourceコマンドを実行。

```
source ~/.bashrc
```

neovimの設定ファイルを配置します。

```~/.config/nvim/init.vim 
" dein.vim設定
set runtimepath^=~/.deinvim/dein/repos/github.com/Shougo/dein.vim

if dein#load_state('~/.deinvim/dein')
  call dein#begin('~/.deinvim/dein')
  call dein#load_toml('~/.deinvim/dein.toml',{'lazy' : 0})
  call dein#load_toml('~/.deinvim/dein_lazy.toml',{'lazy' : 1})
  call dein#end()
  call dein#save_state()
endif

if dein#check_install()
  call dein#install()
endif

" deoplete設定
let g:deoplete#enable_at_startup = 1

" vim設定
syntax on
set number
set cursorline
set cursorcolumn
set whichwrap=b,s,[,],<,>
set autoindent
```

## dein.vimインストール
```
$ mkdir ~/.deinvim
$ cd ~/.deinvim
$ wget https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh
$ sh ~/.deinvim/installer.sh ~/.deinvim/dein
```
設定ファイルを配置します。

```~/.deinvim/dein.toml
[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'Shougo/vimproc.vim'
build = 'make'

[[plugins]]
repo = 'Shougo/neosnippet-snippets'
```

```~/.deinvim/dein_lazy.toml 
[[plugins]]
repo = 'Shougo/neomru.vim'
on_path = '.*'

[[plugins]]
repo = 'Shougo/neoyank.vim'
on_path = '.*'
on_i = 1

[[plugins]]
repo = 'Shougo/unite.vim'
depends = 'neomru.vim'

[[plugins]]
repo = 'Shougo/neosnippet'
depends = ['neosnippet-snippets']
on_i = 1
on_ft = ['snippet']

[[plugins]]
repo = 'Shougo/deoplete.nvim'
if = 'has("nvim")'
on_i = 1
```


## pluginインストール
ここまで設定が完了すれば、neovimを起動するだけでpluginをインストールできるはずです。
単に"nvim"と入力するか、"nvim ファイル名"と入力すれば、neovimを起動できます。

```
$ nvim
```

deopleteをインストールした人は、nvim起動中に下記コマンドも実行

```
:UpdateRemotePlugins
```


## その他

dein.tomlやdein_lazy.tomlに変更があった場合は下記を実行して下さい。
pluginをアップデートできます。

```
:call dein#update()
```
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectEnterとOnObjectExit

今年も参加してます、[FileMaker Tips AdventCalendar](http://qiita.com/advent-calendar/2016/filemaker-tips)。
今回は、スクリプトトリガを取り上げています。
実行環境は、FileMaker Pro Advanced 14なので、バージョンが13以下の場合は利用できないものがあるかもしれあせんが、ぜひ新しいバージョンで実装をしてみてください。^^

今日は、[OnObjectEnter](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.2.html)と[OnObjectExit](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.7.html#432575)です。

OnObjectEnterで何かを動かし、OnObjectExitで何か別なことをします。
動きを確認してみます。

↓このyoutubeをどうぞ。
[OnObjectEnterとOnObjectExitの動き](https://youtu.be/Hbj3NTC4Xn0)
名前フィールドに入ると、フラグというフィールドに「入ったよ」という文字列をセットし、名前フィールドを出ると「出たよ」という文字列を同様のフィールドに入れます。

スクリプトトリガは、OnObjectEnterとOnObjectExitそれぞれに違うスクリプトをセットしています。
![スクリーンショット 2016-12-01 16.58.41.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f861338b-fb38-abd8-8241-2f67f2ba0501.png)

OnObjectEnterもOnObjectExitも、今回の実装では単純です。
・OnObjectEnter
![スクリーンショット 2016-12-01 17.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/60538/566bc0cd-bc6e-b6c7-fab1-f6eca17684a5.png)

・OnObjectExit
![スクリーンショット 2016-12-01 17.00.32.png](https://qiita-image-store.s3.amazonaws.com/0/60538/cc2a642d-15dc-d265-4386-4ed612877102.png)

今回のスクリプトは、通常の入力時に実行されるものです。
でも、検索をする際に、「Aフィールドにこの文字列が入ったら、Bフィールドはこの文字列を固定で」ということはありませんか？
いわゆる入力値に対する規定値（デフォルト値）というところでしょうか。

その際は、スクリプトトリガの有効設定で、「検索」にチェックを入れます。
![スクリーンショット 2016-12-01 17.13.19.png](https://qiita-image-store.s3.amazonaws.com/0/60538/cc1eb655-7e11-cf98-0fdf-340696b3931d.png)
よく見ると、「ブラウズ」にもチェックが入っていますね。
これはどう処理するかというと、、、

実行するスクリプトの中で、「ウィンドウモード」が今何になっているかを"[Get(ウィンドウモード)](https://www.filemaker.com/help/14/fmp/ja/html/func_ref1.32.172.html#98802)"で取得します。
![スクリーンショット 2016-12-01 17.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/60538/47964e8e-d4e6-c29b-6773-5c2136a17365.png)
ウィンドウモードが1の時、検索モードです。

いかがでしたでしょうか？
OnObjectEnter,OnObjectExitというトリガを、ブラウズと検索モードで活用する例をお送りしました。
もしもあの機能が標準化したら

# 例えば、コンポーネント化
下記のようなコンポーネント化がJSを書く必要がない形で標準化したとする。

```html:HTML
<myHeader></myHeader>
<myComponent></myComponent>
<myFooter></myFooter>
```

## いらなくなるもの
- コンポーネント化するためのJSの処理。
- React
- Riot
- 静的サイトジェネレータ

# 例えば、DOM操作＋変数処理
擬似コードにするとこんな感じのことが標準で可能になったら。

```html:HTML
<p>{title}</p>

<ul>
each {
  <li>{item}</li>
}
</ul>
```

## いらなくなるもの
- jQuery
- Slim
- 静的サイトジェネレータ

# 標準化するといろんなものが要らなくなる
- フレームワークやツールは「今すぐやりたい」を叶えるもの。
- イケイケだぜー、これがトレンドだぜー、ナウいぜーっていうものが一斉に死滅する可能性がある。
- すぐにそうなるわけではないが、最先端のものを使おうとすると、そういう側面もまたある。
- ギャグのような冗長化が流行っているがなんとかして欲しい。

# 結局
- 基本を覚えるのが一番無駄にならないかも。
Railsで特定のversionのみmigrateする方法

migrateが実行されていないものを確認。

```
bundle exec rake db:migrate:status
```
Migration IDをメモる。statusがupになっているファイルはすでにmigrate済み。


```
Status   Migration ID    Migration Name
--------------------------------------------------
  up     20150107092204  Devise create admin users
  up     20150107092210  Create active admin comments
 down    20150107092210  Create active admin comments
```

これでok

```
bundle exec rake db:migrate:up VERSION=20150107092210
```
軸対称応力解析プログラムを用いた内圧を受けるトーラスの応力解析

Pythonで作成した軸対称応力解析プログラムの適用事例です．

## 理論解
トーラス(トロイダル・シェル)とは，下図左に示すように，円環を中心軸(ここでは鉛直軸)の回りに回転させた，ドーナツ状の立体である．

![tex_fig1.png](https://qiita-image-store.s3.amazonaws.com/0/129300/d2ec0ba5-6379-c6c5-5caa-c2caa8deae94.png)


上図右に示すように，均等内圧 p を受けるトーラスを考える．この場合，半径 a の円周方向軸力 $N_{\varphi}$ およびその軸方向軸力 $N_{\theta}$ は，Timoshenko (Theory of Plates and Shells) により，次式で与えられている．

$$
\begin{equation*}
N_{\varphi}=\cfrac{p a (r_0 + b)}{2 r_0} \qquad\qquad N_{\theta}=\cfrac{p a}{2}
\end{equation*}
$$

上式より，$N_{\varphi}$ は場所により変化するが，$N_{\theta}$ は，半径 a の円環上で均一な値をとることが分かる．
ここで，代表点での$N_{\varphi}$を書き直してみると，

$$
\begin{align*}
&N_{\varphi}=p a \left\\{1 + \cfrac{a}{2(b - a)}\right\\} & (r_0 = b - a) \\\
&N_{\varphi}=p a                                      & (r_0 = b) \\\
&N_{\varphi}=p a \left\\{1 - \cfrac{a}{2(b + a)}\right\\} & (r_0 = b + a)
\end{align*}
$$

となり，円環の内側，すなわち回転軸側 ($r_0 = b - a$) の円周方向応力が大きくなることがわかる．
また，半径 a の円環の頂部と底部の円周方向応力は，通常の均等内水圧を受ける半径 a の直線円環の周方向軸力と同じ値となる．

## 軸対称FEMによる解析
以下に示すトーラスの発生応力を，軸対称FEM解析にて予測した．解析条件は以下のとおり．ここに，t はトーラスを構成する材料の板厚を示す．

<table>
<tr><th>E (MPa)</th><th>po</th><th>p (MPa)</th><th>a (mm)</th><th>b (mm)</th><th>t (mm)</th></tr>
<tr><td>200,000</td><td>0.3</td><td>1.0</td><td>2,000</td><td>4,000</td><td>10</td></tr>
<tr><td colspan="6">要素数：360 (半径 a の円を中心角 1 度で分割)</td></tr>
</table>

軸対称FEMでは荷重は回転軸に対し 1 rad あたりの荷重を入力するようになっている．水圧についても例外ではなく，定義に忠実に荷重を作成・入力する必要があることに注意．

![tex_fig2.png](https://qiita-image-store.s3.amazonaws.com/0/129300/5a8c631e-28bf-2ef1-8cb3-3e4d8fd5cd8f.png)

上図右下の応力分布図において，
水平軸の角度は，変位図を参照して，
トーラス外側最外点（水平左端）をゼロとして，頂部が90度，回転軸側最内点が180度，底部が270度としている．

解析結果と Timoshenko の解との比較を下表に示す．

<table>
<tr><th>Location</th><th colspan="2">FEM</th><th colspan="2">Timoshenko</th></tr>
<tr><th>(&phi;) </th><th>&sigma;<sub>&phi;</sub></th><th>&sigma;<sub>&theta;</sub></th><th>&sigma;<sub>&phi;</sub></th><th>&sigma;<sub>&theta;</sub></th></tr>
<tr><td>  0 (r=b+a)</td><td>166.59</td><td> 99.54</td><td>166.66</td><td>100.00</td></tr>
<tr><td> 90 (r=b)  </td><td>198.43</td><td>105.62</td><td>200.00</td><td>100.00</td></tr>
<tr><td>180 (r=b-a)</td><td>300.54</td><td> 99.55</td><td>300.00</td><td>100.00</td></tr>
</tbody><tfoot class="tblcom">
<tr><td colspan="5">応力の単位は MPa</td></tr>
</table>

## プログラム
プログラムはGistへのリンクで示します．

+ [軸対称FEM解析プログラム (py_fem_asnt.py)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/1_py_fem_asnt.py)
+ [作図用データ作成プログラム (py_fig_data.py)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/2_py_fig_data.py)
+ [GMTによる変位モード・応力分布図作成スクリプト (a_gmt_gra.txt)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/3_a_gmt_gra.txt)
+ [トーラスモデル作成スクリプト (a_gmt_model.txt)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/4_a_gmt_model.txt)
+ [トーラス解析用入力データ (inp_torus.txt)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/5_inp_torus.txt)
+ [gnuplotによるトーラス作図スクリプト (gpl_torus.txt)](https://gist.github.com/damyarou/ec5d4052e4a852bef58381269bfa2eba/raw/6_gpl_torus.txt)

以　上
ViewPagerのスワイプを抑止する方法


こんなクラスを使う。

キモは、```onTouchEvent```、```onInterceptTouchEvent```の両メソッドをオーバーライドしてタッチイベントを奪ってしまうこと

```java
public class SwipeControlViewPager extends ViewPager {

    protected boolean enableSwipe = true;

    public ImageViewPager(Context context) {
        super(context);
    }

    public ImageViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setSwipeEnable(boolean enable) {
        this.enableSwipe = enable;
    }

    public void toggleSwipeEnable() {
        this.enableSwipe = !this.enableSwipe;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (enableSwipe) {
            return super.onInterceptTouchEvent(ev);
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (enableSwipe) {
            return super.onTouchEvent(ev);
        }
        return false;
    }
}
```
ROS用ワンライナー

# よく使っていたワンライナーのメモ
```bash
## /scanはsensor_msgs/LaserScan型のトピック
# 輝度の最大値を表示
rostopic echo /scan | grep inten | ruby -ne "i=gets.split(',').map(&:to_i).max();puts i"
# 輝度が1500を超えている点の個数を取得
rostopic echo /scan | grep inten | ruby -ne "i=gets.split(' ').map(&:to_i).select{|elem| elem>1500}.length;puts i"
```
test kitchen と bats で特定のユーザーでテストを実行する

# 概要

特定のユーザーで、batsのテストを実行したい

# 結論

```
run sudo -u ユーザー bash -l -c '実行したいコマンド'
```

# 例

```bash
#!/usr/bin/env bats

@test "conda is found for login user" {
  sudo -u vagrant bash -l -c 'set > /tmp/c.txt'
  run sudo -u vagrant bash -l -c 'which conda'
  [ "$status" -eq 0 ]
}
```

# 参考

* [Run bats test as "login user" · Issue #16 · sstephenson/bats](https://github.com/sstephenson/bats/issues/16)

# TODO

どこかに、`.kitchen.yml`の書き方があったとおもう。
その中に、sudoオプションについて書いてあったとおもうので、それを探す
Gulp+typescript+RequireJSで「Variable 'require' must be of type 'NodeRequire', but here has type 'Require'.」と怒られる問題に対応した

# 現象

TypeScriptコードをコンパイルする際、以下のエラーが表示されてコンパイルできなかった。

```sh
/path/to/project/node_modules/@types/requirejs/index.d.ts(416,13): error S2403: Subsequent variable declarations must have the same type.  Variable 'require' must be of type 'NodeRequire', but here has type 'Require'.
```

# 結論

tsconfig.jsonに使用する型定義ファイルを明記することで解決した。

```json:tsconfig.json
{
    "compilerOptions": {
        "types": [
            "requirejs"
        ]
    }
}
```

# 環境

## 関係するnpmパッケージ

- "gulp": "^3.9.1"
- "gulp-typescript": "^3.1.2"
- "requirejs": "^2.3.2"
- "typescript": "^2.0.6"

## 関係するファイル・ディレクトリ構造

```
project
├─node_modules
│  └─@types
│     ├─gulp
│     ├─gulp-typescript
│     ├─node
│     ├─orchestrator
│     ├─q
│     ├─requirejs
│     └─vinyl
├─src
│   └─ts
│      └─tsconfig.json
├─gulpfile.js
└─jsconfig.json
```

# 原因

typescript compilerが、`@types`以下の型定義ファイルを探してよしなにやってくれるらしい。
`@types/gulp`をインストールしたら`@types/node`も一緒にやってきてしまい、`@types/requirejs`とコンフリクトした。


# 雑感

- この対応方法のままいくと、参照したい型定義ファイルが増えるたびに修正が必要なのでつらい
    - 使用する各ファイルでreference path書くよりはマシだろうけれど
- excludeTypesとかあればうれしいのかしら

# 参考URL
- https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types
HFS plus

以前調べたメモを貼り付けておきます。
何かあればご指摘ください。

# HFS+

[OSXのファイルシステム(HFSの後継)](http://en.wikipedia.org/wiki/HFS_Plus)

##特徴

- データフォークとは別にリソースフォークがある (サイズはデータフォーク同様巨大にできる)
- 最大ボリュームサイズ、及び最大ファイルサイズ: 約8EB(OS X 10.5.3~)
- ハードディスク内を細かく管理できる
- Finder情報と呼ばれるメタデータがある (サイズは32Byte固定)
- 拡張属性(EA)と呼ばれるメタデータがある (サイズ制限は3802Byte)
- ファイル名禁止文字は「:」
- ファイル名の大文字小文字の区別は設定次第 (通常は区別なし)
- ファイル名は正規分解したUnicode (UTF-16)だが、一部例外アリの独自ルール
- タイムスタンプは1s単位
- ファイルやディレクトリにCNIDと呼ばれる番号を付けて管理する
- OS Xはメタデータが消えると致命的な場合がある

##[「Mac OS 拡張」について](http://macfan.jp/guide/2009/12/03/hdd_4.html)
> 
###【HFS+とFAT32はどう使い分けるか?】
まず、市販のHDDがFAT32でフォーマットされて売られているのには訳がある。それは広い汎用性を確保するためだ。古いMacユーザならば覚えているかも知れないが、もともとHDDは未フォーマットの状態で販売されており（内蔵も外付けも）、ユーザが自分でフォーマットしてから使う必要があったのだ。  
しかし、Macやウィンドウズが普及するにつれ、フォーマットしなくともすぐに使えるようにしてほしいというニーズが高まってきた。そのため現在では初期状態でFAT32フォーマットで出荷されるようになったのだ。  
FAT32の優れている点は、現行のMacとウィンドウズならHDDをつなぐだけですぐに使えるようになるという点にある。ユーザがどちらのOSを使うかはメーカーには分からないので、できるだけ幅広く対応するために、FAT32が使われているのだ（ちなみに、リナックスでもFAT32の読み書きは可能）。
とはいえ、冒頭のようにファイル容量に制限があるなど、FAT32も現在では万能とはいい難い。それでは、FAT32とHFS＋のどちらを利用すればいいのか？　以下に、FAT32とMacのHFS＋の特徴を簡単にまとめてみた。  
###【FAT32の主な特徴】
  - 大抵のOS（Mac OS、ウィンドウズ、リナックス）で読み書きできる
  - 1ファイルの最大容量が4GBまで
  - 1ボリュームの最大容量が2TBまで
  - ファイルのアクセス権限が設定できない
  - ファイルが断片化するのでデフラグが必要
> 
###【HFS＋の主な特徴】
  - 1ボリューム、1ファイル容量の上限が8EB（エクサバイト：1EBは100万テラバイト）と大きい（なお、10.1では2TB、10.2では8TB、10.3では16TBとMac OS Xでもバージョンによって異なる）
  - 記録テーブルの管理がしっかりしているためデフラグが基本的には不要
  - ファイル単位でアクセス権限を設定できる
  - ツール類を使わなければほかのOSからアクセスできない。  
> 
以上の特徴から、
####●Macでしか使わない、大容量ファイルを扱う=>HFS＋
####●複数のOS環境で共有する=>FAT32
というのが基本的な使い分けの基準になるだろう。ただ、Macとウィンドウズで大容量ファイルを共有したいといった特殊な場合は、ファイル共有機能を利用したり、別途サードパーティ製のツールを導入したりといった作業が必要になってくる場合もある。
SoftLayer(Bluemix Infrastructure)のVirtual Data Center（専用ラック）

#1. Virtual Data Center(VDC)とは
Bluemix Infrastructure（旧SoftLayer)では、物理サーバーや仮想専有サーバーを提供しており、ネットワークも利用者専用のネットワークポートやPublic VLAN/Private VLANを提供しています。サーバー自体は他の利用者と明確に分離されたシングルテナントな環境ではありますが、一般的には物理的な機器（ラックやルーターやスイッチ）は共有です。複数サーバーを購入した際には、サーバー自体は専有ですが、共有のラックや共有のスイッチの配下に配置されます。**物理的な機器は共有していますが、ネットワークはVLANで利用者ごとに分離されているため、サーバー間通信は安全に保たれています**。これは他の一般的なクラウド企業でも状況は同じであり、専用VLANを提供している代わりに仮想ネットワークで分離している程度の違いしかないと思われます。
今回ご紹介するVirtual Data Center(VDC）とは、さらにこの状況を推し進めて分離性を強化できるオファリングであり、**お客様ごとに専有ラックを提供**するというものです。クラウドなのに専有ラックや専有スイッチとは、なかなかびっくりです。Virtual Data Centerを利用することで、

- 物理的な配置場所やラックまで含めて利用者専有になる。
- ラック内のサーバーは自社サーバーのみを配置できる。
- ラックごとにサーバを収容するスイッチ（FCS（Frontend Customer Switch）やBCS（Backend Customer Switch））も利用者専有になる。
- 自社サーバー間通信がラック内折り返しになり、ラック間通信が発生しないので、高速になる。

という利点があります。**大手クラウド業者は仮想専有サーバー＋仮想ネットワークでサービス提供しているケースがほとんどですが、その中でもラックやスイッチレベルで専有化が図れるクラウドは珍しいですね！**

![VDC_component.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/041cedd0-f3e4-f56c-0226-9791c9bd174c.jpeg)
FCR: Frontend Customer Router
BCR: Frontend Customer Router
FAS: Frontend racks Aggregation Switch
BAS: Backend racks Aggregation Switch
FCS: Frontend Customer servers Switch
BCS: Backend Customer servers Switch


#2. 注意点

- VDCの注文はチケットで行う必要があります。Customer Portalから直接注文はできません。
- - 一般的にはVDCではFull Rackで44Uです。重量や配置の都合上、このスペースが全部使えない可能性があります。このラックに注文するサーバーが収まるかどうかは、事前にチケットでレビューをしてもらった方が良いでしょう。
- VDCにサーバーを配置する場合は、1) あらかじめQuoteを作っておいて、TicketでVDCに配置して欲しいと依頼するか、2) サーバーをいったん通常通りプロビジョニングした後、チケットでVDCに移動してくれと依頼する、のどちらかになります。
- 月額物理サーバーやVyatta Gateway Applianceのみ配置できます。仮想サーバーや時間課金の物理サーバーやNetSCaler VPXは予め構成済み環境でプールされて利用しているため、VDCには配置できません。Endurance Storage/Performance Storageも共有の外部ストレージなので当然配置できません。
- 持ち込み機器を配置するための環境ではありません。あくまでBluemix Infrastuctureのサーバーを配置するためのラックです。
- 別途施錠などを行うといったカスタマイズを行うことはできません（もともとは、セキュリティー目的というよりは、性能目的のためのオファリングです）。
- 納期に数日かかる可能性があります。Bluemix Infrastructureの内部承認も必要になるので、事前に価格や納期についてはチケットで確認しておいた方が良いでしょう。**ただし、私の場合は承認を終えてVDCを作ってもらうまで、たった一晩で済みました。**



#3. 確認方法
##3.1 Order確認
実際に注文を終えた後は、Account -> Sales -> Ordersから確認が可能です。
![VDC.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/d3adbc48-5fa7-54a6-9a65-3932a3de3c20.jpeg)

##3.2 自分の物理サーバーがVDCに配置されているかどうかの確認
VDCが無事に準備できたら、**あなたのVDCはtok02.sr01.rk99ですよ**みたいな形でTicketで教えてもらえます。tok02.sr01.rk99の場合だと、tok02はデータセンター名、sr01はサーバールーム名、rk99がラック情報です。以下のAPIを利用して、自分のサーバーがVDCで指定された場所に配置されているかを確認することができます。
http://qiita.com/testnin2/items/35d269daf7c6966624f7

##3.3 Customer PortalからVDCに配置されているかどうかの確認
本当はCustomer Portalから確認できるといいのですが、結構難しいですね。すっきりしたやり方ではありませんが、、、Customer Portalにおいて、Network -> Status -> Localから自分のサーバーがどのスイッチに接続されているかが分かります。VDCに配置されているサーバーは全部同じスイッチに刺さっているハズなので、それでおかしいかどうかは確認できるでしょう。
初めてGo言語をさわる

# 初めてのGo言語
今まで興味はあったけど、一回もGo言語を触ったことがなかったから、
勇気を出して一発触ってみたよ。

# 開発環境がない
まず開発環境がないので、開発環境を整えるよ。

## 1. Go言語をMacで使用できるようにする。
*事前にbrew installをできるようにする必要があるよ。*

このコマンドをぶっ叩く。

```
$brew install go
```

終わったら、バージョン確認

```
$go version
```

バージョンが出てきたらOK。


## 2. Go言語に合わせたATOM環境を作る。

今回ぶちこんだPackage

* autocomplete-go
    * Go言語用の入力予測をしてくれる優しいやつ。
* language-go
    * ATOMがGo言語をサポートしてくれるようになるやつ。

## Hello Worldやってみる。

### コーディングする
hello.go を作成して、コードを実際に書いてみる。

```
package main

import "fmt"

func main() {
  HelloWorld()
}

func HelloWorld() {
  fmt.Println("Hello World")
}
```

### 実行する。
terminalから以下のコマンドを打つ。

```
$go build hello.go
```

これを行うと、helloという実行ファイルが作成されるので、次はこのコマンドを実行する。

```
$./hello
```

すると、Hello Worldと表示された。
なまら簡単。


## 感想。
たったこれだけでGo言語使った新世界にハローできました。
気分最高ですね。

実際にプラグインを使ってみても、かなり書きやすい雰囲気がありました。
ATOMはどんどん書き込むと予測が増えていく仕組みもあるみたいなので、
どんどん書いて行きます。

駄文でしたが、参考になれば幸いです。
あざっす。
Laravel5のwithが思っていた以上に高性能

注意：ある程度LaravelのEloquentについてわかっている前提で書いてます。

関連したEloquentを取ってくるのにクエリの数を減らすためにwithを使いますが
思っていた以上に複雑なことができることを知ったので書き留めておきます。
ちなみに使用しているのはLaravel 5.1です

Reservation    予約情報
ReservationDay 日毎の予約情報
Room           部屋

例として上記のようなテーブル構成で
Reservationに対して日毎にReservationDayが存在し
ReservationDayにRoomが紐付いている構成です。

特定日の予約を一覧で表示するページでかつ
日毎の予約情報も必要な場合はwithを使って
特定日に絞った条件で取得することができます。
さらにwithの中でwithだってできます。

```
$date = '2016-12-01';
$reservations = Reservation::where('start_date', '<=', $date)
                           ->where('end_date', '>=', $date)
                           ->with([
                               'reservationDay' => function($query) use ($date){
                                   $query->whereStayDate($date)->with('room');
                               },
                           ])
                           ->get();
```

まぁReservationRoomが1件だけ必ず存在すると担保していても
1件ではなく複数件として認識されるところはどうにもできなかったので

```
@foreach ($reservations as $reservation)
  @var ('reservationRoom', $reservation->reservationDay->first())
```

こんな感じでView側で変数再定義しちゃってます。
@var部分はBladeを拡張して変数定義できるようにしたやつなので
需要があればで書くかもしれませんが今回は割愛します。

あとがき
記事用に書き直しながら思ったけど
もしかしてreservationDayのところhasManyではなくhasOneで別で定義してやれば
いちいちfirstで１レコード分を変数に定義しなおさなくてもいけるのか？
CentOS7にTomcat8をインストールして自動起動設定

#はじめに
仕事の現場で「本番環境構築しといて」と言われたので本番環境構築中なのですが
「君の本来の作業はプロジェクト管理と開発だからね。」と言われました。
「え？インフラ構築はいつやれば？」と思った人のために構築手順(Tomcat8)まとめました。

#Tomcat8のインストール

まずtomcat用のユーザーを追加
`sudo useradd -s /sbin/nologin tomcat`

ダウンロード
`curl -O http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-8/v8.0.39/bin/apache-tomcat-8.0.39.tar.gz`

/usr/local/配下に配備し権限設定変更
`tar -xzvf apache-tomcat-8.0.39.tar.gz
sudo mv apache-tomcat-8.0.39 /usr/local/tomcat
sudo chown -R tomcat:tomcat /usr/local/tomcat`

CentOS 7 からサービスは systemd が管理
そのためサービスに登録するためにsystemd unitファイルを作成
`sudoedit /etc/systemd/system/tomcat.service`

```
[Unit]
Description=Apache Tomcat 8
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/usr/local/tomcat/tomcat.pid
RemainAfterExit=yes

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReStart=/usr/local/tomcat/bin/shutdown.sh;/usr/local/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target
```

権限変更
`sudo chmod 755 /etc/systemd/system/tomcat.service`

サービスに登録(自動起動が有効になる)
`sudo systemctl enable tomcat`

#systemd Unit設定の補足説明
`After=syslog.target network.target`
依存関係を記載します。syslogとnetworkが起動してから起動

`Type=oneshot`
Typeを指定します。Typeは以下の様なものがあります。

```
simple	  指定したコマンドがフォアグランドで実行する場合。
forking	  子プロセスをバックグランドで起動して最初のコマンドは終了する場合。
oneshot	  一度だけコマンドを実行する場合。
notify	  ライブラリ関数sd_notify(）を使用する場合。
dbus	  D-Busを使用する場合。
```
Typeがoneshotの場合はコマンドの実行終了後もステータスを起動中にするため
systemdに起動中であることを知らせる必要があります。
そのための設定が以下です。
`RemainAfterExit=yes`

Tomcatの起動設定のTypeを何にするかですが、oneshotかforkingのようです。
どちらにするべきかよくわかりません。yumでインストールしたTomcatはforkingのようです。
しかし、forkingはできるだけ使用しないようが良いという情報もあります。
とりあえず、今回はoneshotにしました。


`WantedBy=multi-user.target`
起動レベルを設定します。multi-user.targetはrun level 3です。

上記設定で自動起動することは確認できました。

#Tomcatの初期設定
インストール後の初期設定を簡単にまとめておきます。

不要なWebアプリを削除
`sudo rm -rf /usr/local/tomcat/webapps/*`
	
不要なログ設定を無効(catalina.outだけにします。アクセスログはserver.xmlで設定します。)

```/usr/local/tomcat/conf/logging.properties
handlers = java.util.logging.ConsoleHandler
.handlers = java.util.logging.ConsoleHandler

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
```

ログ出力先を変えたい場合は以下のファイルにEnvironmentを追加

```/etc/systemd/system/tomcat.service
PIDFile=/usr/local/tomcat/tomcat.pid
Environment="CATALINA_OUT=/var/log/tomcat/catalina.log"
```
※unitファイル変更後、すぐに反映したい場合は以下のコマンドを実行
`sudo systemctl daemon-reload`

アクセスログをローテーションなしに設定し、出力パスを変更（logrotateに任せます。）
`rotatable="false"
directory="/var/log/tomcat"`

```/usr/local/tomcat/conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve"
    directory="/var/log/tomcat"  prefix="access" suffix=".log"
    pattern="common" rotatable="false" />

```



#その他
今回はfirewalldの設定を変えなくてもアクセスできましたが、
tomcatにアクセスできない場合はfirewalldの設定を確認してみてください。

参考
tomcat
http://weblabo.oscasierra.net/installing-tomcat8-centos7-1/

systemd
http://qiita.com/masami256/items/ef0f23125cf8255e4857
http://www.slideshare.net/enakai/linux-27872553

#最後に
これで一通りインフラ構築ができたので、やっと開発に入れるなと思ったら
「PostgreSQLのレプリケーション設定はどうなっている？」と言われました。
ActiveSupportのtryメソッド

メモ的な何か。
でもすごい使えるはず。(ていうか役に立った)
#よく見る使い方
```rb
Hoge.first.try(:name)
# => メソッドや変数の呼び出しで、objがnilでも例外を発生させずに通れる
```
#tryのソースコード見てて気がついたあまり見かけない便利な使い方
```rb
Hoge.first.try { |hoge| { id: hoge.id, name: hoge.name } }
# => {:id => 1, :name => 'bar'}
```
#終わりに
複数レコードをまとめて目的のハッシュに変換する方法はmap使えばよかったけど、1レコードをスッキリ書く方法があまり見かけなかったので(需要が無い？)書いておきました。
1レコードを色々なオブジェクトにコネコネするのに一番自由なメソッドだと思います。

追記
というかyield selfなメソッド他に無いんですかね？
結局これしか見つからなかったんですが

追記 2018/03/23
ruby 2.5からそのまんまなメソッド、yield_selfが追加されました
そんな訳で
try => nilかどうか分からん時に安全とってやるメソッド
yield_self => コネコネするメソッド

```rb
Hoge.first.yield_self { |hoge| { id: hoge.id, name: hoge.name } }
# => { :id => 1, :name => 'bar' }
```
ArrayやObjectを継承してみよう

この記事は [J2complexed Advent Calendar 2016](http://qiita.com/advent-calendar/2016/j2complexed) の4日目です。

#ES6ではclass構文を使ってArrayやObjectを簡単に継承できる

##Array

```js
class ExArray extends Array {
  get_length() {
    return this.length;
  }
}

var array = new ExArray("hoge", "foo", "bar");
console.log(array); // ["hoge", "foo", "bar"]
console.log(array.get_length()); // 3
console.log(array.length); // 3
array.push("piyo");
console.log(array); // ["hoge", "foo", "bar", "piyo"]
console.log(array.get_length()); // 4
console.log(array.length); // 4
```

##Object

```js
class ExObject extends Object {
  has_keys(key) {
    return this.hasOwnProperty(key);
  }
}

var object = new ExObject();
object["hoge"] = "foo";
console.log(object); // {"hoge": "foo"}
console.log(object.hasOwnProperty("hoge")); // true
console.log(object.has_keys("hoge")); // true
console.log(object.hasOwnProperty("foo")); // false
console.log(object.has_keys("foo")); // false
```

ちなみに、babelではサポートされてないので使えません:sweat_smile:
OnsenUI+AngularJSを使ってWeb・ネイティブアプリを作ってみた

#背景
とあるプロジェクトで、以下に挙げるような要件のサービスを立ち上げることになり、
OnsenUIを使ってみようということになりましたので、
今回は開発の概要や感想を書いていきたいと思います。

- スマホ用WEBサービス
    - デザイン・UIはネイティブアプリライクなものにしたい
    - ナビゲーションバー、タブバーのようなコンポーネント、スライドアニメーション等
- WEBで先行リリースするものの、後々はネイティブアプリとしてもリリースしたい
    - Android, iOS

#OnsenUIについて
- HTML、JavaScript、CSSでネイティブアプリが作れる
    - JavaScriptは、AngularJS(1系,2系)、React等のフレームワークから選択できる
- 当然WEBアプリとしても使える
    - UIコンポーネントが用意されているので、ネイティブライクを簡単に実現できる

※公式は[こちら](https://ja.onsen.io/)

#開発の流れ
今回はAngularJSの1系を使ったので、ここにある通りです。
https://ja.onsen.io/v2/docs/guide/angular1/

1. monacaをインストール  
```$ npm install -g monaca```  
macでnpm使えないよーという方は[こちらを](http://qiita.com/sinmetal/items/154e81823f386279b33c)
2. プロジェクト作成
```$ monaca create helloworld```
種類を選択するよう指示が出るので、今回は
「Onsen UI and Angular 1」と「Onsen UI V2 Angular 1 Tabbar」を選択

3. プレビュー確認
```$cd helloworld; monaca preview```
⇒ブラウザが立ち上がって確認できます。なんと便利な...!!

4. HTML作っていく
あとはとにかくコードを追加していく。
ドキュメントが日本語でわりとしっかりあるので、割愛...w
UIのサンプルとかはここで試したりできます。
http://ja.onsen.io.s3-website-us-east-1.amazonaws.com/tutorial/?framework=vanilla&category=Reference&module=list

#アプリのビルド
1. Monaca Localkitをインストール  
https://monaca.io/localkit.html
2. Monaca Localkit上でアプリの設定を行い、ビルドする  
こんな感じです。  
![スクリーンショット 2016-12-01 13.15.37.png](https://qiita-image-store.s3.amazonaws.com/0/38124/9c20b409-2ad9-a185-1ff3-8a9587203e29.png)
![スクリーンショット 2016-12-01 13.14.55.png](https://qiita-image-store.s3.amazonaws.com/0/38124/8073b23a-96f3-e76e-0625-19b983cc18bf.png)
![スクリーンショット 2016-12-01 13.15.57.png](https://qiita-image-store.s3.amazonaws.com/0/38124/56f72342-d557-3da4-bef2-c9bdfefda79e.png)

#一応サービスの紹介を
- サービス名：カブカブ  
Web版  
https://kabu2.com/lp2/index.html  
※アプリ版はもうすぐ公開予定

![スクリーンショット 2016-12-01 15.14.09.png](https://qiita-image-store.s3.amazonaws.com/0/38124/daa52085-b4cf-d8f6-068c-ee2f76181de0.png)

#感想
###メリット・よかった点等
- Webのスキルがあれば、ネイティブアプリのスキルがなくてもアプリが開発できる
- アプリライクなUIを簡単に組み込める
- 工数の短縮
    - 普通にWeb、iOS、Androidを作るよりはだいぶ早い（ものにもよりますが）
- カメラ、GPS、決済等、ネイティブ専用の機能もプラグインが豊富に用意されている

###デメリット・苦戦した点等
- 端末依存・ブラウザ依存
OnsenUIに限ったことでもないですが、iPhoneで表示が崩れる、Androidでうまく動作しない、といったことがちょこちょこありました。結果、部分的にiOS用、Android用にカスタマイズが必要といったことが必要。
- 学習コスト・引継ぎコスト
　多少特殊な作りにはなっているので、知らない人が見たら最初はよく分からない。ただAngularJS習得済みであれば基本的には大丈夫。自分はAngular初だったので苦戦しました。。。
Docker入門4: 実際にDocker コンテナを建ててみる

前回は Docker 使う際の流れを紹介しました。
今回は、 docker の公式ドキュメントのチュートリアルに従い、実際に docker コンテナを建ててみます。

## 前置き
Dockerについてまだあまり知らないですが、せっかくなので他の人と共有できるようにアウトプットしてみます。
ツッコミ大歓迎です、どんどんおねがいします。

## hello-world
早速、公式イメージの `hello-world` を使って、 docker コンテナを建ててみます！

```bash
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete 
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```
どうでしょうか？
多少の違いはあれど、似たような表示が出てくるでしょうか？

この `docker run hello-world` というコマンドは、 `hello-world` というイメージからコンテナを作るコマンドです。

初めての場合は、ローカルに `hello-world` イメージがないため、自動的に docker hub からイメージを `pull` しています。

## ubuntu
もう少しいろいろいじってみたくなってきませんか？
次は OS のイメージからコンテナを作り、 bash を起動してみましょう。

```bash
$ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
af49a5ceb2a5: Pull complete 
8f9757b472e7: Pull complete 
e931b117db38: Pull complete 
47b5e16c0811: Pull complete 
9332eaf1a55b: Pull complete 
Digest: sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5
Status: Downloaded newer image for ubuntu:latest
root@36e7d869592b:/#
```

これにより ubuntu のイメージからコンテナを作り、コンテナにアタッチしました。
試しに `ls` コマンドを実行します。

```bash
root@36e7d869592b:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
```

終了しましょう。

```bash
root@36e7d869592b:/# exit
```

## docker ps
```bash
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
36e7d869592b        ubuntu              "bash"                   37 minutes ago      Exited (0) 9 seconds ago                              hopeful_ardinghelli
77f839d7c182        hello-world         "/hello"                 47 minutes ago      Exited (0) 47 minutes ago                             suspicious_lichterman
```
* `docker ps -a`: すべてのコンテナを表示します。

## まとめ
どうでしょうか？
少しはイメージがつかめてきたでしょうか？

## 次回
次回は docker hub を使ったコンテナの作り方を解説します。
iTerm2 のタブに任意の名前をつける方法

## <i class="fa fa-cube" style="font-size:1em;"></i> 一行で説明
デフォルトでは iTerm2 のタブにはそのタブで実行しているプロセスの名前などが表示されていますが、
タブに固定の名前をつけたい場合があります。

## <i class="fa fa-terminal" style="font-size:1em;"></i> タブに名前をつける方法

```
$ echo -ne "\e]1;TAB_NAME\a"
```

上記のコマンドの `TAB_NAME` の部分を好きな文字に変えてください。

## <i class="fa fa-thumb-tack" style="font-size:1em;"></i> タブに名前をつけるコマンドをつくる

よく使う機能なので、コマンドとして作ってしまいます。
以下では、`~/bin/` 以下にコマンドを設置します。

```
$ mkdir ~/bin
$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
$ source ~/.bashrc
$ vim ~/bin/nameiterm
$ chmod +x ~/bin/nameiterm
$ cat ~/bin/nameiterm

#! /bin/bash
echo -ne "\e]1;$1\a"
```
### <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 使用方法

```
$ nameiterm hoge
```

とすると、`hoge` という名前がタブにつきます。
タイプ・メソッドの利用法

「詳解 Swift 改訂版」のChapter3、構造体のパートを読んで、構造体の「タイプ・メソッド」の復習をしていました。しかし、萩原さんの説明の矛盾点に悩んでいます。
### **タイプ・メソッド**
>
- タイプ・メソッドは、個々のインスタンス機能を実装するものではなく、全インスタンス共通して利用される機能の提供
- インスタンスの作り方(個数の制限や再利用)のコントロール
- この型を利用するうえで便利な機能の提供

タイプ・メソッドの説明があり、例文として次の構造体を挙げています。「static」キーワードが付いているメソッドがタイプ・メソッドで、2つ指定されています。「isLeap」メソッドは「うるう年」かどうか判定する計算式です。「西暦年が4で割り切れる年ですが、100で割り切れない年でないといけません。しかし、400で割り切れる場合はうるう年になります」なので、式にしたのが「isLeap」メソッド内の式です。

そして、ある年のある月が何日あるか返すメソッドが「daysOfMonth」メソッドです。これはisLeapメソッドを利用しています。

```ruby:swift3
struct Date {
    var year, month, day: Int
    static func isLeap(y: Int) -> Bool {
        return (y % 4 == 0) && (y % 100 != 0 || y % 400 == 0)
    }
    static func daysOfMonth(m: Int, year: Int) -> Int {
        switch m {
        case 2: return self.isLeap(y: year) ? 29 : 28
        case 4, 6, 9, 11: return 30
        default: return 31
        }
    }
}
```
さて、悩んでいるのはこのタイプメソッドの利用法です。萩原さんは次のコードを載せています。

```ruby:swift3
Date.isLeap(y: 2000)               // trueが返る
Date.daysOfMonth(m: 2, year: 2000) // 29が返る
```
実はこういう利用法は、上記のタイプ・メソッドの説明に合ってないから納得できないんです。最初の説明に書いているように「**全インスタンス共通して利用される機能の提供**」として考えるなら、次のような例文の方が合っているような気がします。

```ruby:swift3
var someDate = Date(year: 2050, month: 11, day: 29)
var anyDate = Date(year: 2016, month: 1, day: 17)

// 上記のようにインスタンスを作って、
// これに共通する機能として次のように書く方が
// 望ましいんじゃないでしょうか？　

Date.isLeap(y: anyDate.year)     // trueが返る
Date.isLeap(y: someDate.year)    // falseが返る
```
萩原さんの利用法で説明するのなら、**構造体Dateのプロパティ「year」「month」「day」が意味を成さないような気がします。**というのも、萩原さんの利用法を推奨するなら、次のような例文もできます。

```ruby:swift3
var day = 31
Date.isLeap(y: day)
```
こうなってしまったら、タイプメソッドの説明とはかけ離れてしまいます。いっそのことプロパティを排除して、タイプ・メソッドだけで構成した次のような共通メソッド群とした方がいいような気がします。

```ruby:swift3
struct ComonFunctions {
    static func isLeap(y: Int) -> Bool {
        return (y % 4 == 0) && (y % 100 != 0 || y % 400 == 0)
    }
    static func daysOfMonth(m: Int, year: Int) -> Int {
        switch m {
        case 2: return isLeap(y: year) ? 29 : 28
        case 4, 6, 9, 11: return 30
        default: return 31
        }
    }
}
```
プログラマーの皆さん、どうなんでしょうか？
AWS re:Invent 2016に参加してみた 3日目

3日目。継続中。今までの軌跡はこちらで。

[AWS re:Invent 2016に参加してみた 1日目](http://qiita.com/kojiisd/items/0b1c5ebe9118bd26147e)
[AWS re:Invent 2016に参加してみた 2日目](http://qiita.com/kojiisd/items/bd00afa24a515c58ddae)

# GA03 - Keynote Presented by Andy Jassy
かなり多くの新サービスが紹介されました。自分が理解しただけでも以下。

|No|Update内容|
|:---|:---|
|1|各種EC2インスタンスファミリーに新たなタイプが追加|
|2|Elastic GPUs For EC2開始|
|3|Amazon Lightsail開始|
|4|F1インスタンスの追加|
|5|Amazon Athena開始|
|6|Amazon Rekognition開始|
|7|Amazon Polly開始|
|8|Amazon Lex開始|
|9|PostgreSQL for Aurora開始|
|10|AWS Greengrass開始|
|11|AWS Snowball Edge開始|
|12|AWS Snowmobile開始|

明日もまだキーノートを残しているのに、これはちょっと多いですね。明日にも期待です。

ちなみにAmazon Athenaが発表されて速攻で触っていたので、そのあとの発表はろくに聞いてませんｗ
で、こんな記事書きました。

[Amazon Athenaを使ってみた](http://qiita.com/kojiisd/items/3bd36a6b717db1fae81c)

# MBL306 - Serverless Authentication and Authorization: Identity Management for Serverless Architectures

LambdaなどのServerless技術を利用している際に、認証認可をどのように行えばいいか、というお話。基本的には

- 認証：Amazon Cognito User Pools使う
- 認可：DynamoDB＆Lambda

という感じでした。実際にアプリとして公開している「SpaceFinder」の認証認可の仕組みを例にとって説明していました。

次にGreengrassのセッションがリアルタイム追加（re:Inventおなじみらしい）されたのですが、日程を勘違いしていた自分は（明日だと思ってた）開始5分前に気づき、会場が遠かったので参加を諦めました。その間にGreengrassを勉強して記事書きました。

[AWS Greengrassを使おうとした（まだ使えなかった）](http://qiita.com/kojiisd/items/2c75ba1984caf3fcc43a)

ここから参加セッションのお話に戻ります。

# SAC310 - Securing Serverless Architectures, and API Filtering at Layer 7
アプリレイヤにおけるサーバレスアーキテクチャのセキュリティオン確保の仕方についての説明でした。考える基本としてOWSAPのTop10に該当するアタック方法は考慮しろ、という始まり。

- APIのエンドポイントはHTTPSのみでインターネットアクセスを受け付けること
- TLS1.2が適用されていること
- s2nを通しての接続になっていること

などなど、注意点を最初にあげてくれました。で、何は無くともIAMだよね、という展開。色々なサーバレスアーキテクチャを使ったユースケースを基にしてどのようにセキュアにするかを発表してくれたのですが、これ以降は自分も落とし込めていない部分が多いのであとで見直したいと思っているものです。

ポイントは以下の４つとあげていました。

1. Sync vs async
2. Machine Learning
3. Malware
4. XSS / SQLi

# IOT401 - Serverless IoT Back Ends
今回のセッションの中で一番資料がまとまっていたと思います。あとで必ずスライドを見直したいと思いました。（参加者からの質問で「このスライドはきちんとあとで公開するつもりがあるか？」と確認されるほど。ベースは資料公開のはずなのに。）

ステートレスは状態を気にしないことではないんだぞ、勘違いするなよ、という始まりでした。

ここから各ユースケースに応じてどのようなアーキテクチャで構築するとどのようなメリットが得られるのか、

- Fault-tolerant
- Cost-efficient
- Scalable
- Agile
- Secure
- Visibility

の観点から評価しています。が、これはここで長々書くよりもセッションのスライドと動画が公開されるのを待った方が良いと思います。それくらいよくできた資料と発表でした、前半は。特にIoTのバックエンドをServerlessでどう構築するの？とイメージできない人にはオススメのセッションです。

後半は上記を踏まえた事例紹介。API GatewayとLambdaとEC2をResponseTimeで比較した結果を発表してくれたりなど、これはこれで面白かったです。

# ARC402 - Serverless Architectural Patterns and Best Practices
サーバレスアーキテクチャのベストプラクティスをいろいろと紹介。スライド多かったのもありあまりついていけなかったのですが、バッチ処理でLambda利用、Streaming処理でLambda利用時の事例を話してくれたのは面白かったです。

惜しむらくは最後DevOpsとセキュリティの話になったときに観客がPubCrawlに参加したかったからなのかぞろぞろと退出し始めてしまったこと。サーバレスとかマイクロサービスとか最近の流れを技術者として追うのであれば、DevOpsやセキュリティって、開発者として逃れられない考え方になると思うんですけどね、残念です。


# まとめ
今日は新サービスの紹介がいくつもあり頭が追いつかない瞬間もありましたが、明日もまたキーノートがあるので気合い入れていこうと思います。
pip > link > Is `sudo pip install` still a broken practice? < pipする時にsudoをつけるのはどうか

```txt:動作環境
Ubuntu 14.04 LTS Japanese Remix
```


pipをインストールした後、各種パッケージインストール時の`pip install`に対してsudoをつけて実行していた。
しかしながら、いくつかの資料では`pip install`時にはsudoをつけていない。

sudoはつける方がいいのか、つけない方がいいのか。

検索してみた。
http://askubuntu.com/questions/802544/is-sudo-pip-install-still-a-broken-practice

> In short, in accordance with the principle of least privilege, **don't use sudo with pip to install Python packages from PyPI** unless you absolutely need to. Instead, consider using pip install --user (note that pip install with no sudo nor additional flags/options defaults to pip install --user on Ubuntu currently) or virtual environments (such as virtualenv). If you see people recommending sudo pip or sudo -H pip, please tell them not to.

(追記)
上記の文書を読んでsudoなしでpip installをしたりしたが、うまくinstallできない状況が数回発生した。
結局、sudoをつけてpip installしている。

まだまだよく分かっていない。
ES2015 fizzbuzz



```JavaScript

const fizzbuzz = () => {
	const fizz = 'fizz';
	const buzz = 'buzz';
	for (let i = 1; i < 100; i++) {
		if(i % 3 === 0 && i % 5 === 0){
			console.log(fizz + buzz);
		}else if(i % 5 === 0){
			console.log(fizz);
		}else if(i % 3 === 0){
			console.log(buzz);
		}else{
			console.log(i);
		}
	}
}

fizzbuzz();

```

結果

1
2
buzz
4
fizz
buzz
7
8
buzz
fizz
11
buzz
13
14
fizzbuzz
16
......
......
91
92
buzz
94
fizz
buzz
97
98
buzz
[Finished in 0.2s]
Atom autocomplete-pythonとpyenvの連携

AtomでPythonの補完機能を使うためのプラグインであるautocomplete-pythonと、pyenv(pyenv-virtualenv)を連携させる方法。
環境はMac。

autocomplete-pythonの設定で、以下を設定すればOK。

`Python Executable Paths`

```
/Users/USERNAME/.pyenv/versions/$PROJECT_NAME/bin/python;
```

`Extra Paths For Packages`

```
/Users/USERNAME/.pyenv/versions/$PROJECT_NAME/lib/python3.5/site-packages;/Users/USERNAME/.pyenv/versions/$PROJECT_NAME/lib/python2.7/site-packages;
```

`$PROJECT_NAME`はAtomにインポートしているプロジェクトフォルダ名に展開されるっぽい。
なので、virtualenv環境名とプロジェクト名を合わせておく。
npmパッケージの健康管理をしよう

# はじめに

[CYBIRDエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/cybird) 2日目担当の @keitarou です。
1日目は(@keitarou)さんの[開発速度を高めるためのCIと自動化](http://www.cybird.co.jp/recruit/engineer/blog/%e9%96%8b%e7%99%ba%e9%80%9f%e5%ba%a6%e3%82%92%e9%ab%98%e3%82%81%e3%82%8b%e3%81%9f%e3%82%81%e3%81%aeci%e3%81%a8%e8%87%aa%e5%8b%95%e5%8c%96/)でした。
はい、今日も私です。今日はQiitaに書きたい気分なのでQiitaに書きます。

# npmパッケージの健康管理

今回は『npmパッケージの健康管理をしよう』というタイトルで、先日のブログでも少し話をしていた『依存パッケージのアップデート/イシューの検知』
について、少しお話させてもうおうと思います。

# 健康の定義

簡単にですが、健康とはなんぞってのを勝手に定義しています。

- パッケージの最新のversionを利用することができる。
- セキュリティのissueなどがあった際は、それに気付くことができる。
- 無意識にライセンス違反を侵さない。

全てはエンジニアが楽しく開発できる為！
そんなエデンを求めたエンジニアがいました。

# npm

Node.jsやJavaScriptのパッケージの管理を行うアレですが、はやりJavaScript界隈大変盛り上がっておりパッケージのバージョンもホイホイ上がっております。
常に最新のversionを利用できたほうが基本的には便利ですし、不具合も解決できる(はず)。
*npm-check-updates*というパッケージがあり、これを利用することでpackage.jsonの内容を確認して最新のversionが存在するかどうかをチェックさせることが出来ます。
https://github.com/tjunnone/npm-check-updates

# チームで使えるようにするために

かといって、npm-check-updatesを普段から使うには結構難しいと思います。
そこで、自動化 + 通知 * CI といった仕組みを利用することで障壁を下げてみようにしました。
普段はChatworkを利用しているのでChatworkに通知できるようにnpm-check-updatesをラップしたシステムを作りました。
https://github.com/keitarou/ncu-to-cw
![スクリーンショット 2016-12-01 13.18.55.png](https://qiita-image-store.s3.amazonaws.com/0/19855/8d4db1b9-1813-a1cb-60a5-aa238ba46191.png)

しかし、まぁもう少し良くならんものかと。

## 課題

npm以外にもパッケージマネージャーも使ってるんだよね・・・

# 作るのやめよう

そんなパッケージの管理ですが、アレもこれも自分で仕組みを付くのはもう大変
自動でやってくれるSaaSもいくつかあるので、そっちを頼りましょう！

- Gemnasium
- Version Eye
- Greenkeeper

https://gemnasium.com/
https://www.versioneye.com
https://greenkeeper.io/

それぞれ、特徴は違いますが今は何やかんやで、VersionEyeを利用しています。

# VersionEye

何と言っても圧倒的なパッケージへの対応。

- Composer (PHP)
- Bundler (Ruby)
- PIP (Python)
- NPM (Node.JS)
- Bower (JavaScript)
- CocoaPods (Objective-C)
- Maven (Java). Try the plugin.
- SBT (Scala). Try the plugin.
- Gradle (Groovy). Try the plugin.
- Leiningen (Clojure)
- Nuget (Microsoft .NET platform)
- Biicode (C/C++)
- Berkshelf (Chef)

こんな感じになります。(これはComposerの場合ですが、他のパッケージマネージャーも同じような感じ)
![スクリーンショット 2016-12-01 13.37.52.png](https://qiita-image-store.s3.amazonaws.com/0/19855/b243968f-c5fd-9451-00d4-5d965591d8dc.png)

セキュリティのissueがある場合なんかはこんな感じ。(これはBundler)
![スクリーンショット 2016-12-01 13.42.11.png](https://qiita-image-store.s3.amazonaws.com/0/19855/999e7b56-ae43-6f30-fb2b-c949a072e926.png
)

と、変に自作するのではなく、SaaSを使い勝手も向上！

# 締めと今後の展望

と、パッケージを管理するための試行錯誤のお話でした。
と入ってもツールを用意しただけで、まだチーム内で継続的にメンテナンスする習慣は無いです。
とりあえず、自分の手の届くプロジェクトから小さく始めていきたいと思います。頑張りましょう。

# おまけ

VersionEyeですが、オープンソース化もされました。
更に選択の幅が広がりました！めでたいです。
https://github.com/versioneye/ops_contrib


# 最後に

CYBIRDエンジニア Advent Calendar 2016 明日は、 @gotyoooo さん の「Chefを利用して運用者の作業を増やす方法」です。
何の話してくれるんでしょうか。楽しみです。乞うご期待！