OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】Pager(次へ)が存在するポストを最後までスクレイピングしCSVに保存

# やったこと

* はてなブックマークで[R]と検索して、ページャーが存在する限りすべてのページをスクレイピングする

![pager.JPG](https://qiita-image-store.s3.amazonaws.com/0/134704/99f9dff1-3c89-7d53-87c3-8a94aea7d353.jpeg)

* どうせならCSVに保存しておく

# アルゴリズム

* 検索語句を格納する変数を用意する (例)query = "R"
* http://b.hatena.ne.jp/search/text?q=QueryとなるようなURLを用意する
* そのURLにアクセスする
    * そのページに存在する各記事をXpathで複数取得する
    * 記事からそれぞれ以下の情報を取得し、csvに追加する
        * タイトル
        * 作成日時
        * ブックマーク数
        * もし次の40件のボタンがあれば
    * 次の40件ボタンをクリックし、ページの情報を再度printする
    * もし次の40件のボタンがなければ
        * 処理を終了する
    * 存在すれば
        * 次のページに移動する

# ソースコード

```python:hatena.py
from selenium import webdriver
import requests # for slack  
from pandas import * 
import time

#Access to page

browser = webdriver.PhantomJS()  # DO NOT FORGET to set path
query = "R"
url = "http://b.hatena.ne.jp/search/text?safe=on&q=" + query + "&users=50"
browser.get(url)

df = pandas.read_csv('trend.csv', index_col=0)

#Insert title,date,bookmarks into CSV file

page = 1 #This number shows the number of current page later

while True: #continue until getting the last page
    if len(browser.find_elements_by_css_selector(".pager-next")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")
        #get all posts in a page
        posts = browser.find_elements_by_css_selector(".search-result")
        
        for post in posts:
            title = post.find_element_by_css_selector("h3").text
            date = post.find_element_by_css_selector(".created").text
            bookmarks = post.find_element_by_css_selector(".users span").text
            se = pandas.Series([title, date, bookmarks],['title','date','bookmarks'])
            df = df.append(se, ignore_index=True)
            print(df)

        #after getting all posts in a page, click pager next and then get next all posts again
        
        btn = browser.find_element_by_css_selector("a.pager-next").get_attribute("href")
        print("next url:{}".format(btn))
        browser.get(btn)
        page+=1
        browser.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
    else: #if no pager exist, stop.
        print("no pager exist anymore")
        break

df.to_csv(query + ".csv")
print("DONE")
```

より詳しい方法については、下の記事を参考

【Python】Webスクレイピングチュートリアル -「次へ」ボタンが存在するページをすべて取得する場合 -
https://review-of-my-life.blogspot.jp/2017/10/pager-next-selenium.html
【HTC VIVE】 VR開発チュートリアル　~ものをつかんで投げ、テレポートできるようにする~

# やったこと

* VR上でものを持ち上げたり、テレポーテーションを行えるようにするためのチュートリアルを翻訳しました

HTC Vive Tutorial for Unity(By Eric Van de Kerckhove @BlackDragonBE)
https://www.raywenderlich.com/149239/htc-vive-tutorial-unity

# 結果

* こんな感じになりました

<blockquote class="twitter-video" data-lang="en"><p lang="ja" dir="ltr">VR開発順調！テレポーテーションと、ものをつかんで投げることができるようになったぞい！ <a href="https://t.co/WtFT2YPirU">pic.twitter.com/WtFT2YPirU</a></p>&mdash; DAI (@never_be_a_pm) <a href="https://twitter.com/never_be_a_pm/status/928775923888820224?ref_src=twsrc%5Etfw">November 10, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


![Intro.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/333396f1-6cc2-2e2a-a48f-60df46041a8c.gif)

# 方法

* こちらの記事を参考にしてください

【HTC VIVE】 VR開発チュートリアル　~ものをつかんで投げ、テレポートできるようにする~
https://review-of-my-life.blogspot.jp/2017/11/throw-objects-and-move-aroud-with-laser-in-vr.html
【VR開発】~町の中で空を飛んでビームを撃つ~

# やったこと

* 海外Youtubeでアイアンマンのように町で空を飛び、ビームを出すアプリのチュートリアルを翻訳しました
* ブログ記事にまとめ、ソースコードもまとめました。

Unity VR Tutorial - How to make an IronMan like mechanic using HTC Vive
https://www.youtube.com/watch?v=FgpFGcHYswI

# 成果物

* こんな感じです。(Youtube見てもらったほうが早い)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/756cdcf4-0c11-c623-8807-9e7049f59835.png)

# 手順

* 自分のブログ記事を写すのが面倒なので、こちらを参考にしてください。

【HTC VIVE】VR開発チュートリアル ~町の中で空を飛んでビームを撃つ~

https://review-of-my-life.blogspot.jp/2017/11/vr0vr.html
【Python】TinderのAPIを使って、青山大学周辺で遠隔ナンパする

# やりたいこと

* 歌舞伎町でナンパしたい
* でもそんな勇気ない。女性は無慈悲だ。
* しかも歌舞伎町の女性は好きではない。もっとお嬢様がよい。
* なので青山大学でナンパしたい！
* それならTinderで遠隔ナンパすればいいんじゃないか？
* PythonのTinder API Pynderを利用して遠隔ナンパする

# 方法

* Pynderをインストール
* 青山大学の緯度と経度を指定
* 自動スワイプ

# 結果

* 青山大学周辺だと、人通りが多すぎて青山大出身の人以外出てきてキレそうだった
* 東京外大とか、若者が学生ばかりで、周りに人があまりいない地域がおすすめ！（そこだと狙い撃ちできた）


詳しくは下記記事参照

PythonでTinder APIを使ってネトストとサイバーナンパ師やってみた
https://review-of-my-life.blogspot.jp/2017/06/pythontinder-api-cyber-hockup.html

# ソースコード

```python:tinder.py

import pynder
facebook_auth_token = "[Facebook access token]"
session = pynder.Session(facebook_auth_token)

#緯度と経度を指定
LAT = 35.687537
LON = 139.529551
session.update_location(LAT, LON)
session.profile
users = session.nearby_users()
for user in users:
 print(user.name)
 #print(user.photos)
 #print(user.bio)
 print(user.schools)
 print(user.distance_km)
 print("============")

```

# 参考

PythonでTinder APIを使ってネトストとサイバーナンパ師やってみた
https://review-of-my-life.blogspot.jp/2017/06/pythontinder-api-cyber-hockup.html

# その他おすすめ記事

Google Apps Script 相席ラウンジの混雑データを毎日1時間おきに取得して、それをグラフィカルに分析できるWebサイトを公開しました
https://qiita.com/kkdmgs110/items/2cf7b84ac8ddebdde80a

LINEからDMMのアダルト動画のサンプルを見れる、変態コンシェルジュ作りました！
https://qiita.com/kkdmgs110/items/3483ad6cb5c85983ffc6

Google Apps Script 1時間おきに、スプレッドシートに相席ラウンジの混雑状況のスクレイピングを定期実行する
https://qiita.com/kkdmgs110/items/e9e56ab2dd454c69d302

【Python】DMM Web APIでエッチなデータを取得し、TwitterでえっちなBotを作った話
https://qiita.com/kkdmgs110/items/13c728fcccb059f17755

【Python】TinderのAPIを使って、青山大学周辺で遠隔ナンパする
https://qiita.com/kkdmgs110/items/5f68ebef4afe230f75de
UnityのUの字も知らない人達が ゲームを作ってみた　その２　

##　今日は
前回の記事に引き続き書いていきたいと思います。
前回の記事は[こちら　UnityのUの字も知らない人達が ゲームを作ってみた](https://qiita.com/ToTheGlory2001/items/8cbbcfd964714a5e47c3)

# ゲームアップデートしました

[こちら](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)からダウンロード
[![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/616ae3b2-3296-57fa-a25e-97d677a93efd.jpeg)](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)


`そもそも何故このゲームを作ることになったのか
このゲーム、実は学校の授業で作ったものです。
学校で「４、５人で班を作ってゲームをつくろう。そしてダウンロード数を競おう。」という趣旨の授業で作ったゲームです。温かい目で見ていただければ幸いです。`

###弾の変更
今回は[前回の記事](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)で書いた
・弾の種類を変えられる（弾の種類を増やす）
・視点操作
のうち**弾の種類を変えられる**という機能を実装してみました。
![Image uploaded from iOS (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/84e236ad-6b89-b540-d133-be24b36d976a.jpeg)
こんな感じ
左上のポーズボタンを押すとこのウィンドウが開く、といった仕様です。現時点では「通常弾」と「爆弾」の2種のみですが、あと一種類くらいは増やしたい、と考えています。**アイディア募集中です**。

###タイトル画面

さらに今回、弾の変更を可能にしただけでなく、**タイトル画面**をつけてみました。![Image uploaded from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/f00dfa4b-59f8-5f3f-3bf6-6fc9145d5c89.jpeg)
`タイトル画面`
![Image uploaded from iOS (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/77565da1-c60c-177a-445e-7bbceb3c201d.jpeg)
`操作方法の説明画面　タイトル左下のボタンで出てくる仕様`

前回リリースした後、僕らが考えたのは「どんな神ゲーでもタイトル画面がなかったらクソゲーに見えるのでは？」という事でした。つまり裏を返せば**どんな内容でも、タイトル画面があればゲームっぽくなる**という事です。
確かに、タイトル画面というのは**ゲームにおいて最も大切**と言えます。これがないゲームは見たことがありません。少なくとも有名なアプリはゲームに限らずこれがあります。
ということで作ってみました。作業量に比べればよくできてると思ってます。しかし、初めて作ったものであるためか、「初心者が作りました感」は否めません。**アドバイスください。**お願いします。


##最後に

というわけで、アップデートしたのでダウンロード、ストアでの評価、改良点、コメント、その他諸々宜しくお願いします。

最後までお付き合い頂きありがとうございました。


ダウンロードはこちらから
[Exhilaration〜宇宙空間物理破壊シミュレーター〜](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/28c9a010-133f-3a35-7c60-c199c1b72ac2.jpeg)
](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![Image uploaded from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/212174/5e9a8702-d989-175f-c657-308e351dab53.jpeg)
](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/212174/ab596ffb-b920-692d-ed0c-e1f98fdab524.png)
](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
【Python】スクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ～Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた～

# やりたいこと

* はてなブックマークで、Python記事を検索しトレンドを分析
    * はてなブックマークにSeleniumでログイン
    * ブックマーク数をスクレイピング
    * 時系列比較を行う
    * バズるタイトルを分析

# 実装方法

* 詳しくは下記記事を参考にしてください。Pandasを利用したデータ分析まで載せています。

【Python】スクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ～Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた～

https://review-of-my-life.blogspot.jp/2017/10/python-web-scraping-data-collection-analysis.html

# 実装

```python:trendAnalytics.py

from selenium import webdriver  
from pandas import * 
import time

#Access to page

browser = webdriver.PhantomJS()  # DO NOT FORGET to set path
url = "http://b.hatena.ne.jp/search/text?safe=on&q=Python&users=50"
browser.get(url)
df = pandas.read_csv('trend.csv', index_col=0)

#Insert title,date,bookmarks into CSV file

page = 1 #This number shows the number of current page later

while True: #continue until getting the last page
    if len(browser.find_elements_by_css_selector(".pager-next")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")
        #get all posts in a page
        posts = browser.find_elements_by_css_selector(".search-result")
        
        for post in posts:
            title = post.find_element_by_css_selector("h3").text
            date = post.find_element_by_css_selector(".created").text
            bookmarks = post.find_element_by_css_selector(".users span").text
            se = pandas.Series([title, date, bookmarks],['title','date','bookmarks'])
            df = df.append(se, ignore_index=True)
            print(df)

        #after getting all posts in a page, click pager next and then get next all posts again
        
        btn = browser.find_element_by_css_selector("a.pager-next").get_attribute("href")
        print("next url:{}".format(btn))
        browser.get(btn)
        page+=1
        browser.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
    else: #if no pager exist, stop.
        print("no pager exist anymore")
        break
df.to_csv("trend1.csv")
print("DONE")

```

# 結果

* こんな感じでスクレイピングした結果が表示されます。

![trendAnalytics.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/18a7cc6c-e43e-91bb-231b-8b30c282f2ff.gif)

* Jupiter Notebookを利用して、こんな感じで分析しました.2017年度の結果

![2017.JPG](https://qiita-image-store.s3.amazonaws.com/0/134704/c99f90c2-1b9a-8d2c-142f-33c42203bfb2.jpeg)

* こちらが2006年度の結果。明らかに使われ方が違いますね

![Ruby.JPG](https://qiita-image-store.s3.amazonaws.com/0/134704/b71d6b63-028d-9b4f-4e1f-79ad9e954987.jpeg)


# 参考

【Python】スクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ～Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた～

https://review-of-my-life.blogspot.jp/2017/10/python-web-scraping-data-collection-analysis.html
【Python】データの前処理を行うためのPandasチートシート

# やりたいこと

* Pythonを利用してデータの前処理を行う際の、pandasのチートシートを用意する
    * CSVデータの読み込み(read csv)：read_csv
    * データの閲覧(see nth data)
    * 指定した行の一部の文字を変換(convert string into "") :str.replace()
    * 指定した文字の後をすべて削除する(remove all string after string):
    * 指定した列の削除(drop certain rows):df.drop
    * 重複行の存在を確認(check if duplicated rows exist):duplicated().any()
    * 重複行の削除(remove duplicated rows):drop_duplicates
    * 特定の文字列の値を含んでいる行を検索する(get rows which contains certain string)
    * 列の含む数字が大きい順番に並べる(sort)
    * 列の並び替え(replace columns):
    * 文字列オブジェクトからnumericalに変換(convert string into numerical)
    * 行の数を数えたい(count number of rows)
    * 整形済みデータを新たなCSVに保存する(save csv)

# ソースコード

* 下記の記事を参考にしてください

Pandas データの前処理で使えるチートシート
https://review-of-my-life.blogspot.jp/2017/10/pandas-cheetsheet.html
__builtins__に関する覚え書き


Pythonの[言語レファレンス](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution)に記述がありますが、`__main__`モジュールのグローバル変数`__builtins__`は、`builtins`(Python2では`__builtin__`)モジュールオブジェクトを指していますが、その他のモジュールでは`__builtins__`は、`builtins`の`__dict__`を指しています。

```pycon
>>> import sys, os, builtins
>>> sys.modules['__main__'].__builtins__ is builtins
True
>>> os.__builtins__ is builtins.__dict__
True
```
【Python】Webスクレイピングチュートリアル　-ログインが必要なサイトの場合-

# やりたいこと

* ログインが必要なサイトからスクレイピングする

# 実装

* はてなブックマークにログイン
* ログイン後のページのデータをスクレイピング

# ソースコード


* 詳細な手順については、下記の記事をご覧ください。

【Python】Webスクレイピングチュートリアル　-ログインが必要なサイトの場合-
https://review-of-my-life.blogspot.jp/2017/10/python-selenium-siginin.html


```python:login.py

from selenium import webdriver
browser = webdriver.PhantomJS()

loginUrl= "https://www.hatena.ne.jp/login"
browser.get(loginUrl)

username = "あなたのメールアドレス"
password = "あなたのパスワード"

userNameField = browser.find_element_by_xpath("//*[@id='login-name']")
userFameField.send_keys(username)

passwordField = browser.find_element_by_xpath("//*[@id='container']/div/form/div/div[2]/div/input")
passwordField.send_keys(password)

submitButton = browser.find_element_by_class_name("submit-button")
submitButton.click()

profile = "profile.hatena.ne.jp"
browser.get(profile)

browser.title
```
PythonでWordpressの投稿を自動化してみた

# やりたいこと

* PythonからWordpressの投稿を行う

# 環境

- Cloud9
- Python3
- PhontomJS * 
- Selenium  * 

導入は[Python データ分析入門マニュアル] > [スクレイピングをPythonでするときは、Cloud9・Selenium・Herokuで決まり！誰でもできるスクレイピングマニュアル]を参照してください。こちらにCloud9上でSelenium環境を作る方法などをすべてまとめています。

スクレイピングをPythonでするときは、Cloud9・Selenium・Herokuで決まり！誰でもできるスクレイピングマニュアル
https://review-of-my-life.blogspot.jp/2017/09/selenium-5-minutes-setup-on-cloud9.html

# 実装

- ワードプレスのログイン画面に移動
- IDとパスワードを入力
- 送信ボタンを入力
- 新規投稿画面に移動
- タイトルと内容を入力
- 下書き保存をクリック

# スクリプト
```python:wordpress.py

from selenium import webdriver #seleniumのimport
import time

browser = webdriver.PhantomJS() 
loginURL = "http://yoursite.com/wp/wp-login.php" #yoursite.comにはあなたのサイトのアドレスを書いてください
browser.get(loginURL)
time.sleep(3)
print(browser.title) # "あなたのサイト名 ‹ ログイン"と表示される

#ログイン

username = ""　#あなたのユーザー名を入れてください
password = "" #あなたのパスワードを入れてください

browser.find_element_by_css_selector("#user_login").send_keys(username)
browser.find_element_by_xpath("//*[@id='user_pass']").send_keys(password)
browser.find_element_by_css_selector("#wp-submit").click()
time.sleep(3) # waiting for sign in 

print(browser.title) #"ダッシュボード ‹ あなたのサイト名 — WordPress"と表示される

#投稿(下書き)

browser.get("http://yoursite.com/wp/wp-admin/post-new.php")
time.sleep(3) # waiting for sign in 
print(browser.title) #"新規投稿を追加 ‹ あなたのサイト名 — WordPress"と表示される

title = "Test"
content = "test post"
browser.find_element_by_css_selector("#title").send_keys(title)
browser.find_element_by_css_selector("#content_ifr").send_keys(content)
browser.find_element_by_css_selector("#save-post").click
time.sleep(3) #waiting for post

```

# 詳細

* 手順等は省略しているので、詳細は以下の記事を読んでください。

https://review-of-my-life.blogspot.jp/2017/11/python-wordpress.html
RubyでSQL Serverに接続する（TinyTDS+ActiveRecord）

RubyからSQLServerに接続する方法です。
TinyTDS+ActiveRecordを使います

TinyTDSのみの接続は[こちら](https://qiita.com/emr/items/b5dba0aa9834ece45f1a)

#環境構築
[こちらを参照](https://qiita.com/emr/items/b5dba0aa9834ece45f1a)

###Gemのインストール
- Gemfileの作成  
`bundle init`
- Gemfileに追記  
gem 'activerecord-sqlserver-adapter'  
gem 'tiny_tds'
- インストール  
`bundle install --path vendor/bundle`

> SQLServer2008以前に接続する場合、gemのバージョンを落とす必要がある。
> `gem 'activerecord-sqlserver-adapter', '~>4.1.0'`

#使い方

##SELECT文サンプル

```yaml:database.yml
development:
  adapter:  "sqlserver"
  host:     "<host or ipaddress>"
  username: "<user id>"
  password: "<password>"
  database: "<db name>"  
```

```rb:test.rb
require 'rubygems' #bundlerを使わない場合
require 'bundler/setup' #bundlerを使う場合
require 'activerecord-sqlserver-adapter'

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)

results = Record.all
results = Record.first
results = Record.find(1)
results = Record.where(Column1: 'hoge', Column2: 'fuga')

results.each do |row|
  puts row['<column_name>']
end
```

###実行結果
```
# ruby test.rb
<column_data>
<column_data>
<column_data>
<column_data>
...
```

##直接SQLを書きたい
```rb:test.rb
require 'rubygems' #bundlerを使わない場合
require 'bundler/setup' #bundlerを使う場合
require 'activerecord-sqlserver-adapter'

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)
con = ActiveRecord::Base.connection

# 結果を伴うクエリ実行
results = con.select_all("SELECT * FROM <TABLENAME>")

results.each do |row|
  puts row['<column_name>']
end

# 結果を伴わないクエリ実行
con.execute("UPDATE <TABLENAME> SET Column1 = #{'hoge'} WHERE id = 1")
```

#参考
[RubyからSQLServerのストアドを呼び出す](https://qiita.com/kitayamablue/items/1d72e975b4918cb79a85)
[ActiveRecordで生SQLを使いたいときに便利なメソッド達](https://qiita.com/yut_h1979/items/4cb3d9a3b3fc87ca0435)
GitBash 設定

## Windows



```bash
touch ~/.bash_profile

vi ~/.bash_profile
```


```bash
PS1='\[\033]0;${PWD//[^[:ascii:]]/?}\007\]' # set window title
#PS1="$PS1"'\[\033[32m\]'       # change to green
#PS1="$PS1"'\u@\h '             # user@host<space>
#PS1="$PS1"'\[\033[35m\]'       # change to purple
#PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
#PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
PS1="$PS1"'\[\033[35m\]'       # change to brownish purple
PS1="$PS1"'\w'                 # current working directory
if test -z "$WINELOADERNOEXEC"
then
    GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
    COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
    COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
    COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
    if test -f "$COMPLETION_PATH/git-prompt.sh"
    then
        . "$COMPLETION_PATH/git-completion.bash"
        . "$COMPLETION_PATH/git-prompt.sh"
        PS1="$PS1"'\[\033[36m\]'  # change color to cyan
        PS1="$PS1"'`__git_ps1`'   # bash function
    fi
fi
PS1="$PS1"'\[\033[0m\]'        # change color
PS1="$PS1"'$ '                 # prompt: always $
PS1="$PS1"'\n'                 # new line
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33237/2264c413-2a7d-4abd-67f8-03258e5566b1.png)

## treeコマンド

```bash
echo alias tree=\'cmd //c tree //A //F\' >> ~/.bash_profile
source ~/.bash_profile
```
javascriptのWebWorkerを使ってみた

## WebWorkerとは？

初心者です。

WebWorkerとはjavascriptでマルチスレッドを行うための仕組みです。
マルチスレッドとは、複数の処理を同時に行うことです。

例えば、描画処理などで
　・データ取得処理
　・取得したデータの描画処理
を同時に行うと描画が滞りなく行われます。

処理を同時に行わない場合は、

````
　データ取得　→　描画　→　データ取得　→　描画　→　・・・
````

となり、データ取得の度に描画が止まります。これを

````
　処理A　：データ取得　→　データ取得　→　・・・
　処理B　：描画　　　　→　描画　　　　→　・・・
````

の様に処理A、Bを同時に行ってスムーズに描画するという機能です。
（あくまで一例。処理が軽い場合は普通に記述して問題ない）

## 非同期処理は？

javascriptは非同期処理でpromiseなどありますが、
あれは**処理の順番を変えているだけ**で同時に処理を行うものではありません（でした）。

　非同期処理　＝　並行して処理を行ってくれる 


と考えがちですが、javascriptは（原則）違います。

## 概要とか特徴


概要
　・メインスレッド(main.js)　←メイン処理
　・サブスレッド(doWork.js)　←main.jsから呼び出して並行して処理

特徴
　・処理ごとにファイルを分ける。
　・データのやり取りはJSON等で行う。他にもある。
　・サブスレッド(doWork.js)から、DOM操作(タグ編集とか)は出来ない。
　　　window.document.form.＊＊＊＊とかはNG
　・jQueryもダメ($ajaxとか)。レスポンスには適用できる。
　・通信は、XMLHttpRequestやfetchなどで出来る。

## 基本的な使い方

　同時進行で行う処理を、doWorker.jsに記述する。
　main.jsでdoWorker.jsを呼び出す。

````index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="js/main.js"></script>
</head>
<body>
    <input type="text"   id="idParamPost"    value="送信メッセージ">
    <input type="text"   id="idParamReceive" value="">
    <input type="button" id="idBtnDoPost"    value="送信">
</body>
</html>
````

````main.js
//送信
$(document).on('click', '#idBtnDoPost', function(){

  //workerオブジェクト
  var worker = new Worker('js/doWork.js');

  //処理結果、受信イベント
  worker.addEventListener('message', function(e) {
    $("#idParamReceive").val(e.data);
  }, false);

  //処理命令
  worker.postMessage($("#idParamPost").val());
});
````


````doWork.js
//worker
self.addEventListener('message', function(e) {

  //何か同時進行で行う処理

  //処理結果を送信
  self.postMessage(e.data);
}, false);
````

注意
　main.jsのコードの書き順は決まっている様なので、この通りに書く。



## マルチスレッドな使い方
　上記では、いまいちWebWorkerの有難味が分からない。
　これが便利だと思えるのは、（繰り返しになるが）下記の様な描画処理である。
　同時に行わない場合は、データ取得の度に描画が止まる。
　下記の例では受け取る配列(aryJSON)は1つであるが、受信するバッファを複数にしたり、
　バッファの要素数を調節したりと、ケースによる調整は必要である。

````main.js

//処理開始
$(document).on('click', '#idBtnDoPost', function(){

  //非同期で受信するデータ
  var aryJSON = [];

  //workerオブジェクト
  var worker = new Worker('js/doWork.js');

  //受信イベント
  worker.addEventListener('message', function(e) {
    aryJSON = e.data;  //処理ループ内で使用するデータ
  }, false);

  //処理ループ
  while(true){

    //非同期でデータ取得
    worker.postMessage($("#idParamPost").val());

    //取得したデータ表示
    viewJSON(aryJSON);
  }

});
````

## 豆知識
　jsonデータを送受信する場合は、下記の様にパースする。

````doWork.js
//worker
self.addEventListener('message', function(e) {
  //メッセージ送信
  self.postMessage(JSON.parse(e.data));  //JSONにパース
}, false);
````
落ちている銃をプレイヤーに持たせる

落ちている武器を拾ってプレイヤーに持たせるということを実装したかったので、下記の手順で実装した。
##手順
1. プレイヤーと落ちている銃が衝突したらタグで判定してTrueの場合に処理を行う
2. 銃を拾った時点のプレイヤー側の空オブジェクト（親子関係、銃の位置を指定する用）の位置を取得
3. 落ちている銃自体はDestroyで消して、プロジェクトのRecourcesフォルダから銃のオブジェクトをロード
4. ロードした銃を2で取得した位置に配置
5. 銃の向きを調整
6. 銃を2の子の関係にする

####プレイヤー側の実装
```C#:C#
private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "smallgun")
        {
            //Playerの子としてアタッチしてあるガンを持つようの空オブジェクトを取得
            GameObject handgrip = transform.FindChild("BulletRuncher").gameObject;
            //プロジェクトに作ったResourcesフォルダ内にある"SmallGun"オブジェクトをロードして、上記の空オブジェクトの位置に置く
            GameObject weapon = Instantiate(Resources.Load("Prefabs/SmallGun"), handgrip.transform.position, handgrip.transform.rotation) as GameObject;
            weapon.transform.Rotate(0, 180, 0); //必要に応じてガンの位置を調整
            weapon.transform.Translate(0, -1, 0);　//必要に応じてガンの位置を調整
            weapon.transform.parent = handgrip.transform; //プレイヤー側の空オブジェクトの子にガンを設定

            bulletruncher.GetWeapon();
        }
    }
```
####落ちている武器側の実装
```C#:C#
    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Player") //プレイヤーが武器を取ったら消す
        {
            Destroy(gameObject);
        }
    }
```
![20171111_01.gif](https://qiita-image-store.s3.amazonaws.com/0/185127/6256fd95-f833-7615-7f2c-80714c874f85.gif)
できた！
privateなAPIをテストする方法を考えてみた

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">うーん、公開したいわけじゃないけど細かく意味のある単位に分割してテストしたいって普通にあると思うんだけどなぁ。ロジックが複雑な場合細かく分割してテストした方が効率的なことが多いし。全部パッケージプライベートにするのもパッケージ内での可視性がガバガバになるし。 <a href="https://t.co/T7JgQwQmlm">https://t.co/T7JgQwQmlm</a></p>&mdash; koher (@koher) <a href="https://twitter.com/koher/status/929165484246704129?ref_src=twsrc%5Etfw">2017年11月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

すこぶる同意。
ということで考えた。

# 型に、privateだけどtestしたいメンバがあるパターン

```Hoge.swift
struct Hoge {
    init(x: Int) { self.x = x }

    /// privateだけどTestしたいメンバ
    fileprivate let x: Int
    fileprivate func doSomething(with string: String) -> String { return "\(string) \(x)" }
}
```

Targeted Extensionを使うとよさそう。

```swift
public protocol PrivatePublicatable {
    associatedtype Publicater
    var `private`: Publicater { get }
}
public final class Private<Base> {
    public let base: Base
    public init(_ base: Base) { self.base = base }
}
public extension PrivatePublicatable {
    var `private`: Private<Self> { return Private(self) }
}
```

↑こういうのを用意して…
`Hoge.swift` 内にextensionを書く。

```Hoge.swift
extension Hoge: PrivatePublicatable {}
public extension Private where Base == Hoge {
    var x: Int { return base.x }
    func doSomething(with string: String) -> String {
        return base.doSomething(with: string)
    }
}
```

すると…

```HogeTests.swift
let hoge = Hoge(x: 1)
hoge.private.x // 1
hoge.private.doSomething(with: "ほげ") // ほげ 1
```

外からアクセスできるけどprivateっぽさを明示できる。

# そもそも型自身がprivateなパターン

```Fuga.swift
private struct Fuga {
    let x: Int
    let y: Int
    func doSomething(with string: String) -> String { return "\(string) \(x) \(y)" }
}
```

型自体が外部から見えないので、アダプタとなる型を用意しないとどうしようもない。

```Fuga.swift
/// Fugaをprivateに保つために作るTest用ラッパー。Fugaと同じファイル内に書く
final class FugaTester {
    private let base: Fuga
    init(args: (x: Int, y: Int)) {
        base = Fuga(x: args.x, y: args.y)
    }
    var x: Int { return base.x }
    var y: Int { return base.y }
    func doSomething(with string: String) -> String {
        return base.doSomething(with: string)
    }
}
```

```FugaTests.swift
let tester = FugaTester(args: (x: 1, y: 2))
tester.x // 1
tester.y // 2
tester.doSomething(with: "ふが") // "ふが 1 2"
```

辛い…本当にこの道しかないんでしょうか…
ないとしても、ボイラープレートの山なので、Testerは自動生成したさありますね。
（すごい要望があればXcode Source Editor Extensionを作るのもやぶさかではない）


# 補足

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">はい。internalでも気にならないものであれば、そうしたほうがシンプルですね。しかし本来見えてほしくないものがプロダクトコードで補完に出てしまうのもノイズになるので、「テストコード以外では見えてほしくない」という意図を現状の言語仕様の上で表現するならこうなるかなと考えました。</p>&mdash; takasek (@takasek) <a href="https://twitter.com/takasek/status/929227557446103040?ref_src=twsrc%5Etfw">2017年11月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
超初心者向け　Xcode つまづきメモ（随時更新）

# 概要

自分が超初心者なので
０からiPhoneアプリ開発を始めて
Xcodeの使い方で詰まったところを記録しておく。

## 環境

macOS Sierra
Xcode 9

### Labelのテキストが改行されない

<img width="576" alt="スクリーンショット 2017-11-11 13.08.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3094/6070ad73-a89e-d95b-a67a-c45cde521420.png">

Linesが１であるため、textが２行でも１行しか表示されない。
ここを２にすると期待通りに表示される。

<img width="570" alt="スクリーンショット 2017-11-11 13.11.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/3094/9f2493e4-98e5-a687-ddfa-43698409ceda.png">


--- 

### シミュレーターのキーボードが表示されない

<img width="357" alt="スクリーンショット 2017-11-11 13.28.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/3094/743c5fc9-3dfa-b038-81d4-77e00cd7d590.png">


直接Macのキーボードの入力は受け付けるが
シミュレーターのキーボードが表示されない。


<img width="615" alt="スクリーンショット 2017-11-11 13.19.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/3094/7971e207-bc47-658c-3f2c-0b657d24c9b3.png">

Connect Hardware Keyboard にチェックが入っていると、
シミュレーターのキーボードが表示されないため、ココのチェックを外す。

<img width="357" alt="スクリーンショット 2017-11-11 13.26.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/3094/c3c6dc60-4c08-9003-73c2-643df1cca598.png">

これで表示される。


## 参考

https://qiita.com/peromasamune/items/dd0c2f4e4ef2753f426c
canvasのサイズをjQueryで変更する

jQueryでcanvasのサイズを設定する。
cssでサイズ設定していると、初期サイズ（幅300px、高さ150px）からの拡大・縮小となる。

````index.html
    <canvas id="idCanvas"></canvas>
````

````main.js
   $('#idCanvas').attr('width' , 500);
   $('#idCanvas').attr('height', 500);
````

````main.css
  /* 初期サイズからの拡大・縮小 */
  #idCanvas {
    width  : 200px;
    height : 200px;
  }
````

追記
cssでのサイズ指定は、canvasを拡大・縮小するものであり、サイズを直接変えるものではありません（画像が縮んだり伸びたりします）。
サイズを直接変える場合は、下記を使用します。

````main.js
    //canvas
    canvas = document.getElementById('idCanvas');

    //サイズ指定
    canvas.width  = 500;
    canvas.height = 500;
````
駆け出しエンジニアが仕事の進め方を模索してみた

# 実施経緯
今まではエンジニアの方々が枠を作って、その中で業務をしていました。しかし、今回はタスクを受けてから自走する部分が多く、多少なりともエンジニア業務の真髄を体験しました。整理、アウトプットも兼ねてまとめてみようかと思います。また最後に自分なりのマニュアルを作成してみました。

# タスクを受けてからの大まかな流れ

1 タスクを与えられる
2 ビジネス側から仕様書・ワイヤーが届く
3 エンジニアの目線でそれに対して提言していく
4 それをもとに工数を見積もっていく
5 実際に開発スタート！ 

# 自分で考えて、やってみたこと
- 与えらてたタスクをざっと聞いて、実装方法がイメージする
- ビジネス側からの仕様書やワイヤーをみて、UI・UX的な部分をイメージする
- 実装に必要な機能を洗い出す(ex 検索機能 登録機能 編集機能　ダウンロード機能...)
- そこから実際に時間を割り振りする(ex 検索機能 1day, 登録機能 2day....)
- 開発スタート！

=> 結果　**爆死**

# なぜ爆死したのか
1 実装に必要な機能を洗い出しきれていなかった
2 エンジニアの目線で提言できず、機能を最適化することができなかった
  ex　機能の必要性、DB設計による制約など..
3 時間の割り振りがアバウトすぎた
4 期待値で考えてしまった
5 詰まったときに時間をかけすぎてしまった
6 実装機能の参考ページがたくさんありすぎて惑わされた


# 自己(事故)分析
1・2番は圧倒的に想像力や経験が不足している
**対策**
それが全てだが、不足していると言っても意味がないので今できることとして
似たようなツールやサービスを調べて、実際に触ってみる

3・4番は実装機能の概算を誤り、期待値で時間を割り振ってしまった。一度詰まってしまうと、崩れてしまう。
**対策**
機能を調べる過程で仕様技術や経験に基づき、期限日から逆算して割り振っていく。これくらいできるだろうとう甘い考えはすてる。自ずと自らを殺しめることになる。 

5番は上司への情報共有不足。
**対策**
時間を決め、コミュニケーションツールを使って報告する
日報などで一日の流れを報告する

6番は優れた記事を選別する能力
**対策**
基準を設ける
新しめの記事 -> いいねの多い記事 -> 英語の記事(stackoverflow...)
google の拡張機能を上手に使う
[ato ichinen](https://chrome.google.com/webstore/detail/ato-ichinen/pojaolkbbklmcifckclknpolncdmbaph?hl=ja): 一年以内の記事を優先して出してくれる。

# 自分のルールを決める

1 仕様理解
2 不安な箇所、疑問点はここで一度解消
3 その後タスク分解と見積り
4 それらを振り返り、不安であればもう一度相談
  => 意外と自分で気づけない箇所も多いから機会があればレビューを受ける方が良いかもしれない
5 実装しやすい場所から取り掛かる
6 実装を終えて、見積もりとのブレを分析する
7 作業に詰まったら　1h粘る -> 相談　-> 1.5h 粘る ->相談　と時間を決める
8 エンジニアの方々も作業をしているため、質問にも優先度をつける
　ex) 口頭 or slack or プルリクで重要度をわける
9 プルリク時は細かくを意識、10ファイル変更は避けていきたい。いや避ける。
10 日報は次の日に書く。前日の振り返り、見積もり分析と本日のタスクを記載
  =>これは日報と言えるのかわかりませんが..

# 最後に
　マニュアル作成とQiitaのようなpublicな場所で公開したことで、強い拘束力が生じます。私のような。割と口だけで終わってしまうタイプは、こういった試みは効果的だと思います。
自分の仕事の型を見つけたり、見つめ直したりするにはとてもいい方法だと思います。ぜひ一度マニュアル化、もしくは従来自分の型などを整理してみてください。
できればみなさんの仕事の型やマニュアルなどがありましたら、コメントしてくださると嬉しい限りです。

# 参考
初心者エンジニアにおすすめしたい「進捗どうなった？」と言われないための仕事の進め方
https://qiita.com/soyanchu/items/d1cb9785fc211941a009
Laravelのリクエストに未入力のフィールドが入った場合、空文字になるかnullになるか

#結論
自動で空文字がnullに変換される
>Laravelのミドルウェア[TrimStrings]と[ConvertEmptyStringsToNull]により、空の文字列フィールドは自動でnullに変換される。この処理を無効にするには、App\Http\Kernelクラスの$middlewareプロパティから該当のミドルウェアを削除する

https://readouble.com/laravel/5.4/ja/requests.html
(入力のトリムとノーマライゼーション)


#入力値が空かどうかの判別
ユーザーがフォームからリクエストを送信する場合、任意項目は空のまま送信されることがあります。
例えば任意項目(例：質問)の入力有無で処理を分けたい場合に、以下のどちらで判別するか迷っていました。

```php
//空文字が送られてくる場合
if($question !== ''){・・・}

//nullが送られてくる場合
if(isset($question)){・・・}
```
nullに自動変換するなら２番目か、と思っていましたが、
そもそも`empty()`を使えばどちらで良かった。。

```php
//空文字だろうがnullだろうがこれでOK
if(!empty($question){・・・}
```

コントローラー等でチェックする場合はこれでチェック可能。
入力値が存在するor空文字で無い場合は`true`を返す。
(ドメインモデルでチェックする場合はRequestクラスに依存するため使わない方が良さそう)

```php
if ($request->has('question')) {・・・}
```

[追記]コメントで指摘頂きました。
Laravel5.5では`has`メソッドは空文字の場合もtrueを返す仕様に変わったようです。
5.5では`filled`メソッドを使うと5.4の`has`メソッドと同じことが実現できるようです。

```php
if ($request->filled('name')) {・・・}
```



(参考)
https://readouble.com/laravel/5.4/ja/requests.html
SBCLでMPFR

爆死したCBCTF2017の供養も兼ねて、sbclのcontribにあったMPFRの使い方をメモ。

Common modulus2で3乗根の計算をすればいいことまでは分かったけど、そもそも計算の仕方が分からずに死んだ。
終わったあとに再び探しまわったら、sbclのcontribの中にMPFRのモジュールがあったので使い方を調べた。
日本語の情報がなかったのでメモしておく。

# 使い方
```cl
(require 'sb-mpfr)

(setf mpfr-f (sb-mpfr:coerce 27 'sb-mpfr:mpfr-float))
(sb-mpfr:coerce (sb-mpfr:k-root mpfr-f 3) 'integer) ;; => 3
```

こんな感じで使える。
サンプルでやってることは、27の3乗根をとって、整数に変換するというだけの処理。

要点は、最初に`sb-mpfr`をインポートしないといけないということと、数値を`sb-mpfr`モジュール中の`coerce`で`mpfr-float`に変換する必要があることである。

他にも精度を任意に変えられたりするので、多倍長整数の演算をするときにも精度を保ちつつ計算できる。
lisp組み込みの関数だと時々変換できなくて計算できなかったりするので非常に助かる。
[Redmine] トップページの帯の色を変える

＊以下を参考にさせてもらい、実際にやってみました。

[Redmineでトップページの帯の色を変える](https://qiita.com/redpanda/items/f31898e46f432986422d)

---

＊自分の環境
　Debian 8.0
　Redmine 2.5.2.devel

・スタイルシート「background-color」を変更する。
　　stylesheets/application.css

``` shell-session
# cd /usr/share/redmine/public
# vi stylesheets/application.css
（以下変更）
#top-menu {background: #3E5B76; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
　　↓
#top-menu {background: #388e3c; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}

（以下変更）
#header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;}
　　↓
#header {min-height:5.3em;margin:0;background-color:#4caf50;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;}
```

＊色見本は、以下サイトを利用しました。

material design
https://www.materialpalette.com/colors
NVIDIA DIGITS 6をdockerで実行

## システム構成
- Ubuntu Server 16.04.3 LTS
- NVIDIA GeForce GTX 1080

## インストール
### Docker CE
```
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update -y
$ sudo apt-get -y install docker-ce
```
### nvidia-docker
```
$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
$ sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
$ sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
```

## 起動
```
$ sudo nvidia-docker run  -d --restart=always -d  -p 5000:5000  -p 6006:6006  -v /{ホスト側のパス}/digits/jobs:/jobs  -v /{ホスト側のパス}/digits/data:/data  nvidia/digits:6.0
```

## 参照
- [nvidia-docker](https://github.com/NVIDIA/nvidia-docker)
- [NVIDIA DIGITS](https://developer.nvidia.com/digits)
Paper > On numerical orientation averaging with spherical Fibonacci point sets and compressive scheme (2018) by Jianing Zhang

### 背景

大気のエアロゾル（微小粒子）や宇宙空間のダストなど、それらの光散乱特性を用いた解析を行う時には「random orientation averaging」を考えることが多い。

観測対象領域において多種多様な方向を向いた粒子が同時に存在し、それをまとめて見るとする時には「random orientation averaging」を行う、という考えである。

> https://www.giss.nasa.gov/staff/mmishchenko/books.html
の Mishchenko, M. I., J. W. Hovenier, and L. D. Travis, Eds., 2000: Light Scattering by Nonspherical Particles: Theory, Measurements, and Applications, Academic Press, San Diego. 


そのため、多種多様な入射光を考慮した光散乱特性が必要となり、その計算には膨大な時間がかかる。

その計算時間を短縮するには、「どの方向の計算を使って平均（積分）するか」が重要となる。

下記に紹介する論文は「どの方向の計算を使って平均（積分）するか」についての新提案手法である。

### 論文

On numerical orientation averaging with spherical Fibonacci point sets and compressive scheme
Jianing Zhang
http://www.sciencedirect.com/science/article/pii/S0022407317303734

7of9は[2008年にQMCの論文を出した](http://www.sciencedirect.com/science/article/pii/S002240730800006X)。
QMC: quasi-Monte-Carlo
その手法に対して、著者は２つの提案をしている。

1. Fibonacci point sets
2. compressive orientation averaging scheme

QMCとFibonacci point setsはどちらが優れているかの比較はされていない。

Compressed Sensing(以下、CS)の概念としては、以下のようなものだと認識している。

- 積分計算に用いる点について、negligible(無視してよい）点を省く
- 信号処理などで使われているようだ
- l1normを使う
    - outlierに強い
    - 論文ではl1magicというMATLABコードを利用している

実際に論文においてCSを用いた計算時間の短縮（と精度の保証）が紹介されている。

### 備考

今後はCSがよく使われるようになるかは不明ではある。
QMCだけを使う場合と比べて複雑であるため、l1maicの処理に相当するものをそれぞれのユーザが利用できないと、特定の研究者のみが使うだけにとどまるだろう。

### 検索用キーワード

- compressive sensing
- compressive sampling
- sparse sampling

### 関連

[Link > Compressed Sensing in Python by Robert Taylor](https://qiita.com/7of9/items/18e3e7e4519e725c5f59)
Lego Mindstorms NXT (nxtJSP)をCygwinじゃなくてMinGWが入っているWindowsで開発環境を構築

Lego Mindstorms NXTの開発をすることになったけどなんとなくこれまでMinGWで済んでたので今更Cygwin入れたくないマンが苦労した話です。

# 準備したもの
基本的にはCygwin用と同じでだいたい公式が配布しているので詳細は他の記事などに任せます。

* mingw-get-setup.exe・・・MinGWインストーラ
* bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4.exe・・・GNU ARMインストーラ、このバージョンじゃないとダメらしい。
* cygintl-3.dll・・・このdllがないとGNU ARMがコンパイル時にエラーを吐く
* nxtOSEK_v218.zip・・・nxtOSEK/JSPのカーネルやサンプルプログラムが入っている。
* NXT Fantom Drivers・・・NXTドライバインストーラ
* nexttool.exe・・・USB接続用ドライバ
* lms_arm_nbcnxc_107.rfw・・・ファームウェア
 
# MinGWインストール
(元々入っていたけど念のため)
mingw-get-setup.exe
を起動してCドライブ直下にMinGWフォルダとしてインストール。

* mingw32-base
* mingw32-gcc-g++
* msys-base
にチェックをいれてApplyChangeした状態。

たぶんmakeだけ使えればいいのでgccとか入ってなくても動くかもしれない。

環境変数PATHに

* C:\MinGW\bin
* C:\MinGW\msys\1.0\bin
* 
を追加する。

#GNU ARMインストール
bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4.exe
を起動する。
インストール時の設定は

* DiriectoryをC:\cygwin\GNUARMに変更・・・※1
* Select ComponentsのFloating Point Unitを選択解除
* Select ComponentsのBig Endianを選択解除
* Select Additional TasksのInstall Cygwin DLLsは選択・・・※2
* Add the executable directory to the PATH variableも選択・・・※2

環境変数PATHに
・ C:\cygwin\GNUARM\bin
の追加を確認する。

その後 cygintl-3.dll をC:\cygwin\GNUARM\binに入れる。

※1:ビルド時に呼び出すライブラリがcygwinを想定してファイルパスを決め打ちしているのか、とりあえずcygwinという名前のフォルダを作ってその中にインストールしないとうまくいかない。

※2:結局ビルド時にCygwinの関数を呼び出すのでdllだけはおいておかないといけないという。

#ドライバなどのファイルの展開と配置
あとは基本的にCygwin環境と同じようにファイルを配置していく。

1. NXT Fantom Driversのsetup.exeを実行しNXT用ドライバインストール
2. C:\cygwinにnextoolフォルダを作成する。
3. lms_arm_nbcnxc_107.rfwをnextoolフォルダに配置
4. nexttool.exeをnextoolフォルダに配置
5. 適当な場所にnxtOSEK/JSPのzipを展開してnxtOSEKフォルダを配置
6. nxtOSEKの中にサンプルがある。samples_jsp_c/helloworldなどでコマンドプロンプトからmake allしてみる。多分失敗する。

## Makefileなどのパス修正
ビルドに失敗するのはサンプルのMakefileなどに書かれたルートパスなどがcygwin環境での実行を前提にしているので
/cygdrive/C/cygwin/GNUARM
のようになっているため。
全部のファイルの中身を対象に"cygdrive"で検索すると何箇所か見つかりますので以下のように適宜修正。

* nxtOSEK\ecrobot\tool_gcc.mak
    * GNUARM_ROOT = /C/cygwin/GNUARM
    * NEXTTOOL_ROOT = /C/cygwin/nexttool

(他にもあったような気もする)

以上で環境構築は終わりです。
先程のhelloworldフォルダでmake allすればおそらくうまくビルドされバイナリファイルなどが出力されると思います。

ただし単にmakeしたり、ソースコードの一部を修正してmake allすると
```
make.exe": *** No rule to make target `/cygdrive/c/cygwin/GNUARM/bin/../lib/gcc/arm-elf/4.0.2/include/limits.h', needed by `build/kernel/banner.o'.  Stop.
```
のようにcygdriveの含んだパスのファイルを探しに行って参照エラーになってしまう問題があるようです。
これは私の知識が足りないのか未だに解決できていません…。
少し手間ですが毎回make cleanしてからmake allしましょう。
Ubuntu 16へのNVIDIAドライバーインストール

## システム構成
- Ubuntu Server 16.04.3 LTS
- NVIDIA GeForce GTX 1080

## デフォルトのドライバnouveauを無効
```bash:/etc/modprobe.d/blacklist-nouveau.conf
# vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
alias nouveau off
```

```bash:/etc/modprobe.d/nouveau-kms.conf
# vi /etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0
```

```
# update-initramfs -u
# apt-get install linux-source
```
## NVIDIAドライバのインストール
```
$ mkdir downloads
$ cd downloads/
$ wget http://us.download.nvidia.com/XFree86/Linux-x86_64/384.90/NVIDIA-Linux-x86_64-384.90.run
$ chmod 755 NVIDIA-Linux-x86_64-384.90.run
$ sudo sh NVIDIA-Linux-x86_64-384.90.run
$ sudo reboot
```
```
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90                 Driver Version: 384.90                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:01:00.0 Off |                  N/A |
| 44%   64C    P2    51W / 180W |   2464MiB /  8114MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
```
高校生初心者集団が１からゲーム作ってみた件

#概要
みなさん、初めまして。
現役で高校生をやっている者です。
我々は約３ヶ月という期間の中で、右も左もわからない状態からUnityを用いたゲーム制作を行い、Google Playにリリースしました。
恐らく、皆さんからご覧になれば、**取るに足らないクソゲー**も良い所だと思います。

それでも、今年の夏には***Rigidbodyすら知らなかった***素人高校生が
どうにかこうにか作り上げた駄作を一作作り上げました。

ですから、皆様におかれましては、こいつを試しにインストールして
ちょっと遊んでから「やっぱクソゲーだな」とアンインストールして
「クソゲー乙wwwおもんなwwwマジで時間の無駄だったわwww」とコメント下さい。
（もちろん普通のアドバイスも大歓迎です。むしろそっちが良い）
***
#リンク
インストールページは[こちら](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku)です。よろしくお願いします。

#最後に
上には色々書きましたが、実際私たちはかなり真剣に取り組んだつもりです。~~（その結果生まれたのがクソゲーでも）~~
ですから、改良点等ありましたら、是非ともコメント欄にお寄せ下さい。様々な方々のご意見・ご感想お待ちしております。
また、なれない者ですので、この文章にも幾分か見苦しい点が御座いますことをお詫び申し上げます。どうかご容赦頂いた上で、やっぱりご意見・ご感想の程、宜しくお願い申し上げます。
***
***
最後にもう一度！！[リンク](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku)です！！よろしくお願いします！！
Jupyter + MATLAB > Ubuntu 16.04 > カーネルが落ちる

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

[jupyter notebookをmatlabで使う / Google Driveにnotebookを保存](http://ossyaritoori.hatenablog.com/entry/2017/09/20/jupyter_notebook%E3%82%92matlab%E3%81%A7%E4%BD%BF%E3%81%86_/_Google_Drive%E3%81%ABnotebook%E3%82%92%E4%BF%9D%E5%AD%98)
を参考にMATLABをJupyterで使おうとした。

```
sudo pip install matlab_kernel
```

(補足: sudoを付けて実施）。

インストールされた。

Jupyterで実行するとMATLABが選択できるようになった。

```matlab
load tetmesh
size(X, tri)
```

カーネルが落ちる。


```
ImportError: 
        Matlab engine not installed:
        See https://www.mathworks.com/help/matlab/matlab-engine-for-python.htm
```

上記が足りないようだ。


https://www.mathworks.com/help/matlab/matlab-engine-for-python.htm
> The page you were looking for does not exist. Use the search box or browse topics below to find the page you were looking for.

### 正しいリンク
(追記 2017/11/21)

http://jp.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

リンク先の情報を試したが、「Matlab engine not installed:」は解消しなかった。
MacでCaps Lockキーを無効化

突然ですがCaps lockキーって邪魔じゃないですか？
タイプライター時代に生み出されたボタンで、FORTRANなど大文字入力が必要な言語では不可欠とのことです。
が、私は使うことより押し間違えてキーッとなることの方が多いので以下の手順で無効化しました。
完全に既出の情報ですが自分は知らなかったので、誰かの役に立てばいいと思い共有させていただきます。
`システム環境設定` => `キーボード` => `修飾キー` => `Caps Lock` => `アクションなし` を選択。
以上です。
<img width="669" alt="スクリーンショット 2017-11-11 10.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/dcce2064-a4cb-92d5-95c8-16b59bb6696f.png">
MATLAB > tetmesh > tet: mesh, X: element > X:座標情報, tet: 四角形の座標インデックス?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### 関連

[MATLAB > load tetmesh > tetとX > nodeとelement](https://qiita.com/7of9/items/131af4bbe54fc619478c)

### tet:meshとX:element

```matlab
>> load tetmesh
>> size(tet),size(X)

ans =

        4969           4


ans =

        1456           3
```

以下と関係あるだろうか。
https://jp.mathworks.com/help/pde/ug/femesh-properties.html
> Nodes is a D-by-Nn matrix, where D is the number of geometry dimensions (2 or 3), and Nn is the number of nodes in the mesh. Each column of Nodes contains the x, y, and in 3-D, z coordinates for that mesh node.

> Mesh elements, returned as an M-by-Ne matrix, where Ne is the number of elements in the mesh, and M is:
...
> Each column in Elements contains the indices of the nodes for that mesh element.

```matlab
>> X(1:5,:)

ans =

  -22.5000         0   20.0000
  -22.5000         0         0
         0   22.5000         0
   22.5000         0         0
   22.5000         0   20.0000
```

Xは座標なのだろう。

```matlab
>> tet(1:10,:)

ans =

        1092        1093         858         891
        1092         856        1094        1095
        1092        1095         896         856
        1092        1096        1097         891
        1092        1094        1098        1095
        1092         896        1096         891
        1099        1100        1101        1102
         579        1103        1099        1104
        1105        1099        1102        1100
        1099        1100         670         576
```

tetは四角形の情報と推測する。各四角形に対して、Xで定義された座標のインデックスがtetに入っているのだろう。

https://qiita.com/7of9/items/2c0d30a618efcdeabb0f

```matlab
load tetmesh
trep = TriRep(tet, X);
[tri xf] = freeBoundary(trep);
trisurf(tri, xf(:,1),xf(:,2),xf(:,3), 'FaceColor', 'cyan', 'FaceAlpha', 0.8);
```

のコードは、TriRep()を使い三角形に分割する。
コネクテッドカーについて

# コネクテッドカーとは

コネクテッドカーは、車がIoT的にインターネットにつながり、データを送信し、分析、フィードバックを得るというような文脈で語られることが多くなってきました。
そういう側面ももちろんあるのですが、元々は車内の機器をより便利にするために、通信を使おうというのが始まりでした。

人によって定義が違うバズワードぽく扱われることもありますが、通信やデータフォーマットの業界規格があったり、プロダクトやサービスとして単体として成立しているものも多数あり、”ビッグデータ”とか”IoT”なんかと比べると、比較的扱いやすいキーワードかと思います。

# コネクテッドカーの解説

都内でこれについて話す機会がありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/b2cc87a0-dca3-5707-fd34-5e736e4fcacd.png)
[コネクテッドカーの胎動と交通サイバーフィジカルシステム - SlideShare](https://www.slideshare.net/omasutani/ss-81810056)


私は、コネクテッドカーに関わる部門にいるのですが、今までは関係ありそうで、直接取り扱うような仕事はあまりありませんでした。
自分の中での整理とともに、現職のプロダクトがどんなものだったのかも、この機会に見てみようというのりで書いてみました。

テレマティックスというやや古めかしくなってしまった言葉が、車業界にはありますが、日本ではいわゆる通信カーナビという形で、日本車の純正カーナビについてきた機能のことがほぼ、それに当たります。
テレマティックスの流れをくむ、おもにPULLをメインとしたサービスとは対照的に、車がインフラに積極的に情報をPUSHをして、社会全体に貢献しようというものもコネクテッドカーに含まれます。後者はV2Xという形で長くIntelligent Transportation Systemの一環として培われてきました。

そんな流れをなるべく時系列に、体系化してみようと思ったのですが、V2Xのところは複雑すぎて、書ききれませんでした。まあ、もう少し実用化が進んだ段階ではいろいろなものが整理されてくると思います。
jenkinsでおいそれそれと実行したくないジョブにパスワードをつける

# 背景
jenkinsのジョブ一覧にテスト環境で実行されるジョブ、本番環境で実行されるジョブが混在する。

# 問題点
ボタン一個でジョブが実行されるため、やれテスト環境で実行しようと思ったものが
本番に対してのジョブだったりする。

# 試したこと
viewと作成して、細分化してみたりする。
![スクリーンショット 2017-11-06 10.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/105662/83fcdaeb-749c-cbd2-346b-bf8acc89ad6c.png)


実行したい環境ごとにjob一覧の画面を分けることが可能。
ただし、これも、結局すべてのジョブを一覧で見ることができるので、
集中力がないと間違って実行しやすい。



# 試したこと２
ジョブ自体にパスワードをつける

![スクリーンショット 2017-11-06 10.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/105662/fc1c4b49-53c2-8dac-53a4-f8d6173f8065.png)

こんな感じでパラメータにチェックボックスと文字列を追加する。

![スクリーンショット 2017-11-06 10.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/105662/3adf1d1f-e0fa-20ea-ba23-5273210eabed.png)

シェルの実行にそのパラメータの判定を埋め込む

![スクリーンショット 2017-11-06 10.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/105662/7d359e93-4887-9d0f-4d09-f8de27700b4b.png)

ジョブ実行の際に、チェックを入れてパスワードを入れないとシェルが途中で失敗するので、上記画面で気付ける。
また、実行しても、パスワードが間違っていたら、shell開始直後にアウトする。
パスワードにメッセージを込めても良い。
これで（似たような名前のジョブと間違えて）、うっかり実行できなくなる。

ヒューマンエラーは完全には防げないが、小規模な場合は最低限でもこれぐらいしておいたほうがよさそう。
Docker+Mysql+Jupyterで即座にデータ解析環境を用意する

# 背景
- データ解析するときにDockerでサクッとそれっぽい環境つくれたら便利
- pythonでデータ分析と実行結果の記録が並行して行えるjupyter-notebookというものがある
- 使ったことないけど、便利そうなので、とりあえずDockerで構築してみよう（という動機で始めた）

# 概要
Dockerでjupyter(notebook)、mysqlのコンテナを立ち上げて、
jupyterからmysqlコンテナに格納しているデータを参照する。

# docker-compose.yml

db(mysql), jupyter(notebook)の２コンテナ

```yml
version: '2'
services:
  db:
    build: db
    environment:
      - MYSQL_DATABASE=analysis
      - MYSQL_ROOT_PASSWORD=password
      - TZ=Japan
    networks:
      - default
    ports:
      - '3306:3306'
  jupyter:
    build: jupyter
    volumes:
      - ./jupyter/work/:/home/jovyan/work/
    ports:
      - '8888:8888'
```

jupyterのホームディレクトリをマウントしておくことで、
データ解析結果や途中結果をローカル環境にも保持することができる

```yml
environment:
  - MYSQL_DATABASE=analysis
```

mysqlにこの記述をしておくと、コンテナ起動時に指定したDBを自動で作成してくれる（便利）

# Dockerfile
2コンテナに用意

### jupyter
```dockerfile
FROM jupyter/datascience-notebook

WORKDIR /home/jovyan/work
COPY requirements.txt ./
RUN pip install -r requirements.txt
```

ちょっと引っかかりやすいのですが、私の構成では

```COPY requirements.txt ./```
が正解で
```COPY jupyter/requirements.txt ./```
ではないです

docker-composeのbuildで指定した場所がカレントになるようですね。

### db

mysqlは日本語データを扱う場合に、設定が必要なので以下のように設定。
日本語扱わないならば、Dockerfileを用意しなくても良い

```dockerfile
FROM mysql:5.7

RUN apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'collation-server=utf8mb4_general_ci'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf
```
### 追記
久しぶりに立ち上げたら動かなかった。mysqlのバージョンを指定して（下げたら）うまくいった

# Docker立ち上げ
```
$docker-compose build
$docker-compose up
```

# jupyter-notebook

コンテナ立ち上げ時に以下のようなログをコンソールが吐くと思うので、そのurlにアクセスすればOKです。
```
http://localhost:8888/?token=hogehoge
```

あとは、こんな感じでnotebookからDocker上のmysqlコンテナに接続することができます。

```
connection = pymysql.connect(host="db", db="analysis", user="root",
password="password", charset='sjis', cursorclass=pymysql.cursors.DictCursor)
```

あとは、そこでデータを作成したり、集計したり、加工したり、グラフ化してみたり、お好きなように。

# リポジトリ
ご参考にどうぞ
https://github.com/SLEAZOIDS/jupyter-on-docker
Windows環境でのNode.jsのoracledbのインストール

#oracledbパッケージとは
node-oracledbはオラクルが提供している、Node.jsでOracle DBにアクセスするためのnpmパッケージです。Winodows上でこれをインストールするのに、若干の手間が必要となるので、メモ的に書いてみました。
#インストールの前提
oracledbパッケージをインストールには以下が必要になります。
1. Python 2.7
2. C Compiler with support for C++ 11 (Xcode, gcc, Visual Studio or similar)
3. Oracle 11.2, 12.1 or 12.2クライアント・ライブラリ

Windows環境ではwindows-build-toolsと呼ばれるNode.jsパッケージをインストールすると、Pythonも一緒にセットアップされるので、とても便利です。
#windows-build-toolsのインストール
windows-build-toolsをインストールすると、Windowsに PythonとVisual Studio環境が組み込まれます。インストールするには、管理者モードで実行したPowerShell上で行う必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108609/6cacb041-8020-0545-4c1d-7a5485ddc407.png)

PowerShellから以下を実行します。
`npm install --global --production windows-build-tools`

#Oracle Instant Clientのインストール
Oracle Instant ClientのBasicおよびSDKを、以下URLからダウンロードします。
http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html
BasicとSDKは同一ディレクトリにZIPファイルを展開します。ここでは、12.2用のInstant Clientを d:\instantclient_12_2の下に展開した例で説明します。
d:\instantclient_12_2にPATHを通してください。
#oracledbのインストール
コマンドプロンプトからoracledbパッケージ・インストールで必要となる環境変数をセットします。
`set PATH= D:\instantclient_12_2;%PATH%
set OCI_LIB_DIR=D:\instantclient_12_2\sdk\lib\msvc
set OCI_INC_DIR=D:\instantclient_12_2\sdk\include`

設定がうまくいっていることを確認するために、「%OCI_INC_DIR%\oci.h」でファイルが開けることを確認してください。
`notepad %OCI_INC_DIR%\oci.h`

これでようやくoracledbパッケージがインストールできます。
`npm install oracledb --save`