OmniAICreator/Qiita-1.07M huggingface dataset:
Go 効率よくなるTips

##bytesパッケージ、文字列の連結が早くなる

```go
import (
	"bytes"
)

func StringBuild_good() string {
	var buffer bytes.Buffer
	for i := 0; i < 1000; i++ {
		buffer.WriteString("a")
	}
	return buffer.String()
}
```
## mapの特性を利用する
sliceの中で探す時にmapを使うと、スピードが早くなる

```go
// 重複した要素を削除して返却
func removeDuplicate1(args []string) []string {
    results := make([]string, 0, len(args))
    encountered := map[string]bool{}
    for i := 0; i < len(args); i++ {
        if !encountered[args[i]] {
            encountered[args[i]] = true
            results = append(results, args[i])
        }
    }
    return results
}
```
##number format
```
'%d' % 100      # '100'
'%8d' % 100     # '     100'
'%-8d' % 100    # '100     '
'%08d' % 100    # '00000100'
'%08d' % -100   # '-0000100'
'%.8d' % 100    # '00000100'
'%10.8d' % 100  # '  00000100'
'%-10.8d' % 100 # '00000100  '
```

## range罠
```go
words := []string{"hoge", "fuga", "foo", "bar"}
//1.
for word := range words {
    fmt.Println(word)
}

//2.
for _,word := range words {
    fmt.Println(word)
}


#1.結果：
0
1
2
3

#2.結果
hoge
fuga
foo
bar
```

### slice処理tip,『 : 』を効率よく使う

```go
//末尾の要素
v := slice[len(slice)-1]
// 末尾削除
slice = slice[:len(slice)-1]


//先頭の要素 
v:= slice[0]
slice = slice[1:]

pos := 追加する位置
// slice , slice[pos] = append(slice[:pos+1], slice[pos:]...), 追加する要素
slice = append(slice[:pos+1], slice[pos:]...)
slice[pos] = 追加する要素

```

##jsonデータの扱い：
Goでの基本的なJSONデコード処理の書き方は

1.構造体を定義する
2.ファイルやWebAPI等からJSON文字列を取得する
3.json.UnmarshalでJSON文字列をデコードし、結果を構造体変数に放り込む
4.構造体変数のデータを処理をする

となります。

そもそもjson.Unmarshalのデコード結果はinterfaceで返ってくるので、構造体の定義は必須ではないのですが、GoでJSONを扱う上では使った方がよいです。
https://qiita.com/nayuneko/items/2ec20ba69804e8bf7ca3

interfaceからデータを取り出す方法

```go

//JSONデコード
var decode_data interface{}
if err := json.Unmarshal(bytes, &decode_data); err != nil {
    log.Fatal(err)
}
// 表示
for _, data := range decode_data.([]interface{}) {
    var d = data.(map[string]interface{})
    fmt.Printf("%d : %s\n", int(d["id"].(float64)), d["name"])
}   
```
vccwですべてupdate

# いままでのやり方としたいこと
shellscriptですべてをupdateするように書いていたけどそれを動かすのを手動で行っていた。

```shellscript
sh wp_update.command
```
```bash:wp_update.command
#!/usr/bin/env bash
set -ex
vagrant ssh -c "wp core update";
vagrant ssh -c "wp core update-db";
vagrant ssh -c "wp plugin update --all";
```

上記のような感じで本体、プラグイン、DBをアップデートするコマンドが書いてあるファイルを実行してアップデートしていた。
aliasというものを覚えたのでそこから発火するようにした。

# gistに登録
gistに登録したコマンドをエイリアスで実行させます。（そういう理解でよいのかな・・・）
vccwのvagrantfileを配置しているディレクトリで[wpupdate]とコマンドを実行するとアップデートしてくれます。

```bash
#!/usr/bin/env bash
set -ex
vagrant ssh -c "wp core update; wp core update-db; wp plugin update --all"
```

```bash:.bash_profile
# wp update
alias wpupdate='curl -L https://gist.githubusercontent.com/GotoKazu/7694e1aa91aef025bfcf/raw/dec3fd1646e041a1e10d6cf3b536b64b518bf3a2/wp_update_all | bash'
```
[本当に正しい .bashrc と .bash_profile の使ひ分け](https://goo.gl/3TGvAZ)
IoTシステム技術基礎検定　目次

**IoTシステム技術基礎検定**の勉強メモまとめです。
(17/11/06)作成。2章最後まで。
(17/12/01)テキスト完了。
(17/12/02)第1回受験。これで一旦完了。

#目次
####はじめに
[#0 この試験について](https://qiita.com/yamato031033/items/ca61db76d7519ecd7806)
####第1章　IoTの概要を知る
[#1 1-1 ~ 1-6](https://qiita.com/yamato031033/items/a039f729fd6317554f80)　P10-27
[#2  1-7 ~ 1-12](https://qiita.com/yamato031033/items/aeccb7d42960b78f25aa)　P28-47
####第2章　IoTデバイスを理解する
[#3 2-1 ~ 2-5](https://qiita.com/yamato031033/items/4563557ca9b87a74f34b)　P50-69
[#4 2-5 ~ 2-8](https://qiita.com/yamato031033/items/97cfe2f7ec624eb9b734)　P70-78
[#5 2-9 ~ 2-13](https://qiita.com/yamato031033/items/354bdfd57cbda3423c1d)　P79-94
####第3章　IoTにおける通信方式を知る
[#6 3-1 ~ 3-3](https://qiita.com/yamato031033/items/55e95c35143e1ecfb1b8)　P96-106
[#7 3-4 ~ 3-5]
(https://qiita.com/yamato031033/items/dd87e98dd433ba54df18)　P107-116
[#8 3-6 ~ 3-8]
(https://qiita.com/yamato031033/items/806e885f47578b773914)　P117-126
####第4章　モバイル環境とその活用を知る
[#9 4-1 ~ 4-5]
(https://qiita.com/yamato031033/items/a94bad5691f570fa345e)　P128-142
####第5章　IoTでデータを活用する
[#10 5-5 ~ 5-7]
(https://qiita.com/yamato031033/items/c1f46bcbaee483aea8cc) P144-155
[#11 5-5 ~ 5-7]
(https://qiita.com/yamato031033/items/5f549c9eb65c570f7b96) P156-164
####第6章　プロトタイピングを知る
[#12 6-1 ~ 6-4]
(https://qiita.com/yamato031033/items/e3a382733d7e2dd74cc5) P166-176
####第7章　情報セキュリティを知る
[#13 7-1 ~ 7-4]
(https://qiita.com/yamato031033/items/a6e20971792de83a63bb) P178-192
[#14 7-5 ~ 7-8]
(https://qiita.com/yamato031033/items/abe5b2d479a6fde7c65c) P193-204
####第8章　IoTのエコシステムを知る
[#15 8-1 ~ 8-5]
(https://qiita.com/yamato031033/items/9bb7c07472d0fadd1c40) P206-219

####おわりに
[出てきそうな用語]
(https://qiita.com/yamato031033/items/e07aeb609d0aade37a86)
[明日、試験受けに行ってきます]
(https://qiita.com/yamato031033/items/7ed5bea5f52dc3dfd9bd)
[試験受けてきた]
(https://qiita.com/yamato031033/items/db6fa61b80da921519df)

#関連リンク
[受験要項]
(http://www.mcpc-jp.org/iotkentei/kentei_msg_kiso/index.html)　
[対応テキスト（白表紙、緑帯のほう）]
(http://www.mcpc-jp.org/iotkentei/text.html)
　
[基礎例題（問題）]
(http://www.mcpc-jp.org/iotkentei/pdf/kisosample.pdf)
[基礎例題（解答）]
(http://www.mcpc-jp.org/iotkentei/pdf/kisosampleanswer.pdf)　

（参考）中級のサンプル問題
[中級例題](http://www.mcpc-jp.org/iotkentei/pdf/sample.pdf)
[中級例題（解答）](http://www.mcpc-jp.org/iotkentei/pdf/sampleanswer.pdf)
TCPDFのファイル保存

PHPでPDF出力に用いられるTCPDF。
ファイル保存では以下のようにOutputメソッドでファイルパスとオプションとしてFを渡せばよい。

`$tcpdf->Output($filePath,'F');`

上記でローカルに保存する分には問題ないのだけれど、ネットワーク上のPCに対して保存する場合、保存することが出来なかった。ソースを確認した結果、/include/tcpdf_static.phpのfopenLocal関数で失敗している模様。fileプロトコルにネットワークパスが対応していなかった。if文をコメントアウトすればとりあえず解決した。
オプションのFの説明としては、ローカルでの保存と書いてあるので解決と書いていいのかどうか。
オフラインリアルタイムどう書く E19 の問題

問題はこちら->http://mtsmfm.github.io/2017/11/04/doukaku-e19.html

良い方法を思いつきませんでしたので、普通に左上から探索しています。
前後二列ずつの配置で場合分けする方法も考えましたが、
労力の割に効果がない気がしましたのでやっていません。
同じ数が二個ずつありますので、そのままではバックトラックしたときに重複がかなり出ます。
そこで、同じ数列の二組に分け、前の組にある数は後の組で選べないようにしました。

```prolog
even(X):-X mod 2=:=0.

make0(L1,L2,[EL1,EL11],[OL1,OL11],R1,R2):-
       make1(L1,[EL1,EL11],EL2,[OL1,OL11],OL2,[],R1),make1(L2,EL2,_,OL2,_,[],R2).

make1([],EL,EL,OL,OL,R,RL):-reverse(R,RL).
make1([H|T],EL,REL,OL,ROL,R0,R):-
       (H=='o'->(make2(OL,OL1,R0,R1),EL1=EL);(make2(EL,EL1,R0,R1),OL1=OL)),
       make1(T,EL1,REL,OL1,ROL,R1,R).

make2([EO1,EO2],[EO11,EO21],[],RL):-
       select(X,EO1,EO11),append([],EO2,EO21),RL=[X].     % E021=E02 deha musi sareru
make2([EO1,EO2],[EO11,EO21],[],RL):-
       select(X,EO2,EO21),not(member(X,EO1)),append([],EO1,EO11),RL=[X].
make2([EO1,EO2],[EO11,EO21],[H|T],RL):-
       select(X,EO1,EO11),X>=H,append([],EO2,EO21),RL=[X|[H|T]].
make2([EO1,EO2],[EO11,EO21],[H|T],RL):-
       select(X,EO2,EO21),not(member(X,EO1)),X>=H,append([],EO1,EO11),RL=[X|[H|T]].

start:-str(S),split_string(S,"\n,\s","\s",L0),pre(L0).

pre([_,B,C|T]):-atom_chars(B,UL),atom_chars(C,DL),length(UL,N),solve(N,UL,DL),pre(T).

solve(N,UL,DL):-
       findall(X,(between(1,N,X),even(X)),L1),findall(X,(between(1,N,X),not(even(X))),L2),
       EL=[L1,L1],OL=[L2,L2],findall([UR,DR],make0(UL,DL,EL,OL,UR,DR),RL),disp(RL,RL1),
       atom_concat('|',D,RL1),write(D),write("\n").
       
disp([],'').
disp([H|T],L):-
       disp(T,L1),flatten(H,H1),concat_atom(H1,',',H2),atom_concat('|',H2,H3),
       atom_concat(H3,L1,L).

%start.

str("0     xxoxo,oooxo
4      ooxxxx,ooxxoo
8      oxoxxxo,oxoooxo
22      ooxxoooooxox,ooxxoxxxxxox
23      xoxoxxooxoxx,ooxoxoxooxxo
24      oooooooooooo,xxxxxxxxxxxx").
```
すみません、また間違っていました。
pre/1の正しいコードは以下です。

```Prolog
pre([]).
pre([_,B,C|T]):-atom_chars(B,UL),atom_chars(C,DL),length(UL,N),solve(N,UL,DL),pre(T).
```
サーバーに接続できなくなった

さくらインターネットの専用サーバを使用してWEBサイトを運営しております。

数日前からブラウザによるサイトへのアクセスができなくなりました。

また、サーバ再起動直後は、ターミナルやFTPソフトでの接続ができるのですが、
数時間たつとそれもできなくなります。

さくらインターネットからはハード的な問題はないとの回答を頂いておりますが、
現在、解決には至っておりません。


上記と同様な事案を経験された方はいらっしゃいますか？
その場合、どのような復旧方法をとられましたか
教えて頂けますと幸いです。


どうぞよろしくお願い致します。
Android 上でボタンの長押しを検知 (Delphi)

モバイルアプリで、ボタンを普通に押したときと、長押ししたときとで、処理を分けたいことってありますよね。
長押しを検知するのには Gesture を使います。(iOSの場合 [ControlType プロパティの動作](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/FireMonkey_%E3%81%AE%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96_iOS_%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB#.E3.83.8D.E3.82.A4.E3.83.86.E3.82.A3.E3.83.96_iOS_.E3.82.B3.E3.83.B3.E3.83.88.E3.83.AD.E3.83.BC.E3.83.AB.E3.81.A8.E9.9D.9E.E3.83.8D.E3.82.A4.E3.83.86.E3.82.A3.E3.83.96_.E3.82.B3.E3.83.B3.E3.83.88.E3.83.AD.E3.83.BC.E3.83.AB.E3.81.AE.E7.B5.84.E3.81.BF.E5.90.88.E3.82.8F.E3.81.9B)もあるので、ここでは Android 限定という書き方をしています)
ただし、ボタンのクリックイベント (OnClick) も発生するので長押しと区別させたい場合は、フラグを用意するなどの処理が必要です。

##サンプルアプリ
ボタンに対する長押しと、通常のクリックと処理を分けています。
フォーム上に TToolBar を置き、TToolBar の上に TButton を置いています。
残りのエリアには ListBox を Align = Client で配置して、長押しの時には LongTap, 普通のクリックの時には Click と ListBox 内に書くだけの簡単なものです。
オブジェクトインスペクタで Button1.Touch.InteractiveGestures の LongTap を True に設定し、Button1 の OnClick, OnGesture, Form1 の OnCreate イベントハンドラを作成しておきます。
![qiita101.png](https://qiita-image-store.s3.amazonaws.com/0/164551/aa95a125-6d59-cfd4-5d68-5a0710bea32d.png)


##サンプルコード

```delphi
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.ListBox, FMX.StdCtrls, FMX.Controls.Presentation;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Gesture(Sender: TObject;
      const EventInfo: TGestureEventInfo; var Handled: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
    mLongTapFlag: Boolean; // add: 長押し管理フラグ
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if mLongTapFlag then begin
  // 長押しの時はフラグをリセット
  // このサンプルコードではOnClickイベントを抜ける
    mLongTapFlag := False;
    Exit;
  end;

  // 通常のクリックの時には ListBoxにClickと書く
  ListBox1.Items.Add('OnClick');
end;

procedure TForm1.Button1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
  // 念のためにフラグを初期化
  mLongTapFlag := False;

  // ジェスチャーの種類が長押し(LongTap)かを判断
  if EventInfo.GestureID = igiLongTap then begin
  // 長押しであればフラグをセットして
  // ListBoxに LongTapと書く
    mLongTapFlag := True;
    ListBox1.Items.Add('LongTap');
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  mLongTapFlag := False; // フラグ初期化
end;

end.

```
いまさらながらの地味に便利なQRコード生成ブックマークレット

2017/12/21 追記

まだダメ拡張機能使ってるの？1000個から厳選したChrome拡張機能おすすめ7選を紹介
という記事でQRコードを生成するChrome拡張が紹介されていました。
[すぐにスマホの実機で確認できるようにQRコードを作成「The QR Code Generator」](https://qiita.com/ayumik/items/b9d3c8c857504042c235#%E3%81%99%E3%81%90%E3%81%AB%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%AE%E5%AE%9F%E6%A9%9F%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%ABqr%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90the-qr-code-generator)

iOS 11 から標準カメラアプリでもQRコードの読み取り機能が実装され、いままではサードパーティ製のアプリでしか読み取れなかったQRコードがより簡単に読み取れるようになりました。

そこで Google Chart API を使用した現在のアドレスのQRコードを別ウィンドウで生成するブックマークレットの紹介です。

ローカル環境のちょっとしたビューチェックなどの場合に重宝しています。

いまさらながらのブックマークレットですが地味に便利です 笑 

```javascript
javascript:window.open('http://chart.googleapis.com/chart?cht=qr&chs=150x150&choe=UTF-8&chld=H&chl='+location.href,'_new');javascript:window.open('http://chart.googleapis.com/chart?cht=qr&chs=500x500&choe=UTF-8&chld=H&chl='+location.href,'_new');
```
seleniumで要素を待つ時にsleepを使うのはオススメしない

#no such element: Unable to locate elementとかElement is not clickable at pointとかを回避するためのwait

ruby + selenium webdriverを使っていれば誰もが見たことあるこれらのエラー。
動作が速すぎて要素が現れる前に処理が実行されてしまいこのエラーが出ちゃうことが多いですよね。

秒数を指定して動作を待つsleep

```ruby
sleep 10
```
このように書けば10秒待ってから次の処理を行うというコマンドです。

でも本当に10秒待てば次の要素は必ず現れるのでしょうか？
ネットワークや実行する環境によっては1秒で現れてくれるかもしれないし、12秒待っても現れてくれないかもしれません。
前者の場合は1秒で現れてくれるのだから9秒無駄になってしまい、sleepを書く度にその無駄な時間が積み重なっていきます。
後者の場合はもちろんエラーで動作が止まってしまいますね。



##要素が現れるまでwaitし、現れたら実行する

sleepが危なっかしくて、しかも時間を無駄にしてしまうかもしれないということをわかっていただいた上でオススメするのがこれから紹介するコードです。
要素が現れたら次の処理に移ってくれるので、無駄な時間も省けるし、sleepのように設定した時間を超えた場合でも待っていてくれます。

##waitクラスを使ってみる

要素を待つ最長の時間を設定できるのがwaitクラスです。
インストールやrequireなどは特に必要ありません。
よく使うのは以下のような感じ。

```ruby
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome

# :timeoutオプションは秒数を指定している。この場合は100秒
wait = Selenium::WebDriver::Wait.new(:timeout => 100) 

# untilメソッドは文字通り「～するまで」を意味する
wait.until {driver.find_element(:id, 'submit').displayed?}

# この後に処理を書けばその要素が現れてからその処理を行ってくれる
driver.find_element(:id, 'submit').click
```

timeoutの時間を設定してくれているので、この場合は100秒を超えた場合はタイムアウトのエラーが返ります。
1秒後に要素が現れてくれた場合はtrueとなり、次のコードを実行します。

waitクラスはこちらに公式ドキュメントがあるので参考にしてみてください。

[Class: Selenium::WebDriver::Wait — Documentation for selenium-webdriver (3.4.3)](http://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Wait)



##waitではうまくいかない時はsizeを使ってみる

waitはとても便利なのですが、理由はわからないけどこれではtrueとなった後に要素が見つからないというエラーとなってしまう場合があります（理由がわかる方コメントお願いします）。

そんな時は、driverに要素が存在するかを調べてもらっています。

```ruby
loop do
  if driver.find_elements(:id, 'submit').size > 0
    break
  else
    sleep 0.5
  end
end

driver.find_element(:id, 'submit').click
```
find_elementsになっていることに注意してください。

このように書くと要素が1個以上存在した場合はloopを抜けてくれ、
まだ見つからない場合は0.5秒待ってからまた要素を探してくれます。
これ、意外と使えます。

ただ、これだと要素が見つからない場合は永遠にloopし続けるので、
制限を設けたい場合は、ループ処理をforとかに変えてやってみれば良いと思います。



#とにかくsleepだけはコードに入れないようにしている

sleepで待つ時間は予想でしかありません。
無駄な時間を使うし、実行環境の関係で待つ時間が足りなくなりかもしれません。

要素を待つ場合はsleepを使うのはとにかくオススメしません。
確実に何秒待てば良いという場合以外はsleepを使うのはやめましょう。

#自分のブログの紹介
ruby + selenium webdriverについてを中心にブログをやっていますので、そちらもよろしくお願い致します。
[katsulog](http://katsulog.tech)
Symfonyのお勉強1~インストールからアプリ作成~

Symfonyフレームワークを一回も触ったことのなくPHPの多少の知識だけで行った。

## 開発環境
- windows8.1
- XAMPP

## 前提条件

前提としてPHP5.2.4以上のものが必要となるので、コマンドラインから確認が必要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/51ec613f-0e73-10a0-5315-7edbcfa00f45.png)

簡易的なアプリケーションを作成するため今回はXAMPPを使用する
[XAMPPホームページ](https://www.apachefriends.org/jp/index.html)

## Symfonyのインストール

Linux, Mac OS X
```
$ mkdir -p /home/sfproject
$ cd /home/sfproject
```

windows
```
c:\> mkdir c:\dev\sfproject
c:\> cd c:\dev\sfproject
```
windowsではコマンドプロンプトでもできるが、今回XAMPPを使用しているため
XAMPPコントローラーパネルからShellを起動しコマンドを打つ

Symfonyのインストール確認のコマンド
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/6ce44b76-fc61-b94b-b22d-547e791db63b.png)
図の下のように[Symfony Installer]と下と同じように出てきたらしっかりとインストールできたことが確認できる。

これらを使用し、ディレクトリを作成する

## アプリケーションの作成
ディレクトリ作成後インストーラが使用できるようになったため、
Symfonyアプリケーションを作成する
### Linux, Mac OS X
```
$ symfony new my_project_name
```

###　Windows
```
c:\> cd projects/
c:\projects\> php symfony new my_project_name
```

### バージョン指定の場合
```
# 任意のバージョンで最新の物をインストール
$ symfony new my_project_name 2.8
$ symfony new my_project_name 3.0

# 特定のバージョンをインストール
$ symfony new my_project_name 2.7.3
$ symfony new my_project_name 2.8.1

# BETAやRCバージョンをインストール (Symfonyのニューバージョンをテストする為に使います)
$ symfony new my_project 3.0.0-BETA1
$ symfony new my_project 2.7.0-RC1
```

##アプリケーションの実行
### 実行コマンド
```
$ cd my_project_name/
$ php bin/console server:run
```
ただし、consoleがbinのファイル下に存在しない場合があるので、
見つからないとエラーが出た場合は
```
$ php app/console server:run
```
「bin」を「app」に変えることによって解決する
もしそれでもできない場合は自分で「console」を探すことをお勧めする

実行後はブラウザに「http://localhost:8000/ 」と打つことによって、
Welcome pageが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/1fa3e4d8-370a-5672-485e-80380b3fec09.png)

私が実際に行った手順はこのようにやったのだが、これ以外のことが別のサイトにあるので
もし他のことを確認したい場合はこちらを参照
[SymDoc Symfony のインストールと設定](http://symdoc.kwalk.jp/doc/book/installation)
[Joyful Development with Symfony 3 Video](https://knpuniversity.com/screencast/symfony)
Chromeのブックマークをバックアップするbatファイル

#はじめに
「間違えてブックマーク(お気に入り)を消してしまった!!」って人も多いと思います。
それで復元出来たり、消してしまったサイトのリンクを覚えていればいいのですが、覚えてなかったり、復元できなかったりして、へこんだ事がある人もいるのではないでしょうか?
私もその一人です。

さて、そんなことで「ブックマークのバックアップ」を取ればいいじゃんと思ったので、ggって見たところ、batファイルの奴が出てきたので、自分が使いやすいように改造しました。

## 前提
題名どおり、Chromeのブックマークのバックアップをします。
ですので、Chromeが必要になります。

ですが、コードの一部を書き換えれば、firefox等でも出来そうです。

## お勧めの環境
GoogleDriveとかOenDriveとかDropboxとかのクラウドの同期フォルダがあると結構便利かもしれません。

#コードと使い方
```bat:start.dat
@ECHO OFF
mkdir %date:~-10,4%%date:~-5,2%%date:~-2,2%
cd %~dp0%date:~-10,4%%date:~-5,2%%date:~-2,2%
copy "C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\Bookmarks.bak"
copy "C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\Bookmarks"
PAUSE
```
コードになります。
これをテキストにコピーしてテキスト(メモ帳でも可)に貼り付け~~<ユーザー名>の部分を自分のPCのユーザー名に書き換え~~ます。
書き換えたら保存します。保存するときに「名前.bat」になるようにします。
このとき、名前は何でもいいです。「start.bat」でも「バックアップ実行.bat」でも何でもOKです。
※2020/03/12更新)環境変数を使うように変更しました。コピペして.batで保存するだけで使えるはずです。

このbatを実行すると「日付(201701106 見たいな感じ)」のフォルダが生成されてその中に「BookmarksとBookmarks.bak」が出来ると思います。


これを一日一回とか、ブックマークを追加したときに実行するという感じで実行するといいと思います。

実行毎にフォルダが生成されるので、散らかって仕方ない場合は「backup」的なフォルダを作って実行するとそこに生成されます。

また、「お勧め環境」でも書きましたが、クラウドで共有する感じにすると、万が一ファイルを消してしまった場合でも、復元が出来ると思うので結構便利だと思います。

#終わりに
これで、万が一消えても復元できると思います。
また、Chromeの場合設定に「ブックマークと設定のインポート」って言うのがあるので、別のブラウザやhtmlファイルでバックアップが取れるようです。

#リンク
- [誤って削除したGoogle Chromeのブックマークを復元する方法](http://oxynotes.com/?p=3333#comment-144134)のコメント
- [Github](https://github.com/yamagami2211/Chrome-bookmark-backup-bat/)

ファイルの作成(コピー->テキストに貼り付けあたり)がよく分からない方は、ここからダウンロードするといいかも。

#2020/03/12更新
いつかのバージョンアップにより、Bookmarksしか存在しないみたいです。
コード内のBookmarks.bakのコピーの記述は消していませんが、必要でなければ消してください。
あと、環境変数(%USERNAME%)を使うようにしたので、ユーザー名の書き換え不要になりました。
raspberry pi 3 でstretch その4

#概要
raspberry pi 3 でstretchやってみた。
USBカメラやってみた。

#写真
![MVC-001F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/21866a3f-ac85-79c0-92e1-d07a0ec85f8b.jpeg)


#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch
usb camera ELECOM UCAM-DLKT130TRD

#接続確認
lsusb

```
Bus 001 Device 007: ID 03ee:6402 Mitsumi 
Bus 001 Device 006: ID 0409:0019 NEC Corp. 109 Japanese Keyboard with Bus-Powered Hub
Bus 001 Device 005: ID 0409:55aa NEC Corp. Hub
Bus 001 Device 004: ID 056e:700f Elecom Co., Ltd 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

```

#カード、デバイスの確認
ls /etc/video*

/etc/video0

#opencvインストール

sudo aptitude install python-opencv


#サンプルコード


```
import cv2

c = cv2.VideoCapture(0)
r, img = c.read()
cv2.imwrite('test.jpg', img)
c.release()

```

以上。
pythonで6面ダイス2個を5000兆回転がすプログラム書いたら天文単位過ぎて終わりが見えない

#pythonに触れてみた
paizaでpythonの書き味をちょっとだけ覚えて、サイコロを振れるようになったので
旬が過ぎた5000兆円ネタを持ち出して、5000兆回サイコロを振ったら当然ながらプログラムが
全く終わらない。

##2017年11月06日(9時00分)現在の様子
![2017_11_06_5000tri.PNG](https://qiita-image-store.s3.amazonaws.com/0/94048/8451e3d7-ff0c-5721-cd4e-c74018210822.png)

###ソースコードはこちら
http://senobro.hatenablog.com/entry/2017/11/05/155002

###賜ったアドバイス
https://twitter.com/nasa9084/status/927077477947551749

#pythonはストレスフリー
C言語しか業務で書いたことなかったので、pythonみたいなストレスフリーの言語は
本当に書いてて楽しいと思った。
始めてJavaScriptを書いてpaizaでCランクをゲットしたときの感覚を思い出した。

##作りたいものを作れるようになるって楽しいよね
病院の帰り道に「5000兆回サイコロ振ったらピンゾロと6ゾロが出る確率が本当に2.78%なのかが割り出せるんじゃね？」と思ったのがこのプログラムを書いたきっかけです。
pow関数やrange関数、xrange関数の存在も作ってアドバイス受けて初めて知りました。

###2d6(6面サイコロ2個)の確率分布についてはこちら
https://www34.atwiki.jp/hddt/pages/16.html

#まとめ
基本を勉強したあとは、10分以内に思いついた処理を少しずつ入れてみよう。
「わーい！たーのしー！」ってなるから。

##反省点
しっかしいつ終わるんだこれ。2日半くらいで処理終わると思ってたけど、
見通し全然甘かったわ。2週間くらい回し続けそうだぞこの天文単位サイコロール…
【ionic】firebaseが原因でビルドエラーになる

ionicにgit pushした後、ビルド完了を待ってたらエラーが出てしまいました。
どうやらfirebaseが原因っぽい。

![スクリーンショット 2017-11-06 0.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/186221/1c42a8e8-fca6-4a5a-17ce-56caf6948f5d.png)


![スクリーンショット 2017-11-06 0.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/186221/7cfa3ed0-400b-4397-2587-8a717f864370.png)

##【解決策】firebaseのバージョンを4.3.0に下げる
マジかよ。。。と思ってしまいましたが、どうやらこうするしかなさそうです。
4.6系から4.3.0にダウングレードしたら解決しました。
(↓では4.2.0にダウングレードしたら直ったとのことですが、4.3.0でも直ります）
https://github.com/angular/angularfire2/issues/1199

![スクリーンショット 2017-11-06 0.26.00.png](https://qiita-image-store.s3.amazonaws.com/0/186221/28c9f494-19fe-23db-d181-8d0b35d952f8.png)
【ionic】ionic DevAppを使ってみた

AppStoreでionic viewを検索していたら、DevAppというアプリが出てきたので使ってみました。
公式ブログで紹介されているのが2017/10/31ですから、つい最近リリースされたのでしょうか。
http://blog.ionic.io/announcing-ionic-devapp/

##使い方はめっちゃ簡単
ionicをインストールしている環境であれば、
①iphoneとionic開発端末を同じWifiに接続します。筆者はテザリングを使いました。
②ionic serveでアプリを起動させます。
たったこれだけです。

アプリと接続する前はこんな画面
<img width="375" alt="ionicserve.png" src="https://qiita-image-store.s3.amazonaws.com/0/186221/68d460e5-2264-ca79-1c61-3fc79e86406f.png">

iphoneがアプリを認識すると下のような画面になります。
認識したアプリを選択するとアプリが開きます。
<img width="375" alt="connect.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/186221/1339ba86-f85a-b464-9f87-b5727b4a6f31.jpeg">

<img width="375" alt="success.png" src="https://qiita-image-store.s3.amazonaws.com/0/186221/cc6d8a58-3e20-b8c9-fd5d-504fda551fd5.png">

実機でテストしようと思ったら、↓みたいになかなか大変なのですが、DevAppならかなりラクにできそうです。
ionicでアプリ作っててよかった。。。

[【Xcode】誰でもわかるiPhone実機テストの設定手順まとめ【エラーも紹介】](http://tech.pjin.jp/blog/2016/03/25/%E3%80%90xcode%E3%80%91%E8%AA%B0%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8Biphone%E5%AE%9F%E6%A9%9F%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86%E3%81%BE%E3%81%A8%E3%82%81/)
自動起動しないサービス

C#で作成したでサービスが起動していない。
手動で起動しみると正常に起動する。設定も自動起動となっている。

調べてみると依存するサービスがあると動作しないことがわかった。
サービス内でPostgreSQLのテーブルへの登録をおこなうことから、
PostgreSQLより先に動作してサービスが起動していない模様。
起動しないのはどうかと思うが一旦無視して、解決策がないか探ってみた。
サービス登録時のオプションで*depend*にPostgreSQLのサービスを指定すれば良さそうな雰囲気。
早速サービスの登録しなおし。

`sc create サービス名 binpath=PGのパス depend=Postgresサービス名 start=auto`

無事解決。
Dialogflowで音声ファイル読み出し メモ

# はじめに

最近、中国語の勉強をはじめまして、それの役に立つアプリをGoogle Home用に作りたいなー、ということで試してみました。

こちらが何か言ったら、それに対してmp3などの音声ファイルで返してくれるだけのものを作ります。

# つかいかた

SSML (Speech Synthesis Markup Language）を使います。公式の説明は[こちら](https://developers.google.com/actions/reference/ssml)です。SSMLにaudioタグが用意されているので、それを使ってintentのresponseを以下のように返すだけです。

![6E62AD90-D857-4D3D-B760-086BA3A45EEA.jpeg](https://qiita-image-store.s3.amazonaws.com/0/58503/de056a58-9a92-fe7e-debd-c4e19e996ab3.jpeg)

公式の説明にある通り、mp3, oggファイルが使えます（モノラル推奨）が、ソースのURLは**httpsの必要**があるので注意してください。自分はGoogleのCloud Storageを使ってます。

# 困っているところ。

SSML内で言語を変更したいのですが、今のところ上手くいきません。
NSNotificationCenterのremoveObserverをした時にCannot remove an observer for the key path ... because it is not registered as an observerのエラーがでる

removeObserverした時に以下のログが出力されるようになった。
前までは出なかったような…？

> Cannot remove an observer <xxxx xxxx> for the key path "xxxxNotification" from <NSNotificationCenter xxxx> because it is not registered as an observer

Appleの公式ドキュメントに以下の記述あり。

> In OS X 10.11 and iOS 9.0 NSNotificationCenter and NSDistributedNotificationCenter will no longer send notifications to registered observers that may be deallocated.

今まではきちんとaddObserverした場合はremoveObserverしないといけなかったけれど、iOS9.0以降は報告先のオブジェクトが解放されていたらNotificationはしないらしい。

つまりremoveObserverしなくていいということらしいです。
ざっくばらんメモ_13：kaggle, 教師コスト


###kaggle seguro
[code](https://github.com/festa78/kaggle_seguro)
objectiveを’reg:linear’に元に戻す．
少なくともパラメータ選択で性能向上する事を確認したい．
パラメータ選択の範囲が狭く局所解へ陥っているのかもしれない．
代わりにもう少し広い範囲でパラメータ検索を行ってみる．

また並行して別のモデルを追加していく．
まずはlightgdmを追加してxgboostとのensembleを適用．
結果：0.265でxgboost単体の0.269と比較して微減

###教師あり学習のコストを低減したい
最近は主にdeep learning系の研究テーマの動機づけとして，
教師あり学習におけるデータ作成コストの低減が良くあげられるようになってきた．
例えば，deep learningのモデルは学習のため大量のラベル付きデータが必要，
複雑化していくタスクのためにデータ単位辺りのラベルコストも上昇している，
等である．
そのための方法として強化学習ではcuriosity driven search，教師ありでは
Self-supervision，transfer learning，あるいはsimulationの利用などがある．
そうした結果はしかし従来のラベル付きデータによる教師あり学習を代替出来るには
まだまだ遠く，現状は組み合わせて使う事で性能向上をサポートする事を可能に出来ると
いったレベルである．
一方，人為的のろベル付きコストも削減され始めている．
これは単純にラベル付け会社が増えて競争が発生している事と，ノウハウが溜まって
効率化出来てきている事に起因している．
実用面では人為的なラベリングが圧倒的に単純なので，
今後，上記の教師あり学習コストの低減手法が実用化するまでの道のりは遠い．
しかしエッジケース，そもそも現実世界で集めにくいデータ，に完全にフォーカス
すれば実用性は向上しそうである．
この場合人為的にデータを集めてラベル付けする事のコストが非常に高くなるからである．
例えば，自動車の安全機能のテストのため，事故データを大量に集める事は出来ないし，
集まったとしても詳細なデータは得辛い．
また曖昧なタスクは人手で定義するためのは難しいが，self-supervision, curiosity, 逆強化学習などを通して
データから自然なタスク定義を導き出す事が出来れば非常に有用である．
Mysql 初心者 命令文

#Mysqlの命令文一覧

userの確認

```
mysql> select user, host from mysql.user;
```
※mysqlのDBにログインしている人は、mysql.user→userで

userの権限(grants)の表示(show)

```
mysql> show grants for 'vagrant'@'localhost'
```
※vagrantと書いてあるところが一般ユーザ名です。書き換えて使ってください。

##userの権限の追加
その前になんの権限が実際必要なのかよくわからないし
そのような記事もなかなか見つからない。
そこで基本的な機能を次のリストに挙げた。

| 権限 | 意味 |
|:-------:|:-----:|
|CREATE|表を作成する|
| ALTER | 表を更新する |
|DROP|表を削除する|
|INSERT|データを追加する|
|UPDATE|データを更新する|
|DELETE|データを削除する|

そして、次にdumpファイルを作成するときに
必要な権限を表にした。

| 権限 | 意味 |
|:-------:|:-----:|
|FILE|SELECT ... INTO OUTFILE と LOAD DATA INFILE の使用を可能にする|
|SELECT|SELECT の使用を可能にする|
|SHOW VIEW|SHOW CREATE VIEWの使用を可能にする|
|LOCK TABLES|SELECT 権限を持つテーブル上の LOCK TABLES の使用を可能にする|

実際の命令文
```
mysql> grant create,alter,drop,insert,update,delete on *.* to 'vagrant'@'localhost';
mysql> grant file,select,show view, lock tables on *.* to 'vagrant'@'localhost';
```

userの権限の削除(revoke)
example)createの権限の削除

```
mysql> revoke create on *.* from 'user'@'localhost';
```
KotlinがAppからWebまで天下を取るかもしれない

# はじめに
ここまでの流れを見ていると、将来的にアプリからWebまで、KotlinとSwift（あとJS）で全て完結みたいな将来が起こり得るかもしれないなと勝手に推察している。
一体どういうことか以下に書いていく。

# ここまでの流れ
## 1. Single Page Applicationの台頭
最近のトレンドとして、バックエンドでは全て共通のAPIを使用して、
Web, iOS App, Android Appをそれぞれを全てフロント側で表現するアーキテクチャが模索されてきている。

## 2. Kotlinが、Android公式言語に
2017年5月KotlinがAndroidの公式言語になる。
https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/

そして、以下の理由からも今後Kotlinを使う機運が上がると推察される。
・クラッシュの最大要因であるNullpoのクラッシュ抑えれる。
・既存のJavaコードも併用して使える。

## 3. KotlinとSwiftの言語仕様はかなり同じ
KotlinとSwiftでは、言語仕様がかなり似てるのでコードのロジックや書き方をかなり使いまわせる（当然それぞれアーキテクチャは違うのでそこは要検討）

そのため、iOSではSwiftが主流になった今、Android/iOS両方のエンジニアとして取り組むシチュエーションを考えるとKotlinを導入するメリットは大いにある。

## 4. Spring FrameworkもKotlinに対応
2017年1月より、Spring FrameworkもKotlinに対応している。
https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0

そして、2.と同様、以下の理由からも今後Kotlinを使う機運が上がると推察される。
・クラッシュの最大要因であるNullpoのクラッシュ抑えれる。
・処理が早い（他のWeb開発用言語と比較して）

また、2.および3.より、アプリのエンジニアがバックエンドに移行する際に、
言語仕様の新規キャッチアップが少なくバックエンドにノウハウを導入できるので非常にメリットが大きい。

## 5. JavaのEOL問題
Javaが以後リリースのバージョンをリリースから半年しかサポートしない判断を下しており、Javaの使用が今後より敬遠されることが推察される。
http://d.hatena.ne.jp/nowokay/20171007


# ここからの推察
そもそも、AndroidのKotlin採用の意図がどこかを考えた時、Java依存を排除するためのものであると考える。
OracleからJava関係でAndroidが訴訟を起こされていることもその根拠にはなる。
https://japan.zdnet.com/article/35089816/

そのことや5.のEOSLの問題もあり、よりGoogleはKotlinを推すようになるのでは？と推察される。
また、そうなった際にKotlinのためのVMも究極Googleが独自のものを出し、Javaでの制限が仮に生じてもKotlinを全面的にバックアップするのでは？という見立ても思い浮かぶ。

つまり、上記の流れからKotlinがAndroidのスタンダードとなり、**AndroidとiOSで今後類似した言語仕様での開発がスタンダードになるのでは？**という推察である。

そして、そうなったときに**組織内のエンジニア移行・学習観点からアプリとバックエンドで同一言語で統一する**流れも増えるのでは？と思われる。
アプリ開発が主体で開発が進む時代になりつつあること、そして4.で書いてあるようにWebでもKotlinを導入するメリットがおおいにあることもその根拠になる。

これが *AppからWebまでKotlinが天下を取る流れ* である。

当然バックエンドに関してはGoも流行り出しているし、上記も完全なる推論だが、[Kotlin Conf](https://www.kotlinconf.com/)も開催され盛り上がりを見せているKotlin。
以上のような世界線もおおいに考えられるのでは？と思っている。

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
CircleCI の非公式 Android アプリを作りました

この度OSSのCircleCI非公式Androidクライアントを作りましたので、宣伝とちょっとした説明です。

### リンク
Download: [Play store page](https://play.google.com/store/apps/details?id=com.unhappychoice.norimaki&hl=ja)
Repository: [unhappychoice/Norimaki](https://github.com/unhappychoice/Norimaki)

### スクリーンショット
<img src="https://qiita-image-store.s3.amazonaws.com/0/32851/64914bbe-c88d-af87-f230-db599d0313ea.png" width="40%"/> <img src="https://qiita-image-store.s3.amazonaws.com/0/32851/7dce222f-adc0-1bcb-e6b3-6a2179632fd5.png" width="40%" />

### 技術スタック

- Kotlin
- [RxKotlin](https://github.com/ReactiveX/RxKotlin) / [RxJava](https://github.com/ReactiveX/RxJava)
- [Mortar](https://github.com/square/mortar) / [Flow](https://github.com/square/flow)
- Dagger

Rx好きなため、基本的にインターフェースは `Observable` で統一しています。
その他、iOS開発に慣れていてAndroidの若干面倒なライフサイクルに煩わされたくなかったため、MortarとFlowを使用しています。
そのため、👆ライブラリのよい実サンプルになっているとも思いますので、興味がある方はレポジトリをご覧ください。

Daggerに関してはKotlinと相性抜群とはいえず、[Kodein](https://github.com/SalomonBrys/Kodein) にすればよかったと反省しており、リプレイス ~~するつもりでいます~~ しました。

### その他技術的なところ

- API叩く部分に関しては別ライブラリに切り出しています -> [unhappychoice/CircleCI](https://github.com/unhappychoice/CircleCI)

#### Pusher
CircleCIではリアルタイムなSocket通信にPusherを利用しているようで、一応公開APIではないのですが、ブラウザでリバースエンジニアリングを行い利用しています。

### 開発予定
- レポジトリ / ブランチ ごとのビルド一覧
- Workflow対応
- ビルド関連通知
ターミナルを紹介するときのGIFアニメーションの作り方

# これが作りたかった
![2017-11-05 23_52_49.gif](https://qiita-image-store.s3.amazonaws.com/0/73446/3ca611b8-99a3-e319-189f-423145216561.gif)

色々探してCLIから作成するものとかあったけど、後からGIFを編集できなかったりでちょっと不便だったので、自分が今回作った方法を書き残しておきます。
(この記事はMac向けの記事かもしれません)

## GIFを作成するアプリケーション
個人的にはこれがすごい使いやすいです。
<img width="317" alt="スクリーンショット 2017-11-06 1.18.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/6bf81887-5ad2-f6ed-b86e-7b47e5eb0604.png">

~~[GIF Brewery 3](http://gifbrewery.com/)~~
2018-12-16追記： サイトなくなっちゃってますね😅
引き続き、[AppStoreからダウンロードできます👍](https://itunes.apple.com/jp/app/gif-brewery-3-by-gfycat/id1081413713?mt=12)
(追記ここまで)


GIF作る範囲を自由に決められて、どんどん撮り直せますし、撮った後のGIFの編集までできるのでかなり便利です。

撮影時。
<img width="607" alt="スクリーンショット 2017-11-06 1.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/f9b8a3d6-1ba3-f49e-1be4-80440c39904a.png">


編集画面。
撮ってすぐにトリミングもできますし、使いたくない始まりと終わりの部分のカットもできます。
<img width="630" alt="スクリーンショット 2017-11-06 1.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/0afb5c49-10c6-d809-ac89-558f9ce9923b.png">


## タイプしたキーを表示する
<img width="40" alt="スクリーンショット 2017-11-06 1.20.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/442efaa7-451a-fe67-6015-04a50c5b814a.png">
[Keycastr](https://github.com/keycastr/keycastr)

これもダウンロードして、先程の撮影範囲に上手く合わせて撮影すると記事冒頭のGIFアニメーションが完成するというわけですね。

![2017-11-06 01_30_39.gif](https://qiita-image-store.s3.amazonaws.com/0/73446/891d2d8f-8f24-9ec5-5c1d-e87e25e8c7d9.gif)


## セッティングしたりGUIとかめんどくさい人は
[asciinema](https://asciinema.org/)
最近GithubのREADMEとかでよく見るやつ。
タイプしたキーは表示してくれないっぽいですが、インストールもGIF作成もめちゃくちゃ楽です。


terminalからコマンドで起動して撮影して、撮影が終わると、asciinema.orgに投稿までしてくれます。
例：https://asciinema.org/a/117813 (適当にピックアップしたすごいやつ)

### 撮り方

```
# install (Macの人)
brew install asciinema

# start recording
asciinema rec

# stop recording
exit # (or Ctrl-d)

```

取れたら、asciinemaコマンドがアップロードする前に本当にアップしてよいか聞いてくれます。

```
Asciicast recording finished.
Press <Enter> to upload, <Ctrl-C> to cancel.
```

これだけで完了です。
最後にasciinemaのURLを出力してくれますので、ブラウザで確認しましょう。
ただし、これ撮った時のローカルマシンのユーザー名がそのままGIFの投稿者名に使われてしまうので注意です。
BackboneJSで、URL/LocalStorageを使いたくない人に

Backboneで、簡単な画像編集画面を作ってみようと思って始めた

![Screen Shot 2017-11-06 00 54 59 AM.png](https://qiita-image-store.s3.amazonaws.com/0/165810/4ca5b679-83f6-9527-7673-d14b96092a71.png)


まだ、未完成だがこれからのつなぎ込みを考えてるうちにlocalStorageには保存したくないなと思っていろいろ探して見たが、ダメだった

```js

var a = new Backbone.Collection.extend({
    url: '',
    localStorage: new Store(),
})

app.as = new a();
```

のふたパターンがあるが、どっちもサーバーか、ローカルとも連動が必然だった

> どうしよう、RailsでSPAのアプリ構築を想定してるが、そんなリアルタイムでsyncして欲しくもない

## グローバル変数と連結してやるのでは

`localStorage: g_value`

で、collectionを定義したら、エラーは出なかった。
いけるんじゃないと思って、アプリを起動したらエラー出まくり

主に

* linstenTo model, 'add' の原因
* find
* create
* save

から問題が発生
なるほど、collectionは何もしてくれなくなったな...

`collection -> model -> create instance -> return collection`

この流れが崩れてる、しょがないな...自分で実装してみるか

```js

Backbone.Model.extend({
    create: function(options){
        return new this.model({
            Object.assign(this.defaults, options)
        })
    }
    this.trigger("add")
    
    save: function(options){
        this.attributes = Object.assign(this.attributes, options)
        this.trigger("update")
    }
})
```

まじか、いろいろ細かいな...
全部カバーするのがめんど

でも、`as`から参照できない状態になった

つまり、collectionはモデル配列を更新してない
であれば、collectionを使う意味が...

## 最終的に

Storageを使いたくなく、グローバル、あるいはJSON_APIからのフィードバックで、十分だと思っている人は、collectionを捨てましょう

```js
window.store = function() {
    this.value = []
    this.push: function(){}
    this.pop: function(){}
    this.uuid: function(){}
    this.find: function(){}
}
```

こんな感じで、作れば十分使えるようなstorageが生成される。

> JointJSもCollectionをextendして使うケースがないな
> Collectionはもう少し、リアルタイム性があるものを作った方がいいな
Docker for Macでrails + nginx + pumaで環境構築

# 目的
railsのコードはそこそこかけるようになったので、railsの環境構築を実際にやってみる。

# 前提
rails: 5.0.0.1
nginx: 1.10.1
puma: 3.0

ほとんど自分用のメモなので説明は省きます。

# ディレクトリ構成

```
myapp
  |--DockerFile
  |--docker-compose.yml
  |--container
       |--nginx
```

# 諸ファイルの作成
```Dockerfile:Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```
```yaml:docker-compose.yml
version: '2'
services:
  mysql:
    container_name: mysql
    image: mysql:5.6.32
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge
    hostname: mysql
  rails:
    container_name: rails
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - mysql
  nginx:
    container_name: nginx
    build: containers/nginx
    ports:
      - '80:80'
    depends_on:
      - rails
    volumes:
      - ./containers_data/nginx:/var/log/nginx
```
railsのコマンドを理解できていないのと、[こちら](http://ceblog.mediba.jp/post/148975191192/docker-for-mac%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6ruby-on-rails%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B)を参考にしてnginxのコンテナを書いたのでいまいち理解できていない。mysqlの方も先ほどの参考サイトのように書きたい。（nginxではlogを持ってきてるが、mysqlでは何をしてるのかいまいち分からない）

./containersはさきほどのサイトをそのままコピー

# build

ここまでできたらmyappディレクトリで以下のコマンドを実行

```
docker-compose build
docker-compose up
# 別タブで
docker-compose run rails rails db:create
```

これで[http://127.0.0.1/](http://127.0.0.1/)にアクセスするとrailsのホーム画像が表示されるはず。

# うまくいかないとき
##railsコンテナが起動していないとき

```
docker ps -a
```

で起動しているコンテナを確認して、railsがrails exited with code 1になっていたら、./tmp/pids/server.pidを削除
このファイルが残っていると起動していると見なされるみたい。

## db:createでエラー
`docker-compose run rails rails db:create`でUnknown MySQL server host 'localhost'とエラーが出たら、これもrailsコンテナが立ち上がっていない可能性が高いから上の方法を試す。
zshの入力をfishっぽくする。(CLIのハイライトと予測補完)

# fishとは
fishとは特に込み入った設定をしなくても、かなり使いやすいCLI環境を提供してくれるシェルの一つです。
ですが、非常に残念なことにPOSIXに一部準拠してないので細かいところでコケたりするのが嫌で使うのを辞めてしまいました。
Zshでそれっぽく使えるプラグインを幾つか見つけたので紹介します。

なおfish使ったこと無くても、結構便利な機能なので是非導入してみてください。

※なお、この記事ではzplugでのインストール方法のみ記載しますので、zplugを使っていない方は各自でインストール方法を確認して下さい。

## zsh-syntax-highlighting
[zsh-users/zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)
このプラグインを入れることで、間違ったコマンドでは赤文字に、正しいコマンドでは緑色の文字でハイライトしてくれます。

![2017-11-06 00_07_24.git.gif](https://qiita-image-store.s3.amazonaws.com/0/73446/4385276c-4ee7-83be-592a-e0cfe574750b.gif)

zplugでインストールする場合は以下の様に.zshrcで指定します。

```zsh:.zshrc
zplug "zsh-users/zsh-syntax-highlighting", defer:2
```

## zsh-autosuggestions
[zsh-users/zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
このプラグインを入れることで灰色の文字で予測が表示されます。
カーソルキーの右でその候補を採用することができます。

![2017-11-05 23_52_49.gif](https://qiita-image-store.s3.amazonaws.com/0/73446/73f55cbc-f8e0-19a6-22f7-d10e9f09bac7.gif)

zplugでインストールする場合は以下の様に.zshrcで指定します。

```zsh:.zshrc
zplug "zsh-users/zsh-autosuggestions", defer:2  
```

## 終わりに
結構この２つのプラグインだけでfishっぽさがかなりでましたね。
fishは特に設定しなくてもこれらの機能が使えましたが、zshではzplugを導入することで個人的にはかなり導入の敷居が下がったように感じました。

### おまけ
ちなみに、プロンプトはhttps://github.com/sindresorhus/pure
を参考にして自分で一から設定してみました。

```zsh:.zshrc
local prompt_location="%F{cyan}%B%~%b%f"
local promot_mark="%B%(?,%F{magenta},%F{red})%(!,#,❯)%b"

# vcs_infoロード
autoload -Uz vcs_info
# PROMPT変数内で変数参照する
setopt prompt_subst

# vcsの表示
zstyle ':vcs_info:*' formats '%s][* %F{green}%b%f'
zstyle ':vcs_info:*' actionformats '%s][* %F{green}%b%f(%F{red}%a%f)'

# プロンプト表示直前にvcs_info呼び出し
precmd() {
    vcs_info
}

# vcs_info_msg_0_の書式設定
# zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' check-for-changes false
zstyle ':vcs_info:git:*' stagedstr         "%F{yellow}!%f"
zstyle ':vcs_info:git:*' unstagedstr       "%F{red}+%f"
zstyle ':vcs_info:*'     formats           " (%F{green}%b%f%c%u)"
zstyle ':vcs_info:*'     actionformats     ' (%b|%a)'

# プロンプト
PROMPT="
${prompt_location}"'$vcs_info_msg_0_'"
${promot_mark} "
```
背景色はterminal側でHSB: 色相232°彩度30% 明度19%に設定しています。
`git pull` とかした時に package.json に変更があれば自動で `yarn` や `npm i` も走るようにする

## やりたいこと

依存パッケージが増えたとかで、`package.json`に変更があった時にフロント同士ならともかく、それ以外の場合は何も言わなくても自動で`yarn`とか走らせて更新させたい。

## 使うもの

[husky🐶](https://github.com/typicode/husky)。git-hooks（参考 [Git hooks まとめ](https://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)）をpacakge.jsonのscriptsから使えるようにしてくれます。

## 結果

こんな感じのものを追加。

```json:package.json
{
  "devDependencies": {
    "husky": "^0.14.3"
  },
  "scripts": {
    "postmerge": "(git diff 'HEAD@{1}' --name-only | grep package.json > /dev/null) && yarn || :"
  }
}
```

（とか`yarn`を`npm i`にしたり）

## フロー

hoskyの`postmerge`（git-hookの`post-merge`）を使って、`git pull`が終わったときに処理が走るようにしています。`HEAD@{1}`は`reflog`で見た時の1つ前のアクション時の状態で、これによって`pull`前と後で変更のあるファイル名を調べてます。

つまりは`pull`後に`package.json`に変更があれば`yarn`しています。

![Kapture 2017-11-06 at 0.40.49.gif](https://qiita-image-store.s3.amazonaws.com/0/84144/1de9f166-6164-71e0-b203-4beba8f05a2c.gif)

> 
> 何か`error Could not open cafile: EISDIR: illegal operation on a directory, read`的なエラーが出てますが、今後[治りそう](https://github.com/yarnpkg/yarn/issues/4336#issuecomment-339000902)なのと、特に問題も起きてなさ気なのであまり気にしなくてもいいんじゃないかと思います。
> « 何か起きてたらすいません »
iOSアプリ 「ビルド〜審査提出」 までのトラブルシューティング

#概要
itunesconnectでビルドに表示されない時
表示される為に何をするか。トラブルシューティング付きでメモをまとめました。

#ビルドの提出概要
**・Xcodeにて、ビルドのデバイス選ぶところで「iOS Device」**
**・「Product->Archive」**
**・「Validate」が成功後「Submit」**

他サイト様で画像付きで詳しく書いていたものがあるので
わからない方は下記を参考ください。

参考：itunesconnectでビルドの提出をする方法
http://bick.xyz/archives/303

#XcodeでArchive時エラー
　→ **「Invalid Image Path, No Image found AppIcon 120×120」**エラーがでるときの対処法
　http://bick.xyz/archives/306
　を参考にアイコンを登録

#XcodeでArchiveのバリデート時エラー
　![DNS2P9lVwAEqzpO.jpg](https://qiita-image-store.s3.amazonaws.com/0/205840/4b05e287-5e39-a335-caa7-a794b60ca5fa.jpeg)
　**「faild to locate or generate matching sigining assets」**エラーが出るとき対処法
　→
　参考：xcodeでアップロードファイルの検証の際、エラーが表示される
https://ja.stackoverflow.com/questions/22445/xcode%E3%81%A7%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%81%AE%E9%9A%9B-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B

　1.古いWWDR Certificateを削除して作り直せばよさそうです。
　http://egg-is-world.com/2016/02/17/missing-ios-distribution-signing/

 2.それでもエラーが出る場合
　Xcode>prefolent　アカウント内 歯車マークで Export Accounts でファイル保存した上で、 エラー画面から「Import Developer Profile」

#Xcode上でビルド後
**ビルド成功したのに、itunesConnect 内で表示しない**時
数分タイムラグあるようです。私は15分程度でいけました。
１日待ってもだめなら下記参照。

参考：
https://qiita.com/tototti/items/6df2cb994e5212e42bdc

#おまけ：審査提出時のエラー
いざ審査！と思ったら、ビルド以外の箇所でエラーがでる時の内容です。

-**「バイナリにメッセージのフレームワークが実装されていません。 スクリーンショットは App Store for iMessage に表示されません。」の青地注意**
　→　iMessage Appを使わないのにスクリーンショットを入れた場合に表示。削除すればよい。（）

-**「エラーが１つ以上あります」と出ているのに見えない**
　→　年齢制限の欄のビックリマークが出ている場合はそこをクリック。
アニメ表現・暴力表現・性的表現などの有無を記載する欄が出ますので
そこを登録してください。

#編集後記
2017年11月6日 ↑記載の内容を乗り越えて無事 審査提出までいきました。
ゲーム非公式ファンアプリなので、ちょっと審査が心配ですが
あとは祈るだけです。
《→2017.11.8追記：
無事審査通過しました！審査は約1日でした。
https://itunes.apple.com/jp/app/%E3%83%96%E3%82%AD%E3%83%81%E3%81%AE%E6%AD%A6%E5%99%A8%E3%81%BF%E3%81%8F%E3%81%98-for-splatoon2/id1300679992?mt=8
初アプリ、ちょっと表示ずれは出たものの》

尚、私はシステムはJAVA少々かじったデザイナー寄りWeb屋なので
Mac含めiOSは初心者もいいところだったので、苦戦が多かったです。

iOS申請には他の４〜５倍（当社比）の苦戦したので、
このトラブルシューティングが何かのお役に立てば幸いです。
Nightmareでブラウザを自動操作してE2Eテスト

# NightmareでE2Eテスト
NightmareでE2Eテストを行います。
Mac上での開発を想定しています。

## Nightmareとは？
JavaScriptでブラウザを操作できるツール。
内部にElectronを使っていて、実際にはこれがブラウザを操作する。
比較に上がるツールだと以下があるらしい（厳密な区別はわかりませんが、多分こんな感じ） 

* Nightwatch
* Zombie
* Protractor
* WebdriverIO
* Karma

## やること
Nightmareでブラウザを操作して、avaでテストをする。
※先にnpmやらnode.jsやらを使えるようにしておく

## インストール
Mac上で作業場所を作って移動し、環境を作ります。
package.jsonを作る

```package.json
	{
	  "name": "mightmare-test",
	  "version": "1.0.0",
	  "description": "",
	  "main": "index.js",
	  "scripts": {
	    "test": "ava --verbose test/"
	  },
	  "devDependencies": {
	    "ava": "*",
	    "electron": "*",
	    "nightmare": "*",
	    "vo": "*"
	  }
	}
```
  　
インストール

	$ npm install

## インストールするライブラリの説明
    
**Nightmare**
Nightmare本体。
http://www.nightmarejs.org/

**Electron**
内包するエンジン。以前はPhantomJSだった。
Nightmareをインストールすると自動で入る。
https://electron.atom.io/

**ava**
JSのテストフレームワーク。ES6対応と非同期対応がウリ。
以前はJasminやmochaなどが有名だったけど、最近はこっちが多そう。
https://github.com/avajs/ava

## テストを書く
testディレクトリを作って、その中にテストを作る


```./test/test.js
	import test from 'ava';
	import Nightmare from 'nightmare';
	
	const nightmare = Nightmare({ show: true });
	
	test.serial('テスト', function * (t) {
	  const result = yield nightmare
	    .goto('http://www.google.co.jp/') // アクセス
	    //.wait(500)
	    .type('#lst-ib', "旭川")
	    //.wait(500)
	    .click('#_fZl') // idをクリック
	    //.wait(500)
	    .wait('#rcnt') // 要素が表示されるまで待つ
	    .evaluate(function () {
	      // 表示されたら要素を取得（広めに取る）
	      return document.querySelector('#rcnt').innerHTML;
	    });
	
	  // 取得した要素が想定と合っているかチェック
	  t.true(result.includes('旭川市'));
	});
```


## 実行してみる
実行すると、Electronが立ち上がって、自動で操作が始まります。
コンソール側にはテストの結果が表示されます。

	$ npm test test
PEファイルのバイナリ構造(6) エクスポート関数の列挙

# IMAGE_EXPORT_DIRECTORY

この構造体にはそのモジュールが外部に公開している関数の情報が保存されています。
具体的にはGetProcAddress()で使用する情報ですね。

こちらで重要なのは以下のメンバとなります。

|メンバ||
|:--|:--|
|NumberOfNames|名前を持つ関数の文字列のアドレス情報が入ってる配列の大きさ（ややこしい！）|
|NumberOfFunctions|関数のアドレス情報が入っている配列の大きさ|
|AddressOfNames|名前を持つ関数の文字列のアドレス情報が入ってる配列の先頭アドレス|
|AddressOfFunctions|関数のアドレス情報が入っている配列の先頭アドレス|
|AddressOfNameOrdinals|関数の序数のアドレス情報が入っている配列の先頭アドレス|

少し解りにくいのですが、

AddressOfNamesの配列に入っているアドレスで関数名を、AddressOfNameOrdinalsで序数（DEFファイルの@1の部分）を確認する
配列の大きさはNumberOfNamesで確認。

AddressOfFunctionsで実際の関数のアドレスを取得する。
配列の大きさはNumberOfFunctionsで確認。

となります。

つまり、名前と序数は1対1で対応していますが、関数の定義はそうとは限らないと言う事です。
これは序数が必ず連続しているとは限らない為です。

ということで、序数と名前とのテーブルを作った後、関数の状態を順番に確認してやると、このモジュールが外部に公開している関数の一覧が取得できます。

ちなみに名前はANSIで保存されているので、Unicodeでコーディングしている場合は変換してやる必要があります。

ちょっと雑ですがサンプルのコードはこちら。

``` C++:
int nName = tExport.NumberOfNames;
int nCount = tExport.NumberOfFunctions;

char* name = (char*)&(pFile[tExport.Name - delta]);
DWORD* dwName = (DWORD*)&(pFile[tExport.AddressOfNames - delta]);
DWORD* dwFunc = (DWORD*)&(pFile[tExport.AddressOfFunctions - delta]);
WORD* dwOrdinal = (WORD*)&(pFile[tExport.AddressOfNameOrdinals - delta]);

std::map<DWORD, CString> mapIndexName;
for (int i = 0; i < nName; ++i)
{
	mapIndexName[dwOrdinal[i]] = CA2T((char*)&(pFile[dwName[i] - delta]));
}
for (int i = 0; i < nCount; ++i)
{
	if (dwFunc[i] == 0)
	{
		continue;
	}
	CString szName = (mapIndexName.find(i) == mapIndexName.end()) ? TEXT("(NONAME)") : mapIndexName[i];
	_tprintf(
		TEXT("Export Named Function %s:%d [%x]\n"),
		(LPCTSTR)szName,
		i + 1,	//	序数は1ベース
		dwFunc[i]
	);
}
```

名前と序数は必要最小限の配列として確保されていますが、関数ポインタに関しては序数の最大値分までずらっと確保されていますので、序数はあまり飛ばさないほうがモジュールがコンパクトになるかもしれません。

まあ1000個確保しても知れてはいますが。

次はインポート関数の列挙を行います。
MySQL dockerコンテナにMySQLWorkbenchで接続する方法

## まずコマンドラインでの接続方法おさらい
Dockerのコンテナをcliで操作していれば、調べずともたどり着くやり方かと思います。

### コンテナへSSH接続 〜 mysqlコンテナ内でmysqlコマンド実行

SSH接続

```bash
$ docker exec -it $MYSQL_CONTAINER_NAME bash
``` 
でコンテナ内部に入り、あとは作成したMySQLユーザでmysqlコマンドを打てばよい。

```bash
$ mysql -uroot -p db_name
```

基本的にこれで対応できないことは無いかと思いますが、調査＆デバッグやデータ調整が頻繁になってくるとMySQLWorkbenchでやりたくなってきます。

## MySQLWorkbenchからコンテナDBへの接続方法
### mysqlイメージから単体でコンテナを起動した場合(Docker for macなど)
コンテナへ直接接続する

#### MySQL Connectionsに設定を追加
Connection Method: `Standard` を選択
Hostname : `127.0.0.1`
Port : `3306`（`docker run`時の特に指定してなければ）
Username : `root`
Password : `docker run`時の指定した環境変数

### docker machineを使っている場合
VMを通してSSHトンネル接続させる

#### MySQL ConnectionsにSSH設定を追加
- Connection Method: `Standard TCP/IP over SSH` を選択

- SSH Hostname:

	```
	$ docker-machine ip $DOCKER_MACHINE_NAME
	```
	↑で出力されるIPを入力


- SSH Username: `docker`
- SSH Password: `tcuser`

	上記を入力（docker machineにデフォルトで作られるユーザ）

### MySQL設定を追加
docker composeで構成していれば、docker-compose.ymlで設定した値(`MYSQL_DATABASE`など)

を以下パラメータに設定

- MySQL Hostname 
- MySQL Server Port:
- Username:
- Password:
- Default Schema:

MySQLコンテナ単体であれば、[mysqlイメージから単体でのコンテナ起動の場合]と同様。

## 設定完了後
「Test connection」を押して`succeed`が出れば成功。
PEファイルのバイナリ構造(5) エクスポート関数の定義位置の取得

# エクスポート関数とは

エクスポート関数とは、そのモジュールが外部に公開している（別のモジュールから呼び出すことが可能な）関数の一覧になります。
DEFファイルだと以下の様な感じで定義している奴ですね。

```
EXPORTS
	FUNC1	@1	NONAME
	FUNC2	@100
```

エクスポート関数に関しては、

- 関数名
- 序数

のどちらでもアクセス可能となっています。
また序数は基本必須で、明示的に指定してない場合でも自動で割り振られていますが、関数名に関しては無い（あえて名前では公開していない）場合がありますので少し注意が必要です。

# IMAGE_SECTION_HEADERアドレスの取得

公開関数の定義へアクセスする為には、まずそのアドレスが定義されている「IMAGE_SECTION_HEADER」へのアドレスを取得するところから始めます。
IMAGE_SECTION_HEADERへのアドレスに関しては、IMAGE_NT_HEADERSのOptionalHeaderメンバに定義されていますので、最初はそちらを参照します。

```cpp
IMAGE_DATA_DIRECTORY& tData = tNT.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
DWORD nOffset = tData.VirtualAddress;
```

IMAGE_NT_HEADERSに関しては前述で述べたとおり、解析しているモジュール側のアーキテクチャに合せて32bitと64bitで対応する構造体を使用します。

IMAGE_DIRECTORY_ENTRY_EXPORTに関しては定義されている定数で、通常は0が割り当てられています。

このVirtualAddressが目的とするIMAGE_SECTION_HEADERへのアドレスとなります。

# IMAGE_SECTION_HEADERの検索

IMAGE_SECTION_HEADERの数に関しては、IMAGE_NT_HEADERSのFileHeader.NumberOfSectionsに保存されていて、構造体の中には、

 - アドレス
 - ファイルポインタ
 - セクションサイズ

が格納されています。

|メンバ||
|:--|:--|
|VirtualAddress|先頭アドレス|
|Misc.VirtualSize|メモリ上に読み込まれた時に確保されるデータサイズ。|
|SizeOfRawData|そのセクションがファイル上で確保されているサイズ。|

また、構造体の配列の先頭アドレスは、以下の様にマクロを使用して取得します。

```cpp:
PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(&tNT);
```

実際に目的とするセクションのアドレスに関しては、VirtualAddressからVirtualSizeまでの範囲に取得したアドレスが含まれているかどうか、で検索します。

```cpp:
PIMAGE_SECTION_HEADER sec = NULL;
for ( int i=0; i < tNT.FileHeader.NumberOfSections; i++, section++ )
{
	DWORD size = section->Misc.VirtualSize;
	if ( size == 0 ){size = section->SizeOfRawData;}
	if ( (rva >= section->VirtualAddress) &&  (rva < (section->VirtualAddress + size)))
	{
		sec = section;
		break;
	}
}
if( sec == NULL ){ return false;}
```

セクションにはアドレスとファイルポインタの両方の情報が含まれていますので、これを使用すると相互に変換を行うことができます。

```cpp:
UINT delta = sec->VirtualAddress - sec->PointerToRawData;
```

この値を利用してIMAGE_SECTION_HEADERのアドレスをファイルポインタへと変換すれば、ようやく目的とするエクスポート関数が定義されている場所へと到達できます。

```cpp:
IMAGE_EXPORT_DIRECTORY& tExport = (*(IMAGE_EXPORT_DIRECTORY*)&(pFile[nOffset - delta]));
```

次は実際に外部公開関数の列挙を行います。
(随時更新) スクレイピングハッカソンの為の情報リスト

#はじめに

機械学習の活用において、有益なデータの取得は鍵ですよね！
オープンデータやKaggleも面白いデータが多いですが、価値あるデータほど成形されていない場合も多いので、Web上からAPIやスクレイピングで取ったり、買ってくることになります。
Team AIではこのスクレイピングをテーマにしたハッカソンを開催予定です。
www.team-ai.com
この記事にノウハウを貯めていき、皆で使えるアーカイブにしたいと思っています。

#前提条件

スクレイピング、クローリングする時の注意点
NGなことはしないようにしましょうね！
http://docs.pyq.jp/column/crawler.html

特に結果的に犯罪になったこの事件は必ず理解しましょう
https://media.accel-brain.com/librahack/

WEBサイトをスクレイピングしてAPI化するimport.ioを使ってみた
https://qiita.com/dnd0513/items/5b41481877408c6eb71f

#役に立つ記事(コーディング不要ツール)

##Crawly
これお手軽でいいです。何の設定もなく、URLを入れると無料で一瞬でスクレイピングしてくれます。
設定がカスタマイズできないのが難点
http://crawly.diffbot.com/?ref=producthunt

##Import.io

import.ioのアプリケーション版でスクレイピングをやってみる 
=> とてもオススメですが、無料期間すぎると月$299です
https://qiita.com/t-usausausa/items/67a04445dc447aa5d40f

##その他ツール

Alternative products to Import.io
https://www.producthunt.com/alternatives/import-io

Who are the competitors to import.io?
https://www.quora.com/Who-are-the-competitors-to-import-io

## Google SpreadSheet

SpreadSheetでスクレイピング。Importxml他、便利な関数9+1
https://qiita.com/ktmg/items/d53440c913e20f8bb34c

Google SpreadSheet のGAS(JavaScript)でスクレイピング(Webデータゲット)
https://qiita.com/standard-software/items/16214dc4e64d28952c2d

Google スプレッド シートでWebスクレイピング
https://qiita.com/nsakusaku/items/2c1ae8c6f6855db6bad0

#役に立つ記事(コーディング必要)

PythonとBeautiful Soupでスクレイピング
https://qiita.com/itkr/items/513318a9b5b92bd56185

Python Webスクレイピング 実践入門
https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406

PythonでWebスクレイピングする時の知見をまとめておく
http://vaaaaaanquish.hatenablog.com/entry/2017/06/25/202924

Webサイトをスクレイピングする時のちょっとしたコツ
https://qiita.com/h5y1m141@github/items/118571c94ca42d2daf6a

相席ラウンジ リアルタイムな女性来店数をRubyでスクレイピング
https://qiita.com/ts-3156/items/0d12869e00e7bbc07688

おうちカクテルで学ぶWebスクレイピング Ruby
https://qiita.com/iga_xx/items/1524d587dce329568ceb

#役に立つ本

PythonによるWebスクレイピング
https://www.oreilly.co.jp/books/9784873117614/
Githubで遭遇したエラーメモ

# エラー１
以下のようにエラーが出てしまった場合


```
# git push -u origin master
To git@github.com:kuredev/xxxxxxxxxxx.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:kuredev/xxxxxxxxxxx.git'
ヒント: Updates were rejected because the remote contains work that you do
ヒント: not have locally. This is usually caused by another repository pushing
ヒント: to the same ref. You may want to first integrate the remote changes
ヒント: (e.g., 'git pull ...') before pushing again.
ヒント: See the 'Note about fast-forwards' in 'git push --help' for details.
```

以下で解決。ライセンスファイルを作成してしまった場合
【開発環境】GitHubへのpushが「fetch first」と表示されてrejectedとなったときの対処: 映画と旅行とエンジニア http://www.wakky.tech/article/433518761.html


# エラー2

コミット時に以下のようなエラーが出た場合。出力メッセージにしたがってメールアドレス等を登録すればいい。

```
$ git commit -m "First Commit"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'kure@ubuntu.(none)')
```