OmniAICreator/Qiita-1.07M huggingface dataset:
Increase timeouts in facebook/php-ads-sdk（facebook/php-ads-sdkでHTTP接続のタイムアウトを延長する） FacebookAds\Exception\Exception: Failed to connect to graph.facebook.com port 443: Connection timed out

FacebookAds\Exception\Exception: Failed to connect to graph.facebook.com port 443: Connection timed out

上記エラーは特にFacebookのAPIサーバーが落ちていなくても頻繁に発生する。

facebook/php-ads-sdkのデフォルトのタイムアウト設定は下記の通り。

```
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 60,
```

Api:init()を次のように書き換えることで、タイムアウト設定が延長できる。

## Before

```php
use FacebookAds\Api;

$api = Api::init($appId, $appSecret, $accessToken);

```


## After

```php
use FacebookAds\Api;
use FacebookAds\Http\Client;
use FacebookAds\Session;

$httpClient = new Client();
$options = $httpClient->getAdapter()->getOpts();

/** @var \ArrayObject $options */
$options[CURLOPT_CONNECTTIMEOUT] = 60; // 6倍にしてみた
$options[CURLOPT_TIMEOUT] = 360; // 6倍にしてみた

$api = new Api($httpClient, new Session($appId, $appSecret, $accessToken));
Api::setInstance($api);

```
Laravel5.7: 本番に合わせてバーチャルホストを設定する

# 親記事
[Laravel5.7で基本的なCRUDを作る - Qiita](http://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# バーチャルホストが必要な理由
|環境|URL|
|:--|:--|
|ローカル    |`http://localhost/laravel/5.7/public`|
|Travis CI|`http://localhost:8000`|
|本番     |`https://sutara79-laravel.herokuapp.com`|

上のように、Travis CIではドメイン直下ですが、ローカルでは直下ではなくサブディレクトリの中にあります。
このようなズレがあると、PHPUnitのテストが通りません。
Laravelの環境設定(`.env`)の`APP_URL`では、このズレの辻褄を合わせることはできません。
素直にバーチャルホストを設定して、ローカルもドメイン直下にするのが一番楽です。
ServerNameは本番に合わせて「**local.**sutara79-laravel.herokuapp.com」とします。


# バーチャルホストを設定する
:page_facing_up: `C:\xampp\apache\conf\extra\httpd-vhosts.conf`

```apache
<VirtualHost *:80>
    DocumentRoot "C:\xampp-htdocs\laravel\5.7\public"
    ServerName local.sutara79-laravel.herokuapp.com
    <Directory "C:\xampp-htdocs\laravel\5.7\public">
        AllowOverride All
        Options All
        Require all granted
    </Directory>
</VirtualHost>
```

**管理者として**起動したメモ帳でhostsファイルに設定を追加します。
:page_facing_up: `C:\Windows\System32\drivers\etc\hosts`

```
127.0.0.1 localhost
127.0.0.1 local.sutara79-laravel.herokuapp.com
```

以上で、`http://local.sutara79-laravel.herokuapp.com`でLaravelアプリへアクセスできるようになりました。


# HTTPSで接続したい場合
HTTPSで接続したい場合は、さらに設定が必要です。
別の記事で解説しているので御覧ください。
:link: [XAMPP for WindowsでSSLを有効にする - Qiita](https://qiita.com/sutara79/items/21a068494bc3a08a4803)


# APP_URLを変更する
以上で、バーチャルホストの設定は完了です。
最後に、Laravelの環境設定ファイルの中にある`APP_URL`を変更します。

```diff:.env
-APP_URL=http://localhost
+APP_URL=https://local.sutara79-laravel.herokuapp.com
```

これで、前回の記事のようにビルトインウェブサーバーを起動することなく、正式にページを表示できます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/b39a0226-79c6-4eb6-0951-a74cd13da928.png)


- - -
# (余談)シンボリックリンク
XAMPPのApacheのドキュメントルートの初期設定は`C:\xampp\htdocs`ですが、私はDropbox内のフォルダを指定しています。
ただ、Dropboxのパスは`C:\Users\%USERNAME%\Dropbox`のようにユーザーフォルダの中にあるので、ユーザー名が異なる複数のPCでXAMPPの設定を統一する場合に支障をきたします。
そこで、各PCでシンボリックリンクを作ることで、パスが完全に同一になるようにしています。
コマンドプロンプトでもPowerShellでも、必ず**管理者として**起動してください。

```
(コマンドプロンプトの場合)
> mklink /d C:\xampp-htdocs C:\Users\%USERNAME%\Dropbox\server

(PowerShellの場合)
> New-Item `
    -ItemType SymbolicLink `
    -Path     C:\ `
    -Name     xampp-htdocs `
    -Value    C:\Users\$($env:UserName)\Dropbox\server
```

:link: [PowerShell v5 でシンボリックリンクを作る - 倭マン&#39;s BLOG](http://waman.hatenablog.com/entry/2015/12/14/104508) [![hatena bookmark](http://b.hatena.ne.jp/entry/image/http://waman.hatenablog.com/entry/2015/12/14/104508)](http://b.hatena.ne.jp/entry/http://waman.hatenablog.com/entry/2015/12/14/104508)

上のコマンドで`C:\xampp-htdocs` = `C:\Users\%USERNAME%\Dropbox\server`となりました。
Apacheの設定ファイルでは下記のように指定します。

```apache:xampp\apache\conf\httpd.conf
DocumentRoot "C:\xampp-htdocs"
<Directory "C:\xampp-htdocs">
```

ソースコードはDropboxを通じて保管し、共通化します。
Apacheの設定はGitで管理して共通化します。
今回のバーチャルホストの設定も共通化できますし、新バージョンのXAMPPへ移行する場合のバックアップにもなります。
:link: [XAMPPの設定ファイルをGitで管理する - Qiita](https://qiita.com/sutara79/items/9f42d4e8d086ac72e759)
Project Euler Q6 【二乗和の差】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
最初の10個の自然数について, その二乗の和は,
$1^2 + 2^2 + ... + 10^2 = 385$

最初の10個の自然数について, その和の二乗は,
$(1 + 2 + ... + 10)^2 = 55^2 = 3025$

これらの数の差は $3025 - 385 = 2640$ となる.

同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

## 解答

```bash
seq 100 |
awk '{a+=$1;b+=$1^2}END{print a^2-b}'
25164150
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/006.html
Project Euler Q4 【最大の回文積】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは $9009 = 91 × 99$ である.

では, 3桁の数の積で表される回文数の最大値を求めよ.

## 解答
前提：求める値は6桁であろう(ループを少なくしたかった)。

```bash
seq 900 999 |
awk '{for(i=900;i<=999;i++){printf("%d ",i*$1)}}' |
xargs -n1 |
sed -r 's/\B/ /g' |
awk '$3$2$1==$4$5$6{print $1$2$3$4$5$6}' |
sort -u |
tail -1
906609
```

awkの部分をうまく書き直したい。。

[2017/10/03追記]
[taramさん](https://qiita.com/taram)から教えて頂いた解答

```bash
seq 900 999 |
awk '{for(i=$1;i<=999;i++){print i*$1}}' |
awk -v FS= '$3$2$1==$4$5$6{print $1$2$3$4$5$6}' |
sort -u |
tail -1
906609
```

スッキリしました(\*^_^\*)

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/004.html
Boto3を使ったら空文字のままだとDynamoDBにデータが入れられなかった話

## DynamoDBから怒られる
Boto3を使ってDynamoDBにデータを入れようとしました。
下記のようなものです。

```
{
    'accountId': '12345',
    'date': '2017-09-20',
    'list': ['aaa', 'a', ''],
    'name': 'aaa'
}
```

結果、

```
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: An AttributeValue may not contain an empty string
```

怒られました。

## そこで
下記のような関数をつくりました。辞書オブジェクト(登録するJSON)を引数で与えて、空文字をNoneで上書きます。

```
def emptystr_to_none(item):
    for k, v in item.items():
        if isinstance(v, dict):
            TrustedAdvisorCheck.json_parse(v)
        elif isinstance(v, list):
            for i in range(len(v)):
                list_elem = v[i]

                if isinstance(list_elem, str):
                    if list_elem == '':
                        v[i] = None
                elif isinstance(list_elem, list) or isinstance(list_elem, dict):
                    TrustedAdvisorCheck.json_parse(list_elem)
        elif isinstance(v, str):
            if v == '':
                item[k] = None

    return item
```

## 結果
下記のように変換して、登録できました。

```
{
    'accountId': '12345',
    'date': '2017-09-20',
    'list': ['aaa', 'a', None],
    'name': 'aaa'
}
```
Google App Maker ー スクリプトから開いているURLを取得する方法

App Maker のスクリプトから開いているURLが欲しいなーと思ったときに調べた際のメモ。

そもそも App Maker ってなに？という人は、以下の記事を参照してください。
[Google App Maker とは？ 短期間で Web アプリケーション構築を可能にした理由](https://www.topgate.co.jp/what-is-google-app-maker)


## サーバーサイド（GAS）

### ScriptApp.getService().getUrl()
〜execまでが欲しい場合はこれでよい。

## クライアントサイド（JS）
### google.script.url を使う
URLパラメータやハッシュ値ならこれでも取得できる

```
google.script.url.getLocation(function(location) {
  console.log(JSON.stringify(location)); // -> {"parameter":{},"parameters":{},"hash":"MessageCreate"}
});
```

### window.parent.document.referrer を使う

※ 階層構造は変わる可能性があるので、この方法は得策ではない。
これが動かなくなるとアプリケーションとして成り立たなくなるような場合に使ってはいけない。


# 以下は調べたときに勉強になったのでメモ

## App Maker の構造
App Maker は iframe が二重でかかっているので、それを加味して取得する必要がある。
作成した画面はふたつめの iframe に書かれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/595f9a05-0821-e3f4-917d-ec1dd33d0bc7.png)


## 一番上で実行
```
window.location.href ->
"https://script.google.com/a/macros/howdylikes.jp/s/AKfycbxFNha8YfDQtgMk1wQOWd8TypvAw-WbDhpGWf1sg96e7VyD4icPElmUIA/exec"
```


## ひとつめのiframeで実行

```
window.location.href ->
"https://n-3dz2ufoyafrtygsybc7tju6pst5of6wjjnxddji-0lu-script.googleusercontent.com/userCodeAppPanel"
```

```
window.document.referrer ->
"https://script.google.com/a/macros/howdylikes.jp/s/AKfycbxFNha8YfDQtgMk1wQOWd8TypvAw-WbDhpGWf1sg96e7VyD4icPElmUIA/exec"
```


## ふたつめのiframeで実行

```
window.location.href
"https://n-3dz2ufoyafrtygsybc7tju6pst5of6wjjnxddji-0lu-script.googleusercontent.com/userCodeAppPanel"
```

```
window.document.referrer ->
"https://n-3dz2ufoyafrtygsybc7tju6pst5of6wjjnxddji-0lu-script.googleusercontent.com/userCodeAppPanel"
```

```
window.parent.document.referrer ->
"https://script.google.com/a/macros/howdylikes.jp/s/AKfycbxFNha8YfDQtgMk1wQOWd8TypvAw-WbDhpGWf1sg96e7VyD4icPElmUIA/exec"
```

### おまけ
`window.parent.parent.location.href` だと `origin` が違うため怒られてしまう。

```
window.parent.parent.location.href ->
VM6063:1 Uncaught DOMException: Blocked a frame with origin "https://n-3dz2ufoyafrtygsybc7tju6pst5of6wjjnxddji-0lu-script.googleusercontent.com" from accessing a cross-origin frame.
    at <anonymous>:1:31
```
『SEO対策』をするのは、ウェブサイト側ではなく検索エンジン側なんだよ

**『SEO対策』**を「検索エンジン対策」のような意味で使っている人がいますが、それは誤用です。

## SEOとは
**『SEO』**はSearch Engine Optimizationの略で、日本語で言うと「検索エンジン最適化」になります。
主に、ウェブサイトがGoogleなどの検索エンジンで検索順位を高めるための施策を指します。
具体的には、HTMLの文書構造を規格に即したものにしたり、メタタグを適切に設定するなどの行為が挙げられます。

## SEO対策とは
『SEO』が「検索エンジン最適化」という意味なので、**『SEO対策』**は「検索エンジン最適化対策」という意味になります。
これを正しい日本語として解釈すると、Googleなどの検索エンジンが、SEOを行なっているウェブサイトに対して取る施策を指します。
具体的には、検索エンジンのアルゴリムを改善して正しい順位にすることなどでしょうか。
しかしながら、そのような意味で『SEO対策』という言葉を使っている人はまれで、実際には『SEO』と同じく「検索エンジン最適化」の意味で用いられることが多いようです。

## なぜ誤用が定着したのか
日本人はなんでも略したがる傾向にありますが、一方で略語の本来の意味を考えない傾向もあります。
「SEO」だけでは具体的に何を意味するのかが分からないため、「対策」という接尾辞をつけたのでしょう。
また、『SEO対策』が誤用であることを知ったうえで、その用語が定着しているからという理由で使用している人もいるようです。[^1]
SEOのために『SEO対策』という用語を使わざるを得ないという、なんとも皮肉な状況となっています。

## 「言葉は変化するもの」とは言うけれど
言葉の誤用を正当化するための常套句として、「言葉は変化するもの」というものがあります。
確かにそうではありますが、かといって言葉の意味が正反対になるような用法が受け入れられるわけではないでしょう。
特にエンジニアであれば、論理が反転することの危うさは身に染みているはずです。

## おわりに
プログラミング言語も自然言語も、正しい言葉使いを心がけましょう。

## 参考リンク
* [間違いだらけの「SEO 対策」 | コラム | インフォマークス株式会社](http://www.infomarks.co.jp/seotaisaku/)
* [この夏「SEO対策」という表現への違和感が少し薄れた | SEO 検索エンジン最適化](http://www.searchengineoptimization.jp/seo-taisaku)
* [SEO対策、セキュリティ対策などの"対策"の誤用 | パシのSEOブログ](http://www.jweb-seo.com/blog/wordpress/2010/01/27/746)

[^1]: [SEO対策、セキュリティ対策などの"対策"の誤用 | パシのSEOブログ](http://www.jweb-seo.com/blog/wordpress/2010/01/27/746)
Github-pagesにReactで作ったアプリを簡単にデプロイ！

1. Reactアプリのルートディレクトリに移動して、yarnでgh-pagesをインストール
2. 新しくgithubのリモートにgh-pagesという名前の空ブランチを作る。
3. gh-pages用のビルドスクリプトを書いて、ルートディレクトリでスクリプトを実行

```
$ create-react-app MyApp
$ cd MyApp
$ yarn add gh-pages
```

```package.json

  ...略
  "scripts": {
    "start": "npm run build-css && node-sass-chokidar src/ -o src/ && react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "preghpages": "yarn build", //　追加
    "ghpages": "gh-pages -d build" //追加
  },
  "homepage": "./", //追加
  ...略

```

```
$ yarn ghpages
```

http://username.github.io/branch_name にアクセスすればビルドされたアプリが見れるはず！
Docker | docker で logrotate コマンドを実行する

(あまりDocker関係ないけど備忘を兼ねて)

# 用意するファイル

## Dockerfile

```:Dockerfile
FROM ubuntu

RUN apt-get update
RUN apt-get install -y vim logrotate

COPY logrotate_conf logrotate_conf
COPY some.log /root/some.log

CMD logrotate -f logrotate_conf && ls ~/
```

## ローテーションの設定ファイル

```:logrotate_conf
~/some.log {
        daily
        missingok
        rotate 52
        dateext
        compress
        create 644 root root
}
```

## ログファイル

```:some.log
A
B
C
```


# Dockerを実行

## イメージをビルド

```
$ docker build . -t logrotate
```

## コンテナを実行

```
$docker run logrogate
some.log
some.log-20171002.gz
```

## コンテナに入って試す場合

```
$ docker run -it logrotate /bin/bash
```

# 環境

- Docker version 17.06.1-ce, build 874a737








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ec2(amazon linux)にnode.jsを導入

前提
　・EC2のインスタンスを作成済み（yumのupdateも完了）
　・インスタンスのセキュリティーグループでsshを許可している
　・インスタンスにSSHに繋げる
　・Macでターミナルを使用

手順
　1. 依存パッケージのインストール
　2. node.js v6 をインストール（当時の安定版の最新版）
　3. node.jsのインストール

##1. 依存パッケージのインストール
`sudo yum install -y gcc-c++ make`

##2. node.js v6 をインストール（当時の安定版の最新版）
`curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -`

##3. node.jsのインストール
`sudo yum install -y nodejs`

以上〜♪
Atomで パッケージが正しく動作しない時の対処法

Atom で Remote-FTP をインストールしたけれど、config file が作成されず悶絶していたら

[FTPパッケージ「Remote-FTP」で動作不良が発生！Atomパッケージがオカシイ場合の対処方法](http://xov.jp/e/1165/)

に解決方法が書いてありました。感謝。

おそらく Remote-FTP以外でもトラブルが起きた時に解決する可能性が高そうなのでメモ。

1. command + shift + P
1. Incompatible Packages
2. Rebuild Packages

で使えるようになりました。
Rails5 Strong Parametersで複数の配列を許可する

## はじめに

環境は以下

* Ruby 2.4.0
* Rails 5系

formから渡ってくるデータを一部配列で受けわたしている部分が複数あった。
やりたいこととしては、フォームから渡ってくるデータで複数箇所の配列を許可したかった
コントローラーのStrong Parametersに以下のような記述の仕方をすると`Unpermitted`となって詰まったのでメモ

```ruby
def hoge_params
  params.permit(:name, hobbies: [], :pref, hoges: [], :text)
end
```

上記のような形であるとエラーが出た。

## 解決方法

Strong Parametersで配列データを扱う時、該当の配列は一番最後に記述しなければいけないというルールがあるらしい(情報ソースはどこか忘れてしまいました)

なので、以下のように書くと許可出来る。

```ruby
def hoge_params
  params.permit(:name, :pref, :text, hobbies: [])
end
```

とすると、配列データを許可することが出来ました。
ここまでは、Web上の記事で解決出来たのですが、複数の配列データをやりたかったので、その場合は以下のようにします。

```ruby
def hoge_params
  params.permit(:name, :pref, :text, hobbies: [], hoges: [])
end
```

## 結論

Strong Parametersで配列を扱いたい時は、配列をStrong Parametersの最後にまとめて記述する
golangぷちメモ1

割と毎回確認してる気がするのでもうメモってしまおう。
部分配列とるときの[x:y]のアレ。

```
a := []int{1,2,3,4,5}
```

```
fmt.Println(a[0:1])

[1]
```

```
fmt.Println(a[:5])

[1 2 3 4 5]
```

```
fmt.Println(a[:6])

panic: runtime error: slice bounds out of range
```

つまるところ、開始位置はそのまんまindexの値。
終わりは自動でマイナス1されていると思おう。
故にlenで要素数取った場合は余計なことせずにそのまま使える。
yumの使い方メモ

# 概要
yumの使い方を覚えるための学習メモ

# リポジトリ情報を照会する

## リポジトリ一覧

```
[root@localhost]# yum repolist

Loaded plugins: fastestmirror
Loading mirror speed from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp

repo id                repo name
base/7/x86_64          CentOS-7 - Base
centos-sclo-rh/x86_64  CentOS-7 - CSLo rh
extras/7/x86_64        CentOS-7 - Extras
updates/7/x86_64       CentOS-7 - Updates
repolist: 15,593
```

*1 `yum repolist all`とするとより細かい情報が出てくる。

## リポジトリの詳細情報

```
[root@localhost]# yum repoinfo

Loaded plugins: fastestmirror
Loading mirror speed from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp

Repo-name    : CentOS-7 - Base
Repo-version : 1504648209
Repo-updated : Wed Sep  6 06:151:13 2017
Repo-pkgs    : 9,591
Repo-size    : 7.6 G
Repo-mirrors : http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock
Repo-vaseurl : http://ftp.iij.ad.jp/pub/linux/centos/7.4.1708/os/x86_64/ (9 more)
Repo-expire  : 21,600 second(s) (last; Mon Oct  2 09:31:50 2017)
  Filter     : read-only:present
Repo-filename: /etc/yum.repos.d/CentOS-Base.repo

～ 略 ～

```

*1 `yum repoinfo all`とするとより細かい情報が出てくる。
postgresに接続できなくなったのでやったこと

開発中、処理がくそ重くなってしまった原因を追求しようとしていたら、
processがkillできないほどに固まってしまったのでPC再起動

動くかなーって試してみたら・・・

```
$ rails s
=> Booting Puma
=> Rails 5.0.4 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.7.1 (ruby 2.3.3-p222), codename: Snowy Sagebrush
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/" for ::1 at 2017-10-02 11:22:39 +0900

PG::ConnectionBad (could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
):
```

なんでpostgresがダメになってるんだよ・・・
最近よくpostgresが落ちる

毎回再インストールしてたけど、今回は再インストールしなくてもうまくいったので記録！

こちらを参考に
[Postgres could not connect to server](https://stackoverflow.com/questions/13410686/postgres-could-not-connect-to-server)

みんながうまくいっているこのコメント

```
rm /usr/local/var/postgres/postmaster.pid
```

ダメだったｗ

その中のコメント

```
$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
pg_ctl: another server might be running; trying to start server anyway
server starting
```

動いた！

意味はわかっていないけど、これからはまずはこいつを試してみようｗ
マルチバイトを含むファイルを読み込んで、1文字ずつ処理

perlスクリプト、読み込むファイルは、UTF-8で保存。

```perl:a.pl
#! /usr/bin/perl -w

use strict;
use warnings;
use utf8;
use Encode qw/encode decode/;

if (@ARGV != 1) {
	exit 1;
}

&main(@ARGV);
exit 0;

sub main {
	my $filename = shift;
	my $fh;
	
	open($fh, '<' . $filename) or die;
	
	while (my $buff = <$fh>) {
		$buff = decode('UTF-8', $buff);
		my @tmp = split(//, $buff);
		
		foreach my $v (@tmp) {
			if ($v eq "新") {
				next;
			}
			
			printf("%s\n", encode('UTF-8', $v));
			sleep(1);
		}
		
	}
	
	close($fh);
}


```
MacにHomebrewを導入する方法


自分用の備忘録ですので、読みにくい場合があります。

#Homebrewとは
MacOS用のパッケージ管理システム。ソフトウェアやライブラリを導入するのが楽になります。

#インストール方法

1.AppStoreでXcodeのインストール

2.コマンドライン・デベロッパ・ツールのインストール

```
xcode-select --install
```

3.Homebrewのインストール

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

最新のコマンドは、[Homebrew](https://brew.sh/index_ja.html)にアクセスしてください。

4.確認

```
brew doctor
```

とコマンドを打ち、

```
$ brew doctor
Your system is ready to brew.
```

となっていれば導入成功です。

#基本的なコマンド

 **Homebrewではパッケージのことをformulaと呼びます。**

###バージョン確認

`brew --version`

自分のですと、

```
$ brew --version
Homebrew 1.3.3
Homebrew/homebrew-core (git revision baf0; last commit 2017-09-25)
```

でした。

###問題がないかのチェック
`brew doctor`

###アップデート
```
brew update
brew upgrade  <--更新のあるformulaを再ビルドする
```

###インストール方法
`brew install <formula>`

###インストール済みのformulaの確認
`brew list`

###アンインストール方法
`brew uninstall <formula>`

###不要なformulaの削除
`brew cleanup`

`-n`をつけることで消されるものの一覧を表示できる。

###formulaの情報を見る
`brew info <formula>`
Xcode9でITMS-4088エラーが出た時は

# 何が起きた

Xcodeをバージョン9にアップデートしたんですが、
バイナリをiTunesConnectにサブミットしようとしたら、こんなエラーが出ました
![スクリーンショット 2017-10-02 11.02.42_z.png](https://qiita-image-store.s3.amazonaws.com/0/98954/5241e4dc-aadf-6607-5576-4da36e4608c7.png)

## どういう意味か
書いてあることは、「そのiTunesConnectアカウント(organization)には、そのバイナリファイルを編集する権限がありません。」ということ。
つまり、iTunesConnect側で、先にそのアプリの登録をすれば良い訳なのですが・・・

本当にアプリの登録をし忘れてた人は、登録すれば大丈夫です。

でも、私の場合、そういう問題ではありませんでした。

これ、結構困る人多いと思われる問題です


## 本当の問題は何か

私は、複数のiTunesConnectアカウントを併用して仕事をしています。
Xcode8までは、アップロードする手順の中で、アカウントを選択するところがあったので、
そこで正しいアカウントを選択して、アップロードしていました。
（こちらの記事の手順13です→https://qiita.com/knife0125/items/05ef8bd6a5dc5fd9cd44
ちなみにXcode9になって、この記事の手順とは結構変わってます）

しかし、Xcode9になってから、その手順が表示されなくなり、アカウントを選択する術がなくなってしまったのです（あったら教えて欲しい）
どうやら、Xcodeの設定画面(Cmdキー+カンマで表示)の"Accounts"タブで表示されるアカウントリストの一番上のアカウントを強制で使うようになっているようです

![スクリーンショット 2017-10-02 11.14.19＿z.png](https://qiita-image-store.s3.amazonaws.com/0/98954/289a62c3-9a42-d274-0127-7c067b751f70.png)

そりゃないぜよ！

## アメリカのみなさんも困ってる

https://forums.developer.apple.com/thread/87069
"Same problem"
"Same error here"
みたいに、「俺も」「俺も」が多い。


# 解決法

アプリケーションローダーを使います

むかーし私が書いた記事です。
https://qiita.com/_natsu_no_yuki_/items/68140e7c0e96afbb2e4b


またこれを使う日が来るとは…

いや、まあ、来るとは思ってましたけども。


バージョンアップすると時々これ使わないといけない時ありますね。

しかしApple開発陣はこんな大きな問題点に気づかないんだろうか…
pipインストールできない IOError: [Errno 1] Operation not permitted: '/bin/pip'


Macbook ProからiMacに移行して、High Sierraにしたらaws cliが動かなくなった。
再インストールを試みたが、pipのインストールが以下のエラーを出力し失敗した。

```
$sudo python get-pip.py
The directory '/Users/ユーザー名/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/ユーザー名/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 1.2MB/s
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
    100% |████████████████████████████████| 51kB 10.7MB/s
Installing collected packages: pip, wheel
Exception:
Traceback (most recent call last):
  File "/tmp/tmpRSsSoO/pip.zip/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/tmp/tmpRSsSoO/pip.zip/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/tmp/tmpRSsSoO/pip.zip/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/tmp/tmpRSsSoO/pip.zip/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/tmp/tmpRSsSoO/pip.zip/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/tmp/tmpRSsSoO/pip.zip/pip/wheel.py", line 462, in move_wheel_files
    generated.extend(maker.make(spec))
  File "/tmp/tmpRSsSoO/pip.zip/pip/_vendor/distlib/scripts.py", line 372, in make
    self._make_script(entry, filenames, options=options)
  File "/tmp/tmpRSsSoO/pip.zip/pip/_vendor/distlib/scripts.py", line 276, in _make_script
    self._write_script(scriptnames, shebang, script, filenames, ext)
  File "/tmp/tmpRSsSoO/pip.zip/pip/_vendor/distlib/scripts.py", line 250, in _write_script
    self._fileop.write_binary_file(outname, script_bytes)
  File "/tmp/tmpRSsSoO/pip.zip/pip/_vendor/distlib/util.py", line 407, in write_binary_file
    with open(path, 'wb') as f:
IOError: [Errno 1] Operation not permitted: '/bin/pip'
```

sudo に `-H`オプションを指定することでインストールできた。

```
sudo -H python get-pip.py
```

急いでいたので理由の深追いはしていない。
Mysql+PHP トランザクションとテーブルロック（古い）

テーブルロックしなければいけない場面って、そんなに発生しないのでいつもいつも忘れてしまうのでまとめておく。

古いmysql

```php
    mysql_query("SET AUTOCOMMIT = 0");
    mysql_query('LOCK TABLES schools WRITE, students WRITE');

    $query = "SELECT max(number) as number FROM students";
    $query = "INSERT INTO students ....";

    mysql_query("COMMIT");
    mysql_query("UNLOCK TABLES");
```

mysqli


```php
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    $mysqli->query("SET AUTOCOMMIT = 0");
    $mysqli->query('LOCK TABLES schools WRITE, students WRITE');

    $query = "SELECT max(number) as number FROM students";
    $query = "INSERT INTO students ....";

    $mysqli->query("COMMIT");
    $mysqli->query("UNLOCK TABLES");
```
Popolo 仕様

# 背景
オープンに使える選挙データベースが（単にまだ）無いのが困ったなというところから「[Code for 選挙](http://election.code4japan.org/)」（[github](github.com/codeforjapan/codeforelection/)）というプロジェクトが立ち上がった。実は世界に目を移すとデータ化の流れは存在しているそうだ。

複数の団体が合流してできている [Popolo](http://www.popoloproject.com/) という政治関連のデータモデル仕様があり、事実上の国際標準になっている。

[Open Civic Data](http://opencivicdata.org/) での活動成果の popolo 仕様関連ツール類が充実している。[Sunlight Foundation](https://sunlightfoundation.com/) もこれらのツールを[使っている](https://sunlightfoundation.com/2014/11/24/help-liberate-your-towns-info-with-the-open-civic-data-project/)そうだ。

[mySociety](https://www.mysociety.org/) という団体が運営する [Every Politician](http://everypolitician.org/) というデータベースプロジェクトでも、Popolo 仕様を使ってデータをメンテナンスしている。Every Politician は現状、世界中の[国のトップレベルの議会についてのみ](http://docs.everypolitician.org/data_summary.html)取り扱っている。次の48回衆議院議員選挙は、日本の国のトップレベルの議会なので、Every Politician としてもデータ化するよい機会ではある。46回衆議院議員は[登録](http://everypolitician.org/japan/house-of-representatives/term-table/46.html)されているので、眺めてみると面白い。本家は長大な json なので、エッセンスを[抜粋](https://gist.github.com/hkwi/3df81b307d6b63972294b7f3af760d2f)したものを眺めると掴みやすい。

# Popolo 仕様

さてその Popolo 仕様だけれども、仕様自体はコンパクトに記述されているけれど、背景の説明が無いので補足がいるだろう。こんな順番で定義されている。

- 最初はクラス定義のみがされている（ここでは popolo 語彙と呼ぶ）
- それは JSON でシリアライズして表現できる（ここでは popolo json と呼ぶ） `other_names` のように若干変換規則が追加されていることがある
- popolo json は [JSON-Schema](http://json-schema.org/) で構造検査できるように準備されている。
- RDF へのシリアライズは、popolo 語彙と[既存の各種標準語彙](http://www.popoloproject.com/specs/event.html#standard-reuse)とのマッピングを行う。
- マッピング後の語彙で RDF turtle でシリアライズして表現できる（popolo RDF と呼ぶ）
- popolo RDF の別表現として RDF json-ld での表現方法もできる
- 上記の流れが混然一体となって仕様に書かれている ^^

EveryPolitician は WikiMedia として[Grant](https://meta.wikimedia.org/wiki/Grants:Project/mySociety/EveryPolitician)されていて、wikidata と相互に連携しているらしい。

- https://www.wikidata.org/wiki/Wikidata:EveryPolitician
- http://docs.everypolitician.org/data_summary.html の "IDs to other data sets, including Wikidata"

さらに補足：

- 仕様改定も随時行われているようなので、記述が更新されていない部分がたまにあるのは、ご愛敬。
- Database としての popolo json dump 形式は[互換性](http://www.popoloproject.com/appendices/components.html) の部分を参照するべし、のように見える。クラス定義まではされていない様子。
- open civic data に、実務的なノウハウがあったりするので、探してみると意外と見つかったりする。
- 実は Popolo は選挙よりも選挙結果である体制をモデル化することが主軸だったので、[議論](https://github.com/popolo-project/popolo-spec/issues/104)がある。例えば [Voting Information Project](https://www.votinginfoproject.org/) という選挙に特化したデータモデルのプロジェクトもあるので、必要に応じて使い分ける手もある。
- EveryPolitician では、おそらく入力の簡単のため、CSV 形式を使ってデータを揃えて、json に変換している模様。ID を最初に採番して、結合できるように準備していると思われる。
- ID の採番方法は [OCDID](http://docs.opencivicdata.org/en/latest/ocdids.html) = Open Civic Data ID が参考になる。


# EveryPolitician

`everypolitician_legacy` というキーが見かけられるように、移行している様子。基本的には wikidata との連携を強めようとしているようだ。

wikidata からデータを膨らませている部分が相当ある。まだ載せきれていない部分は主に「政治家自体の登録」といった単純なものと、「議会と議員の関係性」といった、国ごとの事情が絡むものに大きく分かれる。


# 選挙どうする

選挙のデータを popolo に入れる際には Event を使って、次のようにするのでいいんじゃなかろうか。

- `parent event` で「第48回衆議院議員選挙」と「第48回衆議院議員選挙 東京１区」で紐づける。
- `attendee` を候補者と扱って紐づける。（ここは若干特殊な意味づけかもしれない）
- 仕様上 Event と Area が紐づいていないのがイマイチな点

あるいは proposal draft を許すなら、[Election](https://github.com/datamade/docs.opencivicdata.org/blob/elections/proposals/drafts/elections.rst) クラスを使うか。
Apache Cordova と AngularJS

# Apache Cordova と AngularJS
Cordova アプリでも AngularJS のようなフレームワークを使うことはよくあります。(むしろアプリを作るので、出番が多いかも)

Cordova アプリは `deviceready` イベントが発火して初めてプラグインなどの機能が使えるようになります。アプリを `deviceready` イベントの発火後に描画をするのか、発火前なのかを選択する必要があります。

* `deviceready` より後 - Cordova やプラグインの初期化が終わってからアプリを描画します。アプリが利用できるようになるのが少し遅れます。
* `deviceready` より前 - Cordova やプラグインの初期化が終わる前にアプリを描画します。いち早くアプリが利用できるようになりますが、利用者に対し Cordova の機能を一時的に使わせないようにする工夫が必要です。


## `deviceready` イベント発火後に描画をする
簡単な方から!

`ng-app` ディレクティブを使うと `deviceready` イベントより前に画面が描画されます。`ng-app` ディレクティブを使うのをやめ、`angular.bootstrap` 関数を `deviceready` イベント後に呼び出します。

```js:js/index.js
document.addEventListener('deviceready',ｆ function () {
  var appContainer = document.getElementById('app-container');
  angular.bootstrap(appContainer, ['app']);
}, false);

angular.module('app', ['ngCordova'])
  .component('myComponent', { /* ... */ });
```


### プラグインを Browserify
`cordova build` の際に `--browserify` とつけると Cordova プラグインをまとめてひとつの JavaScript ファイルにしてくれます。少しだけパフォーマンスが向上するようです。

> Compile plugin JS at build time using browserify instead of runtime.

```
$ cordova build --browserify
```


### スプラッシュスクリーンでごまかす
[スプラッシュスクリーンプラグイン](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/index.html)を使って、`deviceready` イベントが発火後までスプラッシュスクリーンを表示する方法です。

```
$ cordova plugin add cordova-plugin-splashscreen
```

デフォルトではスプラッシュスクリーンを 3 秒間表示します。`config.xml` ファイルに追記してスプラッシュスクリーンの自動非表示を OFF にします。

```xml:config.xml
    <preference name="AutoHideSplashScreen" value="false" />
```

```js:js/index.js
document.addEventListener('deviceready', function () {
  navigator.splashscreen.hide();
}, false);
```


## `deviceready` イベント発火前に描画をする
`deviceready` イベントより前で描画することで、アプリをいち早く使えるようにします。しかし、そのままでは初期化が済んでいない Cordova の機能を利用者が呼び出せてしまうため、一時的にボタンを無効化するなどの対策が必要になります。

AngularJS モジュール、[ng-deviceready.js](https://gitlab.com/GrayBullet/ng-deviceready) を作りましたのでこれを利用します。

`deviceReady.isDeviceReady` プロパティを提供していて、この値を見ることで `deviceready` イベントが発火された後かどうかを調べることができます。このプロパティをボタンの `ng-disabled` に設定することで、`deviceready` イベント発火後にボタンが有効になる仕組みです。

```js:js/indexjs
angular.module('app', ['ngCordova', 'deviceready'])
  .component('myCamera', {
    controller: function ($cordovaCamera, deviceReady) {
      var that = this;

      // Until deviceready fired, button is disabled.
      that.disabled = function () {
        return !deviceReady.isDeviceReady;
      };

      that.take = function () {
        var options = {
          sourceType: Camera.PictureSourceType.CAMERA,
          destinationType: Camera.DestinationType.DATA_URL
        };

        $cordovaCamera.getPicture(options)
          .then(function (image) {
            that.image = 'data:image/jpeg;base64,' + image;
          });
      }
    },
    template: '<div>\n' +
    '<button ng-disabled="$ctrl.disabled()" ng-click="$ctrl.take()">take</button>\n' +
    '<img src="{{$ctrl.image}}">\n' +
    '</div>\n'
  });
```

## まとめ
いろいろと方法がありますが、アプリの起動時間が許容範囲内なら、`deviceready` の後で初期化、プラグインの Browserify 有効化、スプラッシュスクリーンでごまかすのが楽です!
PythonでGitHubAPIを叩く（Django）

DjangoでGitHubのOAuth認証を利用してのWebアプリケーションを利用した際にGitHubAPIを叩いたので備忘録も兼ねて、自分と同じようにPythonでGitHubAPIを叩きたい人向けに記事を書く。

## 前提条件
- Djangoがある程度わかっている。
- Python3の構文を理解している。

## 注意
今回の記事ではOAuth認証の実装の説明はしないので[こちらの記事](https://qiita.com/gcnaka/items/90ceeb03d562adb33c39)を参考に実装してみてください

## 準備
GitHubAPIを利用するために[PyGithub](https://github.com/PyGithub/PyGithub)というライブラリを使用します。

`$ pip install PyGithub`でライブラリをインストールしましょう。

## ユーザ情報の取得
### アクセストークンを利用する場合
OAuth認証を実装したWebアプリケーションでGitHubAPIを叩きたい場合はアクセストークンを利用します。

```py3:views.py
social = user.social_auth.get(provider='github')
access_token = social.extra_data['access_token']
```
上記のコードでアクセストークンを取得できます。
`user`の部分にはUserモデルを入れてあげてください。

ユーザ情報を取得するには以下のコードでOKです！

```py3:views.py
from github import Github

gh = Github(access_token)
```
これで`gh`にはアクセストークンを元に取得したユーザの情報が入っています。

### 普通にPythonでGitHubAPIを叩きたい場合
DjangoとかWebアプリケーションではなく普通にスクリプトでGitHubAPIを叩きたい場合でもこのライブラリは使えます（有能）

```py3:github.py
from github import Github

gh = Github('ユーザー名', 'パスワード')
```
以上のようにしてユーザ情報を取得できます！

### 注意点
アクセストークンを元にユーザ情報を取得した場合Organizations（組織）関連の情報が取得できないので注意しましょう。

※　もしかしたら方法があるのかもしれませんが私は見つけられませんでした...

## GitHubAPIを叩く！！
お待たせしました！ここまできたらAPI叩き放題です！（ゲス顔）
全部紹介するとキリがないので私が開発で実際に使ったものだけも紹介したいと思います。（甘え）

### リポジトリ一覧の取得

```py3:github.py
gh.get_user().get_repos()
```
#### リポジトリの個別情報の取得

```py3:repository.py
repository.name # リポジトリ名

repository.html_url # GitHUbのリポジトリのページのURL（リンクに使える）

repository.stargazers_count # リポジトリのスター数

repository.updated_at # 最後にリポジトリを更新した時刻（日本時間基準ではないので+９時間してやると日本時間になる）
```

### 自己紹介(Bio)の取得

```py3:github.py
gh.get_user().bio
```
### ウォッチリストの取得

```py3:github.py
gh.get_user().get_watched()
```

### Issueの一覧の取得

```py3:github.py
gh_repo.get_issues()
```
#### Issueの個別情報の取得

```py3:issue.py
issue.title # タイトル

issue.html_url # リポジトリと同じ（リンク）
```

### ブランチ一覧の取得

```py3:github.py
gh.get_repo(project.repository_id).get_branches()
```
#### ブランチの個別情報の取得

```py3:branch.py
branch.name # ブランチ名
```
以上！

## 最後に
全部取得系でしたが当然リポジトリの作成なども行えますので、それは公式のドキュメントを参考にして見てください（土下座）
ただ取得にしろ作成にしろ要領は同じなので困ることはあまりないと思います。私はPyCharmの補完機能を利用して勉強したので是非実践して見てください！

それでは皆さん良いPythonライフを送ってくださいね！
No.1 新卒未経験エンジニアがPHPでテキストファイルダウンロード実装した時にソースコードが含まれてしまう問題に取り組んでみた

未経験新米エンジニアが日々の業務で直面した問題や、日々インプットした知識をアウトプットしていきます。

PHPでファイルのアップロードとダウンロードが出来るツールを作った際に起きた問題について書き置きしておきます。
フレームワークはdietcakeを使っており、PHPのバージョンは5.6です。

まず起きたこととしてはタイトルにある通り、テキストファイルをダウンロードした際に下記のようなコードが、ダウンロードしたテキストファイルに含まれてしまっていたことです。

```html:混入してしまうソースコード
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>サイトタイトル</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="format-detection" content="telephone=no">
    <meta name="viewport" content="width=1220">
    <meta name="aaaaaa" content="aaaaaaa">
    <link rel="shortcut icon" href="http://aaaa.bbb">
    <script src="http://aaaa.bbb"></script>
    <script>WebFont.load({google: {families: ['Roboto', 'Roboto Condensed']}});</script>
    <script src="http://aaaa.bbb"></script>
</head>
<body>
</body>
</html>
```

色々調べてみたのですが、原因特定には至らず、、、
ちなみにダウンロード処理のコードは

```php:index.php
$file_name = "test.txt";
$length = filesize("text.php");

header('Content-Type: application/force-download');
header('Content-Length: ' . $length);
header('Content-Disposition: attachment; filename="' . $file_name . '"');

readfile($file_name);
```

少し変えていますが大体こんな感じです。

結果から言うと、phpファイルの最後に

```
exit();
```
を加えるだけで解決しました。
おそらく、処理をexitしていなかったために、readfile後もそのまま処理が継続して行われ、コントローラーのアクションに対するビューのHTMLコードが一緒に出力されてしまったのではないかな、と推測しております。

調べても具体的な解決方法などあまり出てこなかったので投稿しておきます。

間違っていたり、補足などあればどうぞ宜しくお願い致します。
D-CTF Quals 2017 writeup

# D-CTF Quals '17 writeup
juniorしか解けてない。
Points 13で217位。

## Super Secure
web問、パスワードとアカウントの入力を求められる。
ページのソースを見ると直接遷移先があるので、そこに直接アクセスすればいい。
ソース中にアカウントとパスワードもあるので、そちらを入力してもよい。
offlineがどうとか書いてあるのでofflineにすると、javascriptが実行され、通知のようなものでフラグが表示される。
幅が足りてなくてフラグが読みとれないので、ページの要素を表示して直接内容を見ないとフラグが分からなかった。

## hex warm up
foren問とcrypto問、ransomware.pyとlock.isoが渡される。
ransomware.pyを見てみるとファイルの前後に適当なビット列を追加しているだけなのでbinwalkとかforemostなどで元のファイルを抜きだせる。zipファイルが出てくるので解凍するとフラグが書かれたテキストファイルが出てくる。

## hit and split
net問、pcapngファイルが渡されるのでwiresharkで見てみる。
telnetで何らかのデータを難読化サービスに送信しているらしい。
scapyを使えば簡単に抽出できるのかもしれない、使えないので手動でやる。
telnetのみで絞り込みをし、ストリームを最初から順番に抽出する。
すると、途中でフラグを送信している部分があったので、それを抽出して終了。

## how is your memory?
pwn問、.exeファイルが渡される。
調べてみると実際はelf形式なので、そのまま実行してみる。
どうやらローカル変数を書き換えて0xdeadbeefに変えればいいらしい。
最初に入力を受けとるところで50文字くらいの文字を送りこむと、40文字目以降で書き換えしていることが分かった。
書き換えに成功すると、2回目の書き換えをしろと言われるので、その通りにする。
まったく同じやり方でできる、成功するとフラグが表示される。

## inception
foren問、D-CTFのロゴ画像が渡される。
サイズを調べてみると異常にサイズが大きいようなので、binwalkしてみる。
すると複数の画像が抽出されたので見比べてみると、そのうちのひとつにフラグが書かれている。

## loyal book
foren問、book.zipが渡される。
解凍するとテキストファイルが10個出てくる。内容を見てみると、全てのファイルの内容がほぼ同じであることが分かる。
そこでdiffで差分を取ってみると、単語の間などにフラグの一部が挿入されていることが分かる。
オリジナルのファイルが0001.txtであるようなので、番号順に差分を取り、その結果を結合した。

## too easy
bin問、looksgood.exeが渡される。
elfなので実行してみるとパスワードの入力を求められる。
stringsでパスワードが直接抽出できるため入力すると、16進数値が返される。
これを文字列にデコードすると、1文字飛ばしでフラグになるようになっている。

## is nano good?
web問、解けなかった。
nanoのバックアップファイルからwebページのphpのソースが読める。
見てみると、ディレクトリトラバーサル対策のようなものをしてから、$pageに指定されたファイルを読み込むらしい。
$typeを指定すると任意のファイルを読み込める。
任意のファイルを読み込むところまでは行けたけど、そこから何を表示すればいいか分からなった。
phpは詳しくない。

## forgot my key
crypto問、以前に同じ問題を解いた。
各文字の解読に必要なのはひとつ前の暗号化された文字と、対応したキーかメッセージが分かれば解読できるようになっている。
key自体はmd5なので固定長で、|が含まれているので、|に対応する部分のキーの値が分かる。
このキーが分かることで暗号化されたキーの値が復号できるようになる。
これを繰り返し、キー全体を復号できる。
しかし、phpが読めないため、md5の返り値とかunpackとかarray_shiftが分からなかった。
解き方は分かったし良しとしよう...

# まとめ
いろんなところが不便であまり楽しくなかった。
phpが読めずに死んだのは自業自得として、フラグ文字列をhash値にするのはミスりやすいのでやめて下さい。
手打ちとか死ぬ。求め方も方法によって変にバラつきがでて、md5sumで出したhash値では違うとかがあった。
既存のカラムをSerial型へ変更する

#既存のInteger型の列をSerial型へ変更する

一般的な型変更の要領でalter table文を用いてSerial型へ変更しようとするとできない。
以下のようにERRORが出て怒られる。

```postgres
alter table [table_name] alter column [colname] type serial;

ERROR: type "serial" does not exist
```

そこで、シーケンスオブジェクトを設定することで連番が取れるようにする。

※シーケンスオブジェクトとは？
シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されるもの
シーケンスは自動的に連番を生成するための仕組み
参考：　https://www.postgresql.jp/document/7.4/html/functions-sequence.html

##①シーケンスオブジェクトを作成する

```postgres
create sequence [table_name]_[colname]_seq;

```
シーケンス名については[テーブル名] \_[対象カラム名]_seqとする例が多くみられる。
スタートを1からではなく数値[num]を設定したい場合は下記のようになる。

```postgres
create sequence [table_name]_[colname]_seq start [num];

```


##②連番とするカラムのデフォルト値をシーケンス値とする

```postgres
alter table [table_name] alter [colname] set default nextval('[table_name]_[colname]_seq');

```

連番として設定するカラムについて、デフォルト値をシーケンスの次の値とすることで連番を実現している。
nextval('hoge')関数は、行が挿入された時に、前回設定されたシーケンス値の次の値を列に設定する。
これでデータ挿入時の値の設定ができた。デフォルトでは1+increment_by (デフォルト 1)

##③テーブルと連動するように変更する

```postgres

alter sequence [sequence_name] owned by [table_name].[colname];
```
owned byを付加することで、シーケンスを設定した列が削除したときに、そのシーケンス自体も削除されることとなる。

##④現在のsequence値を設定する

```postgres

select setval('[sequence_name]', 1, false);
```
最後に、値を設定する。
ここで、第3引数にfalseを設定しておくのを忘れないようにする。
データが無い状態であれば１からの連番となる。

※select * from [sequence_name];でシーケンスの内容を確認すると、is_calledの値がTrueに設定されている。
この場合、現在last_valueである1の値が既に使用されていることとなる。
つまり、この状態から新しい値を追加すると2から始まることになる。
is_calledをfalseに設定しておくと、last_valueである1はまだ呼び出されていないため、新たな値を追加しても1から開始できる。


```
     sequence_name      | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
------------------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 stat_conditions_id_seq |          1 |           1 |            1 | 9223372036854775807 |         1 |           1 |       0 | f         | t
```
[OSX][Swift]CATextLayer テキスト折り返し方法

## 概要
CATextLayerを使ってのテキストの折り返しにハマったので自分用のメモ。

## 内容
生成したCATextLayerのプロパティ isWrappedをtrueに設定すると折り返しされる。

## サンプルコード
```CATextLayer_sample.swift
let textLayer = CATextLayer()
textLayer.string = attrString
textLayer.font = font
textLayer.fontSize = font.pointSize
textLayer.foregroundColor = NSColor.black.cgColor
textLayer.frame = myFrame
textLayer.isWrapped = true // isWrappedをtrueに
textLayer.contentsScale = (NSScreen.main()?.backingScaleFactor)!
DjangoでGitHubのOAuth認証を実装！！

DjangoでOAuth認証に関する記事は多いが
- TwitterやFacebookばかりでGitHubの情報が少ない
- 情報が古い
以上の２点からPythonistaを目指す私（初心者）が自分と同じように困っている人たちの力になるべく記事を書く！

## 準備
DjangoでOAuth認証を実装するに当たって[social-auth-app-django](https://github.com/python-social-auth/social-app-django)というライブラリを利用した。

`$ pip install social-auth-app-django`でライブラリをインストールする。

Djangoのsettings.pyのに以下のように設定を追加する

```py3:settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR + 'project/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # 以下の2行を追加
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

# 以下の設定も追加
AUTHENTICATION_BACKENDS = [
    'social_core.backends.github.GithubOAuth2',
    'django.contrib.auth.backends.ModelBackend',
]

SOCIAL_AUTH_GITHUB_KEY = 'Client ID'
SOCIAL_AUTH_GITHUB_SECRET = 'Client Secret'

```
以上の設定でOAuth認証が使えるはずです！

## GitHubアカウントでログイン！

OAuth認証でログイン出来るようにするには

urls.pyに

```py3:urls.py
url(r'', include('social_django.urls', namespace='social')),
```
と追加してログインページのHTMLに


```html:login.html
<button type="button" onclick="location.href='{% url 'social:begin' 'github' %}'">
     GitHubアカウントでログイン！
</button>
```
と記述すればButtonを押すと認証画面にいきます！
あとはDjangoの方でいい感じにUserモデルと紐付けてくれます！（有能）

## 最後に
いかかがだったでしょうか？
これからDjangoでWebアプリケーションを作る人の参考になれば私を嬉しいです！
同じ要領でTwitterやFacebookのOAuth認証も実装できるので他の記事も参考にしながらぜひ実装して見てください（そっちの方が参考になるかも...）
それではみなさん良いPythonライフを送ってください！
スマホ画面の横揺れ修正

楽天などのモールのheaderを100%にしている店舗から、横スクロールバーが出ると連絡があったので対策方法を紹介します。

## 基本的な対策方法
まず、HTML要素に対して横スクロールを無効にする方法を試してみましょう。
```css:css
html {
	overflow-x: hidden;
}
```
## 縦スクロールも無効にしたい場合
場合によっては、縦スクロールも無効にしたいことがあるかもしれません。その場合は、以下のCSSを使用します。

```css:css
body {
    overflow-y: hidden;
}
```
## 追加の対策方法
上記のCSSを追加しても効果がない場合は、以下のように-webkit-overflow-scrollingプロパティを追加してみてください。これにより、モバイルブラウザでのスクロールの滑らかさを制御することができます。

```css:css
html {
    overflow-x: hidden;
    -webkit-overflow-scrolling: touch;
}

body {
    overflow-x: hidden;
    -webkit-overflow-scrolling: touch;
}
```

## 補足情報
### 注意点:
overflow-x: hidden;を使用することで、横スクロールバーが表示されなくなりますが、内容が画面幅を超える場合には見えなくなる可能性があります。
overflow-y: hidden;は縦スクロールも無効にするため、コンテンツが画面に収まりきらない場合には注意が必要です。
### 最新のブラウザ対応:
上記のコードは主要なモダンブラウザ（Chrome、Firefox、Safari、Edge）で動作しますが、古いバージョンのブラウザではサポートされていない可能性があります。必要に応じてベンダープレフィックスを追加してください。
### 横スクロールバーが表示される場合
ヘッダーを100%に設定している場合に横スクロールバーが表示される問題を解決するには、overflow-x: hidden;を使用して横スクロールを無効にします。効果がない場合は、-webkit-overflow-scrollingプロパティを追加してモバイルブラウザでの滑らかなスクロールをサポートすることを検討してください。
CordovaとPhoneGapの関係

CordovaはHTML技術でiOSやAndroidなどのモバイルアプリを開発できるフレームワークです。

Cordovaを調べていると「PhoneGap」という言葉が時々出てきます。CordovaとPhoneGapの関係を調べて見ました。

## 概要
- PhoneGapがオープンソース化してCordovaになった
- 現在Adobeから出ている「PhoneGap」はCordovaのディストリビューションの一つという位置づけ

## PhoneGapがオープンソース化してCordovaになった

- 2009年以前に、ニトビ・ソフトウェア社が「Phonegap」として開発を開始。
- 2011/10/04、Adobeがニトビ・ソフトウェアを買収、PhoneGapはAdobeのプロダクトになった。そしてApacheにPhoneGapのソースコードが寄贈され、「Apache Cordova」となった。

## 現在Adobeから出ている「PhoneGap」はCordovaのディストリビューションの一つという位置づけ

現在も「PhoneGap」というプロダクトはAdobeから提供されています。

- PhoneGap
    - https://phonegap.com/

Cordovaの公式サイトに記載のある通り、PhoneGapはCordovaのディストリビューションの一つであるという位置づけのようです。

>https://cordova.apache.org/
>PhoneGap is the original and most popular distribution of Apache Cordova. Turn your HTML, CSS and JavaScript into an app on your device in minutes using our simple desktop and developer apps.

PhoneGapは、下記のように独自のCLIを提供しています。package.jsonをのぞいてみるとdependenciesに"cordova"があるのがわかります。

- phonegap-cli
    - https://github.com/phonegap/phonegap-cli
ゼロから始める AWS SAM 入門

# この記事で分かること 
 
* AWS Serverless Application Model (AWS SAM) の概要 
* SAM を使って API Gateway + Lambda のサーバレスな API を構築するまでの流れ

# Serverless Application Model (AWS SAM) とは  

* 簡単に言うとサーバレスな構成を作ることに特化した Cloudformation のテンプレート  
* Cloudformation と同様にリソースをひとまとめに管理 (作成 / 更新 / 削除) することができる       

# SAM を使って API Gateway + Lambda を構築してみる  
## 事前準備  
### AWS CLI を使えるようにしておく  
SAM では AWS CLI を使ってスタックの作成/更新/削除を行うので、ローカル環境で AWS CLI を実行できるようにしておく必要があります。  

1. AWS CLI の [インストーラー](https://s3.amazonaws.com/aws-cli/AWSCLI64.msi) を取得して、インストーラーの指示に従ってインストール  
2. ちゃんとインストールされたか確認（バージョン情報が返って来ればOK）  

```bash
$aws --version  
aws-cli/1.11.156 Python/2.7.9 Windows/7 botocore/1.7.14
```

### CLI 実行時の設定を config, credentials に書き込んでおく  
AWS CLI はユーザーディレクトリ配下の config, credentials を参照するため、認証情報や諸々の設定を書き込んでおきます。

1. config 設定のコマンド実行（対話式で設定）

```bash
$aws configure
AWS Access Key ID [None]: ← CLI を実行する IAM ユーザーのアクセスキー
AWS Secret Access Key [None]: ← CLI を実行する IAM ユーザーのシークレットキー
Default region name [None]: ← 好きなリージョン
Default output format [None]: ← json を設定しておけば無難
```  

※ユーザーディレクトリ配下の config, credentials を確認（設定した内容が記載されているはず）

### S3 バケットの作成  
SAM では必要なファイル一式を S3 に置く必要があるので、その置き場を先に用意しときます。  
ここでは sam-test というバケットにします。

### IAM ロールを用意  
SAM が API Gateway と Lambda と S3 にアクセスできるように IAM Role を作成しておきます。  
ここでは sam-test-role というロールにします。

## SAM のテンプレートを書く  

```yaml:template.yaml  
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: sample
Resources:
  SamSample:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler # 実行するハンドラ
      Runtime: nodejs4.3 # lambda のランタイムを書く
      Role: arn:aws:iam::1234567890:role/sam-test-role # 上の手順で作った IAM Role の Arn
      Timeout: 60 # Lambda のタイムアウト
      Events:
        GetResource: # API Gateway 側の識別子
          Type: Api
          Properties:
            Path: /test # API Gateway のリソースのパス
            Method: put # API Gateway のメソッド
```

※同じ階層に Lambda が実行するコード（今回の場合は index.js）を配置しておく必要があります。

## SAM のスタックを作る  
1 .  S3 にファイル一式をパッケージ化して配置する 

```bash
aws cloudformation package --template-file template.yaml --output-template-file template-output.yaml --s3-bucket sam-test
``` 
2 . スタックを作成

```bash
aws cloudformation deploy --template-file template-output.yaml --stack-name SamTest --capabilities CAPABILITY_IAM
```

上記のコマンドを実行するだけで、API Gateway + Lambda のサーバレスな構成がプロビジョニングされているはずです。

## 注意点  
* node.js の場合 npm のパッケージは node_modules がローカルに展開されている状態で package コマンドを実行する必要があります 
* template.yaml 内の各リソースの名前にはハイフンは使えないので注意

# 今後やりたいこと  
折角作ったので API Gateway + Lambda 構成のアプリケーションを作ってみて、活用してみたいです。
delveをインストールするのにハマったので備忘録


# 出力されたエラー
```zsh:
❯ brew install go-delve/delve/delve
==> Installing delve from go-delve/delve
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0-rc.1.tar.gz
Already downloaded: /Users/ikezawa-ryota/Library/Caches/Homebrew/delve-1.0.0-rc.1.tar.gz
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.cfg -extensions codesign_reqext -batch -out dlv-cert.cer -keyout dlv-cert.key
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dlv-cert.cer
Last 15 lines from /Users/ikezawa-ryota/Library/Logs/Homebrew/delve/02.sudo:
2017-10-02 09:38:44 +0900

sudo
security
add-trusted-cert
-d
-r
trustRoot
-k
/Library/Keychains/System.keychain
dlv-cert.cer

dlv
If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/go-delve/homebrew-delve/issues

These open issues may also help:
Upgrade to delve fails https://github.com/go-delve/homebrew-delve/issues/20
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain. https://github.com/go-delve/homebrew-delve/issues/19
Mac install error, OS version 10.12.6, go version go1.8.3 https://github.com/go-delve/homebrew-delve/issues/17
The specified item could not be found in the keychain https://github.com/go-delve/homebrew-delve/issues/16
Issue updating to 0.12.2 https://github.com/go-delve/homebrew-delve/issues/12
dlv-cert: no identity found https://github.com/go-delve/homebrew-delve/issues/1
Executable does not get installed on MacOS https://github.com/go-delve/homebrew-delve/issues/18
deps: do not install go if it's available on the system https://github.com/go-delve/homebrew-delve/issues/9
Mac install Error https://github.com/go-delve/homebrew-delve/issues/3
Mac install Error https://github.com/go-delve/homebrew-delve/issues/7
```


keychainが問題っぽいのは察したので、調べてみる。


# 手順
下記手順でインストールできました。

```zsh:
❯ cd $HOME/Library/Caches/Homebrew
❯ ls delve*
delve-1.0.0-rc.1.tar.gz
❯ tar xf delve-1.0.0-rc.1.tar.gz
❯ sh scripts/gencert.sh
❯ brew install go-delve/delve/delve
```

# 確認
```zsh:
❯ dlv version
Delve Debugger
Version: 1.0.0-rc.1
Build:
```

# Refereneces
https://github.com/go-delve/homebrew-delve/issues/20
https://github.com/go-delve/homebrew-delve/issues/19
pythonからtesseractを使った場合のUnicodeDecodeError: '文字コード' codec can't decode byte 0x81 回避

# <i class="fa fa-cogs"></i> 検証環境

* Python 2.7 (WinPython-32bit-2.7.10.3)
* Spyder 3.0.0 (同梱)
* pytesseract 0.1.7
* Tesseract-OCR 3.02
* Windows7

# 症状

```:エラー
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 44: character maps to <undefined>
```

`'charmap'`
は設定したデフォルトエンコーディング。
デフォルトではascii。いろいろいじって、utf-8、cp1252(charmap)に変更しても同様のエラーが出ていた。

## コード

```py

# -*- coding: utf-8 -*-

import sys
# ↓試行錯誤の跡。なくてもasciiでエラー
sys.setdefaultencoding('cp1252')

import pytesseract
pytesseract.tesseract_cmd = 'パス\tesseract.exe'

from PIL import Image
img = Image.open('images/test.png')

txt =  pytesseract.image_to_string(img)

```

# 回避策

utf8やcp1252ではなくsjisなcp932を指定する。

```py

# -*- coding: utf-8 -*-

import sys
sys.setdefaultencoding('cp932')

import pytesseract
pytesseract.tesseract_cmd = 'パス\tesseract.exe'

from PIL import Image
img = Image.open('images/test.png')

txt =  pytesseract.image_to_string(img)

```

pytesseractも内部的にはsubprocessを使っているようなので、おそらく直接呼んでも同じ。

# 参考

* [Python スクリプト実行時に UnicodeDecodeError が出る場合の対処方法 - Over&Out その後]

`UnicodeDecodeError: 'ascii' codec can't decode`
で検索。
エラーが変わったのでエンコードを弄ることに。

* [pythonの日本語 - $Recycle.Bin]

>コマンドプロンプトの文字コードはcp932(ほとんどsjisと同じもの)なので、普通はsjisに変換してprintしてくれます。

cp1252でだめだったので一縷の望み。

* [つまみがなければ鼻でもつまむ:python defaultencodingがevilな感じ - livedoor Blog（ブログ）]
* [python - AttributeError: 'module' object has no attribute 'setdefaultencoding' - Stack Overflow]

`AttributeError: 'module' object has no attribute 'setdefaultencoding'`
relaodするとSpyderの標準出力コンソールが変わる、ように見える。(実行コンソールと出力コンソールが別になったのでprintデバッグからVariable explorerで返り値確認した)

[pythonの日本語 - $Recycle.Bin]:http://d.hatena.ne.jp/etudeno186/20131024

[Python スクリプト実行時に UnicodeDecodeError が出る場合の対処方法 - Over&Out その後]:http://d.hatena.ne.jp/shu223/20111201/1328334689

[つまみがなければ鼻でもつまむ:python defaultencodingがevilな感じ - livedoor Blog（ブログ）]:http://blog.livedoor.jp/kaz0215/archives/51124286.html

[python - AttributeError: 'module' object has no attribute 'setdefaultencoding' - Stack Overflow]:https://stackoverflow.com/questions/28127513/attributeerror-module-object-has-no-attribute-setdefaultencoding
転置行列をTeXでタイピングする時に悩むこと

<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML"></script>

#　本日は

転置行列を記述するには・・・．これがモチベーションです．
（この記事はかきかけの記事です．）

# 左上？右上？
多くの人は行列 $X$ に対しての転置の表記は ${}^{t}\\!X$ や $X^{\mathrm{T}}$ に相当するものをみたことがあるでしょう．最初に線形代数を勉強した時は左上に $t$ をつける本で勉強したので私は左上派です．右上の場合，例えば　$X^{\mathrm{T}}$　にしたときに，$X$ を転置した行列のべき乗を書かなければいけない場面で悩みのタネになるから避けたい気もします．転置の記号を右上にする場合は $（X^{\mathrm{T}})^n$ としたい.$X^{n\mathrm{T}}$　だと $nT$ 乗と混同しそう．右上を使う人の分野では転置行列のべき乗を使う機会がないからそこまで不便でないのかもしれない．文献で左上の場合 ${}^{t}\\!X^n$ で良さそうだし．そもそも転置の記法に$X^T$のように T をイタリック体で書いても良いものなんだろうか・・・．他に`\mathsf{T}`つまり$\mathsf{T}$を用いたり`\top`つまり$\top$を用いる流儀もありますね．

海外での議論
[What is the best symbol for vector/matrix transpose?](https://tex.stackexchange.com/questions/30619/what-is-the-best-symbol-for-vector-matrix-transpose)

これに関してはあとで．（追記する形で続く）
jsdoでMK-80

#概要
jsdoでMK-80やってみた。

#参考にしたページ
http://hp.vector.co.jp/authors/VA016157/mk80web02/mk80web.html
#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/C/J/0CJb.jpg?t=1506817494)
#成果物
http://jsdo.it/ohisama1/0CJb
demoの起動

```
8 0 0 0 adrset run
``` 

以上
MacのDocker/minikubeでズレた時刻を直すワンライナー

# 結論

以下のコマンドをホストのMacのターミナルで叩くと直る。

Docker for Macの場合:

```
docker run --rm --privileged alpine hwclock -s
```

minikubeの場合：

```
minikube ssh -- docker run --rm --privileged alpine hwclock -s
```

# 問題の概要

Docker for Macを使っているときや、minikubeを走らせている時、コンテナの時刻が大幅にずれる事象が発生することがある。Macをスリープさせると発生すると思われ、特にMacBookを使っている場合によくこの現象を目撃する(と思う)。

- [Docker for MacのIssue](https://github.com/docker/for-mac/issues/17)
- [minikubeのIssue](https://github.com/kubernetes/minikube/issues/1378)

Docker for Macのほうは上記Issueの通り、17.06からスリープ解除時に自動的に上記コマンド相当の何かを実行して修正するfixが入ったため、手動でこれを実行する必要は無くなっているはず。