はてなキーワード: webサーバーとは
日本ではほぼ注目されていない言論の自由論争「GabによるMastodon参入問題」がついに本格化した。
Gabはこれまで北米のオルタナ右翼の巣窟と化し、ユダヤ教礼拝所襲撃の予告へ使われた結果、AppleやGoogleのプラットフォームやWebサーバー関連企業から締め出されるという問題を起こしていた。
「言論の自由」は尊いが、極右SNS「Gab」の存続は許されない
https://wired.jp/2018/11/02/gab-offline-free-speech-alt-right/
これらの締め出しによりGabはフォークすることが自由であるコピーレフトなAGPLライセンスで提供されるMastodonへ参入を表明するという施策を打ち出す。
それへ対してMastodon創始者のEugen Rochkoは不快感を示しMastodonコミュニティーとして声明を発表した。
Statement on Gab's fork of Mastodon
https://blog.joinmastodon.org/2019/07/statement-on-gabs-fork-of-mastodon/
しかしこのEugen Rochkoによる声明は一部に誤りがある。
Most servers in the fediverse are already blocking the Gab domains
分散SNSサーバーが形成するFediberseネットワークの殆どのサーバーはGabをブロックしていないのである。
そもそもGabがMastodonをフォークすることが判明した際、まずEugen RochkoはMastodon自体へGabをブロックする機能を追加しようとした。
しかし、これはAGPLライセンスの元で提供されている自由なMastodonには相応しくない判断としてMastodonコミュニティーはEugen Rochkoの提案を棄却した。
GabをブロックするかどうかはMastodonを含んだ各々の分散SNSサーバー管理者が判断すべきことであり、既にMastodonにはドメインブロックの仕組みがあるので、各々の分散SNSサーバー管理者の判断でGabをブロックすべきだと反論されてしまったのだ。
Eugen Rochkoはこの反論を渋々了承し、今度は「MastodonクライアントアプリへGabをブロックする仕組みを導入しよう」とMastodonクライアントアプリ製作者たちへ対して提案した。
これもまた前述したAGPLの兼ね合いの反論が起きたが、一部のMastodonクライアントアプリ製作者は協調しGabをドメインブロックした。
そして実際にMastodonフォークのGabがデプロイされていることを確認したEugen RochkoがMastodonコミュニティーとして出した声明が前述の「Statement on Gab's fork of Mastodon」である。
誤りがあると指摘した部分もそうであるが、Mastodonコミュニティー全体はこの声明に同意していない。
Eugen RochkoはGabを憎むあまりAGPLとしては踏み込みすぎた発言を繰り返しており、度々非難されているのだ。
各々で違うルールが運用されている分散SNSサーバーが形成するFediverseネットワークには統一したルールはなく、当然ながら統一した意思というのも存在しない。
コピーレフトなAGPLライセンスのMastodonをフォークしたGabはFediverseネットワークへ自由に参入することが認められているし、Fediverseネットワークで(現地法令に違反しない限りは)自由な発言も認められている。
Eugen RochkoがGabへ対して不快感を示すのは非常に理解できるが、Eugen RochkoがしようとするGabへの対策がMastodonを含んだ分散SNSの自由を脅かすものになってしまっているのが問題である。
MastodonとGabの問題は「自由を守るため自由を脅かす可能性がある」というリベラリズムにとって非常に興味深い現象に発展している。
時間 | 記事数 | 文字数 | 文字数平均 | 文字数中央値 |
---|---|---|---|---|
00 | 126 | 17429 | 138.3 | 39 |
01 | 87 | 15637 | 179.7 | 55 |
02 | 46 | 4886 | 106.2 | 73.5 |
03 | 34 | 7349 | 216.1 | 56 |
04 | 22 | 4164 | 189.3 | 49 |
05 | 17 | 3537 | 208.1 | 65 |
06 | 12 | 1789 | 149.1 | 45 |
07 | 44 | 3339 | 75.9 | 33 |
08 | 59 | 7214 | 122.3 | 39 |
09 | 53 | 5642 | 106.5 | 41 |
10 | 76 | 7994 | 105.2 | 39.5 |
11 | 77 | 6725 | 87.3 | 34 |
12 | 87 | 7355 | 84.5 | 60 |
13 | 61 | 6923 | 113.5 | 38 |
14 | 59 | 12106 | 205.2 | 39 |
15 | 62 | 23605 | 380.7 | 42.5 |
16 | 69 | 5024 | 72.8 | 26 |
17 | 151 | 12090 | 80.1 | 35 |
18 | 130 | 8479 | 65.2 | 37.5 |
19 | 99 | 10441 | 105.5 | 39 |
20 | 78 | 8176 | 104.8 | 36.5 |
21 | 95 | 6100 | 64.2 | 31 |
22 | 142 | 16071 | 113.2 | 37 |
23 | 202 | 21729 | 107.6 | 34 |
1日 | 1888 | 223804 | 118.5 | 38 |
人(165), 自分(157), 今(98), 増田(82), 話(70), あと(59), 必要(58), 好き(55), 感じ(53), 人間(53), 前(51), 仕事(50), 日本(48), 意味(45), 関係(43), 男(42), 女(41), 時間(41), 気(40), ー(38), 普通(38), 相手(38), 子供(38), 今日(37), 問題(37), ネット(36), 絶対(36), 言葉(35), 他(34), 場合(33), 女性(33), 理解(33), 最初(33), 金(33), 嫌(32), 最近(32), 社会(31), 頭(30), 結果(30), 親(30), 理由(30), 目(29), 結婚(28), 全部(28), しよう(28), 無理(27), ダメ(26), 逆(25), たくさん(25), 別(25), 昔(25), 状態(24), じゃなくて(24), 世界(24), お金(24), 気持ち(24), 一番(24), 他人(24), 本人(23), しない(23), 嫌い(23), アニメ(23), 生活(22), 評価(22), ゲーム(22), 男性(22), 時代(22), 存在(21), 体(21), 大事(21), 状況(20), 作品(20), 方法(20), 情報(19), 一人(19), バイト(19), 興味(19), 会社(19), 誰か(19), 努力(19), では(19), 全て(19), レベル(19), クズ(18), 説明(18), 大変(18), 周り(18), 本(18), 人生(18), 全員(18), 家(18), 社員(18), 絵(18), おっさん(18), バカ(18), 結局(18), 文化(18), 映画(17), 経験(17), 自由(17), 塾(17), 勝手(17), 正直(17), オタク(17), 内容(17), 名前(17), 価値(17), 手(17), 病気(17), 朝(17)
増田(82), 日本(48), じゃなくて(24), 可能性(16), 元増田(13), いない(13), トラバ(12), 多様性(11), キモ(11), スマホ(11), 価値観(10), 自由意志(10), なんの(10), ブログ(10), フランス(10), 東京(10), 2018年(10), ワイ(9), SNS(9), わからん(9), …。(9), なんだろう(9), ネオリベ(9), ブクマ(8), 過労死(8), 基本的(8), アメリカ(8), マウンティング(8), ツイッター(8), なのか(8), 10年(8), 牛丼(8), 普通に(8), イヤホン(8), A(7), 自己肯定感(7), マジで(7), ガチ(7), 自動運転(7), アプリ(7), キチガイ(7), -2(7), a(6), 笑(6), 積極的(6), s(6), いいんじゃない(6), localhost(6), 何度(6), hatena(6), ダイバーシティ(6), 発達障害(6), 涙(6), 個人的(6), OK(6), Ubuntu(6), プレイ(6), イケメン(6), フェミ(5), 1年(5), である(5), とはいえ(5), AI(5), 自己責任(5), ディストピア(5), 自分自身(5), tbsradio(5), 分からん(5), 2017年(5), 書き起こし(5), 2回(5), 若い人(5), 大阪(5), goo.gl(5), ブコメ(5), twitter(5), 関係者(5), 栄光ゼミナール(5), 30分(5), 過去最低(5), 一日(5), paypay(5), Session(5), ウザ(5), マクロン(5), ありません(5), 81%(5), 保護者(5), はてなー(5), 永田(5), ドイツ(5), 1回(5), E3(5), 中国(5), .s(5), 荻上(5), はてブ(4), 至上主義(4), 被害者(4), 学生時代(4), いいね(4), 娘(4), 大企業(4), 人権侵害(4), items(4), AB(4), 自分たち(4), 風俗嬢(4), あいつら(4), KKO(4), 毎日(4), aXvn(4), Windows(4), サイコパス(4), ASD(4), 低能先生(4), にも(4), 関東(4), 人間関係(4), ヒトラー(4), 何回(4), 韓国(4), X(4), いいじゃない(4), qiita(4), 名古屋(4), 2ch(4), 1日(4), アラサー(4), Chrome(4), E(4), 一般的(4), 上の(4), かもしれん(4), 経済的(4), オチ(4), まとめサイト(4), AA(4), あるかな(4), B(4), ゲートウェイ(4), 自己満足(4), 影響力(4), コスパ(4), ラノベ(4), 2時間(4), 上場企業(4)
過去最低(5), 永田(5), 栄光ゼミナール(5), 紅生姜(4), マクロン(5), のこぎり(4), 荻上(5), 絵の具(3), 望(3), 白地(3), パイパイ(3), 自由意志(10), 暴動(8), 塾(17), 過労死(8), 牛丼(8), イノベーション(6), イヤホン(8), 皿(11), ケア(6), ネオリベ(9), 整形(9), 教室(9), 自己肯定感(7), 日曜(6), アクセス(12), そうした(9), 多様性(11), 介護(10), 遠い(8), マウンティング(8), 調査(10), 初期(8), 勤務(10), デート(11), バイト(19), ごめんなさい(8)
■過労死を出した栄光ゼミナールがどうなっちゃってんのか書いておく /20181208225303(20), ■ /20181208233617(19), ■ /20181209144856(14), ■『帰ってきたヒトラー』みたいな映画を日本で撮るなら /20181208220445(12), ■チャリに乗ってイヤホンは本当に悪いのか? /20181208120626(10), ■結婚を考えてる相手が姓を捨てたくないと言ってきたら /20181208131726(9), ■増田ってひねくれた略称だよね /20181209110804(7), ■整形ってなんで忌み嫌う対象なんだろう? /20181209164235(7), ■「死にたい」にかける言葉 /20181209013103(7), ■尿道がズキズキする /20181209001114(6), ■カップヌードルに水を入れてしまった時の絶望感 /20181208175842(6), ■母はどうにも察しが悪い /20181209120616(5), ■プログラミングの勉強ってどうやんの /20181209183335(5), ■漫画が原作だけどアニメの方が面白い作品 /20181209000244(5), ■婦人系の病気をどこまで男性上司に伝えるべきか /20181209002118(5), ■窃盗症と自由意志に関する疑問 誰か教えて /20181209233033(4), ■アニメが嫌いなのは声優の演技がうざいから /20181209125120(4), ■石橋容疑者とダイバーシティ /20181208164423(4), ■[勉強] UbuntuでWebサーバー構築を断念 /20181209225349(4), ■欧米人がヒトラーを憎んでいる理由がわからない /20181209013347(4), ■乳首の皮膚がボロボロ取れるんだが /20181209234607(4), ■作品のタイトルの付け方が分からん /20181209012700(4), ■Wi-Fiはタダで使えると思っている奴多すぎ問題 /20181206214612(4), ■ズブズブの関係 /20181209215113(4), ■もうすぐ大学受験を控えてるんだけど /20181209192410(4), ■やりたいことが出てこない /20181209001258(4), ■犬猫は飯食っただけで褒められる /20181208203002(4)
5863519(3931)
会社でどんな影響がでるのか調べてみたので、メモしておきます。
・チャイム
40年ものの機材。始業と昼休みと終業を告げるチャイムを車内に鳴らす。放っておいても1か月に5分進む微妙な精度。サマータイムボタンはもちろん付いていないので、手動で調整する必要がある。
・FAX
時計が入っていて、タイムスタンプが入るよね。あれはあまりいじったことないけど、サマータイム機能とかなさそう。海外展開していたら、ありそうだけど、日本仕様は機能をデチューンしてそう。
UTC時を基準に動いているので、対応は可能。現在の日本ではサマータイムがないので、タイムゾーンを東京・大阪あたりを選ぶとサマータイム機能がオフになるようになっている。正式にサマータイムが決定して、windowsアップデート後にサマータイム機能が利用可能になる。
・携帯電話
いわゆるガラケー(ガラパゴス携帯)は、一応、電波で時計の調整がかかっているので、キャリアが対応すれば、勝手に変わりそうな気がする。スマホもOS自体は対応してそう。アプリは開発者ごとに国際化対応を考えていたかどうかなんだろう。
電波の元が調整したら勝手に変わるのか。テストしたことなないだろうから、実際に発動させたら大変そう。
サマータイムボタンはもちろん付いていないので、手動で調整する必要がある。
これが厄介。開始時間にバーコードを読み、さらに終了時間にバーコードを読むようなプログラムの場合、通常時間からサマータイムに変更されるタイミングにかかったときに正しい経過時間が記録されない恐れがある。多分、夜中に行うのであれば、いまのところ影響は回避できそう。24時間操業のところだと困りそう。サーバーは、そのまま放っておくというのも手のような気がした。記録を引きだす必要があるときに変換するとか、解釈するというのが現実解かも。
・予定表プログラム
同じ時間が2回くるタイミングと2時間飛ぶタイミングはどう表現しようか。深夜のことなので、寝ているだろうからスルーしていいのだろうか。切り替えタイミングのときに例外処理をいれたほうが親切かな。現時点では同じ数え方で時間が経過することを前提に描画しているので、サマータイムによる時刻の変更は想定していない。実際にない制度のことを想定してコストをかけても誰もお金を払ってくれないよね。
サマータイムの初日は、夜勤の後の朝の交代の人は2時間早くくるのか。サマータイムの終わりの日は、2時間残業しないと次の交代の人がこないのか。
クローン病ではありませんが、もと潰瘍性大腸炎持ちです。21歳で発病し、当初はほぼ一日中トイレ行って横になっての繰り返し。トイレでは排泄するたびに激痛が走るし便器が血で真っ赤に染まるし結構つらかった思い出が有ります。
就職活動では工場見学が一番きつかったです。漏らさないように全力で尻に力入れてたのをよく覚えています(会社には病気の事は言わず、結局合格して今の会社に就職しました)。
就職後は会社の方針で工場に配置されましたが、やはりちょくちょくトイレに行くのでたまに叱られました。これは迷惑かけてるのは事実なので謝るしかないと思います。ただ、比較的寛大な職場なので病気のことを話すとそれなりに理解はして頂けました。
工場で働きながら夜はプログラミングやネットワークの勉強をし、約1年したところで情報システム部の人の目に留まってそっちに引き抜いてもらいました。他の方も言っておられると思いますが、IT関連は
・自分のペースで仕事ができる。途中トイレ行っても別いにいいし、期限までに終わればいい。
という意味でお勧めです。IT関連の職場では情報系を卒業した学生を雇ってみたものの、全く基礎ができていなかったということが度々ありますし、それだったらちょっとでも実践で役立つ能力を持っている人のほうがずっと喜ばれます(自作アプリなど実力を証明できるものを持って面接に臨めると最強ですね)。
また、IT以外でも、こういう病気の人は単独でできる仕事、自由にトイレに行ける仕事を模索することをお勧めします。それ以外だと精神的プレッシャーがきつすぎます。
IT部門に移動してからも仕事中にしょっちゅうトイレに行っていましたが期限は守って仕事をしていたので、それについて何かを言われることはありませんでした。
また、年に一回程度、複数人の社員で遠くに出張に行く必要が有りましたが、現地まで単独行動することをお願いして切り抜けました。
さらに数年に一回社長同行出張というウルトラ級のイベントが発生しましたが、前日から何も食べないなどして切り抜けました。それでも出血のためにトイレに行ったりして怒られたりしましたが。
IT系にも色々な職種が有りますが、独学でも学習しやすく実践で役に立ちやすいオープンソース系を勉強するといいと思います。私はLinuxでWebサーバーやメールサーバーを見よう見まねでセットアップするところから始め、RubyやPHPなどのプログラミング言語をこれまた見よう見まねで勉強しました。後にiPhoneアプリなども勉強して習得しました。
1年くらい勉強してようやくなんとなくできるようになったかな~と感じたころに情報システム部から声がかかりそちらに移動になりました。声がかかったのはそっちの部署の詳しい人に色々質問したりしてたからだと思います。
また、最低一台はパソコンが必要というハードルが有りますが、そこさえ超えればソフトウエアは基本無料で手に入るのでやる気さえあれば比較的お金をかけずに勉強できる分野だと思います。
就職したのが22歳の時で、現在42歳になりますが、今はすっかりよくなってほぼ普通に毎日を送れています。
クローン病は潰瘍性大腸炎よりずっと辛いだろうなと思いますし、私の経験談が役に立つかはわかりませんが、元増田さんが平穏な毎日を取り戻されることを祈っています。
まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ。
一日8時間勉強時間があるなら、だいたい一ヶ月で終わる内容。
月額1000円だけどしっかり勉強すれば一ヶ月の無料期間中に終わると思う。
もともとN高等学校のノンプログラマーの生徒をWebエンジニアとして就職させるために作られたカリキュラムで講師曰く去年はこれで二人エンジニア就職を決めたらしい。
内容も相当親切に説明していて、プログラミングで何か作るだけじゃなくて、就職に必要な環境構築やセキュリティまでみっちりやる。
で講師が書いてる入門コースで習うことがまとめ。テキスト教材もあるけど授業も1項目を2時間で説明している。授業は週2の生放送とそのアーカイブがある。
↓みたいなことが学べる
----
Web ブラウザとは (Chrome, デベロッパーコンソール, alert)
はじめてのHTML (VSCode, HTML, Emmet)
さまざまなHTMLタグ (h, p, a, img, ul, tableタグ)
HTMLで作る自己紹介ページ (HTMLタグ組み合わせ, コンテンツ埋め込み)
はじめてのJavaScript (JS, ES6, エラー)
JavaScriptでの計算 (値, 算術演算子, 変数, 代入)
JavaScriptで論理を扱う (論理値, 論理積, 論理和, 否定, 比較演算子, if)
JavaScriptのループ (ループ, for)
JavaScriptのコレクション (コレクション, 配列, 添字, undefined)
JavaScriptの関数 (関数, 関数宣言, 引数, 戻り値, 関数呼び出し, 再帰)
JavaScriptのオブジェクト (オブジェクト, モデリング, プロパティ, 要件定義)
はじめてのCSS (CSS, セレクタ, background-color, border)
CSSを使ったプログラミング (transform, id, class)
Webページの企画とデザイン (企画, 要件定義, モックアップ, 16進数カラーコード)
診断機能の開発 (const, let, JSDoc, インタフェース, 正規表現, テストコード)
診断機能の組込み (div, 無名関数, アロー関数, ガード句, truthy, falsy)
ツイート機能の開発 (リバースエンジニアリング, URI, URL, URIエンコード)
LinuxというOS (VirtualBox, Vagrant, Ubuntuのインストール, OS, CUIの大切さ)
コンピューターの構成要素 (ノイマン型コンピューター, プロセス, lshw, man, ps, dfの使い方)
ファイル操作 (pwd, ls, cd, mkdir, rm, cp, mv, find, ホストマシンとの共有ディレクトリ)
標準出力 (標準入力、標準出力、標準エラー出力、パイプ、grep)
vi (vimtutor)
シェルプログラミング (シバン, echo, read, 変数, if)
通信とネットワーク (パケット, tcpdump, IPアドレス, TCP, ルーター, ping)
サーバーとクライアント (tmux, nc, telnet)
HTTP通信 (http, https, DNS, hostsファイル, ポートフォワーディング)
GitHubでウェブサイトの公開 (GitHub, リポジトリ, fork, commit, 情報モラル)
イシュー管理とWikiによるドキュメント作成 (Issues, Wiki)
GitとGitHubと連携 (git, ssh, clone, pull)
GitHubへのpush (init, add, status, インデックス, commit, push, tag)
Gitのブランチ (branch, checkout, merge, gh-pages)
Node.js (Node.js, nodebrew, Linux, REPL, コマンドライン引数, プルリク課題)
集計処理を行うプログラム (集計, 人口動態CSV, Stream, for-of, 連想配列Map, map関数)
アルゴリズムの改善 (アルゴリズム, フィボナッチ数列, 再帰, time, プロファイル, nodegrind, O記法, メモ化)
ライブラリ (ライブラリ, パッケージマネージャー, npm)
Slackのボット開発 (slack, mention, bot)
HubotとSlackアダプタ (hubot, yo)
モジュール化された処理 CRUD, オブジェクトライフサイクル, filter)
ボットインタフェースとの連携 (モジュールのつなぎ込み, trim, join)
同期I/Oと非同期I/O (同期I/O, 非同期I/O, ブロッキング)
例外処理 (try, catch, finally, throw)
HTTPサーバー (Web, TCPとUDP, Webサーバーの仕組み, Node.jsのイベントループ, リスナー)
HTTPのメソッド (メソッド, GET, POST, PUT, DELETE, CRUDとの対応)
HTMLのフォーム (フォームの仕組み, form, input)
HerokuでWebサービスを公開 (Webサービスの公開, heroku, dyno, toolbelt, login, create, logs)
認証で利用者を制限する (認証, Basic認証, Authorizationヘッダ, ステータスコード)
Cookie を使った秘密の匿名掲示板 (Cookie, Set-Cookie, expire)
UI、URI、モジュールの設計 (モジュール設計, フォームのメソッド制限, リダイレクト, 302)
フォームによる投稿機能の実装 (モジュール性, textarea, 303)
認証された投稿の一覧表示機能 (パスワードの平文管理の問題, 404, テンプレートのeach-in)
データベースへの保存機能の実装 (データベース, PostgreSQL, 主キー)
トラッキングCookieの実装 (トラッキング Cookie, IDの偽装, Cookie の削除)
削除機能の実装 (データベースを利用した削除処理, 認可, サーバーサイドでの認可)
管理者機能の実装 (Web サービスの管理責任, 管理者機能の重要性)
デザインの改善 (Bootstrap, レスポンシブデザイン, セキュリティの問題があるサイトを公開しない)
脆弱性 (脆弱性, 脆弱性で生まれる損失, 個人情報保護法, OS コマンド・インジェクション)
XSS脆弱性の対策 (XSS, 適切なエスケープ処理, リグレッション)
パスワードの脆弱性の対策(ハッシュ関数, メッセージダイジェスト, 不正アクセス禁止法, パスワードジェネレーター, 辞書攻撃)
セッション固定化攻撃脆弱性の対策 (セッション, セッション固定化攻撃, ハッシュ値による正当性チェック)
より強固なセッション管理 (推測しづらいセッション識別子, 秘密鍵)
安全なHerokuへの公開 (脆弱性に対する考え方, HTTPの廃止)
Webフレームワーク (Express.js, フレームワーク導入, 簡単なAPI, セキュリティアップデート, Cookie パーサー, ミドルウェア, 外部認証, ロガー)
ExpressのAPI (app, Properties, Request, Response, Router)
GitHubを使った外部認証 (Passport, OAuth)
テスティングフレームワーク (Mocha, レッド, グリーン, リファクタリング)
継続的インテグレーション (CircleCI)
クライアントのフレームワーク (Webpack, Chrome 以外のブラウザでもES6)
DOM操作のフレームワーク (jQuery, jQueryアニメーション, this)
AJAX (jQuery.ajax, クロスドメイン, 同一生成元ポリシー, x-requested-by, CORS)
WebSocket (WebSocket, WebSocketの状態遷移, Socket.io)
RDBとSQL (DDL, DCL, CREATE, DROP, INSERT, DELETE, UPDATE, WHERE)
テーブルの結合 (外部結合, 内部結合, 片側外部結合, JOIN ON)
インデックス (インデックス, 複合インデックス, Bツリー)
集計とソート (SUM, COUNT, ORDER BY, GROUP BY)
「予定調整くん」の設計 (要件定義、用語集、データモデル、URL設計、モジュール設計、MVC)
認証とRouterモジュールの実装 (Mocha, supertest, passport-stub, モックテスト)
予定とユーザーの保存 (セキュリティ要件, UUID, 複合主キー)
予定とユーザーの一覧の表示 (非同期処理, Promise, then)
出欠とコメントの表示 (入れ子の連想配列, Promise.all, 子どもからデータを消す)
今はAtom 330+ION+SST-SG05B+SSD+HDD+TVチューナーの構成。
ケース新調&SATAポート追加&OS入れ替えの必要が出てきたので、新調することにした。
パーツ | 名称 | 価格 | 備考 |
---|---|---|---|
マザーボード | ASRock H270M-ITX/ac | ¥13,760 | H270M, Mini-ITX, SATA最多 |
CPU | Celeron G3930T | ¥4,220 | 最小TDPで最安のもの |
CPUクーラー | サイズ 風神スリム | ¥3,674 | ロープロファイル, 汎用12cmファン |
メモリ | Team TED48GM2400C16DC01 | ¥6,980 | DDR4-2400 4GB×2 |
システムドライブ | X25-M 80GB | ¥0 | SSD, 余り |
データドライブ | WD40EFRX | ¥0 | WD Red 4TB, 流用 |
バックアップドライブ | WD80EFZX | ¥32,617 | WD Red 8TB |
余りHDD | WD1003FZEX | ¥0 | WD Black 1TB。ファイル履歴・シャドウコピー用。壊れたら他のドライブから間借りする。 |
余りSSD | X25-V 40GB | ¥0 | 用途未定。キャッシュに使うにも書き込みが遅い。余りHDDが壊れた時のシャドウコピーとか。 |
電源 | Corsair RM650x 650x | ¥12,917 | 260Wまでファンレスで動くATX電源 |
ケース | Lian-Li PC-Q25B | ¥19,830 | ファイルサーバーに適したケース |
ファンコントローラ | GRID+ V2 | ¥4,280 | Windowsから制御できるファンコン |
TVチューナーー | PX-W3PE Rev1.3 | ¥0 | 地上波2ch, 流用 |
合計 | ¥98,278 |
現在大学の中でOrarioのアクセスがどうこうという問題が起きているようだが、
ひとまずこの記事については、下記URLにある、京都大学の専門家であらせられる記事について、一人歩きしてる感があるので、
もう少し彼のような上流側(という表現で良いかどうかは不明だが)の専門家ではなく、
下流でプログラムをガッツリ書いているほうの専門家として私(匿名で失礼)が纏めたいと思う。
https://srad.jp/~yasuoka/journal/611343/
Orarioの芳本大樹が書いた『時間割アプリの「Orario」の特性と安全性について』(2017年4月17日)という文書を読んだ。このOrarioは、京都大学のKULASISにずっと不正アクセスを繰り返していて、正直なところ私(安岡孝一)としてはアタマに来ていたのだ。
Orarioの特性と安全性について、本当にスクレイピング技術をクライアント端末側で行っているのであれば、
この部分は間違いではないと私(匿名で失礼)は考えている。
この部分の書き方、実に大学教授らしい逃げ道を多く用意していて。
KULASISにずっと不正アクセスを繰り返していて
上記発言、これは本来「開発時の検証段階」の話をしているのであれば「正解」、である。
逆に今のOrarioの通信についてを不正アクセスとしているのであれば「正解ではない」、である。
何せ、開発者が勝手にアカウントを使って入り込んで様々な検証を行う必要があるため、
KULASISサーバに対してクラッキング/ハッキングを行って根こそぎどうこうしたなどという大がかりな不正アクセスではなく、
あくまで大学側が定める規約規則から若干外れた使われ方がされているという意味の不正アクセスである。
(そもそもスクレイピングなんて技術を使う連中はID/PASSWORDがない状態でのサーバへの不正アクセスなどできない
開発時は「京大のKULASISアカウントをもったユーザが開発に携わっていないのであれば」押し出してきている京大の規約によれば、不正アクセスにあたるのかもしれない。
個人的には当たらないと感じるが。
京大の規定に定められたユーザが「特定のブラウジングツール(Orario)」により、
KULASISにアクセスしているのだからアクセスとしては不正ではない。
本当にスマートなWebスクレイピングで行われているのであれば、Webブラウザと全く同じ動きをするはずで、
それを不正アクセスと断罪してOrarioは不正というのは表現が汚いと考える。
これはコメント欄にもあるが、
https://srad.jp/comment/3196554
また、ChromeやSafari(及びその他マイナーなWebブラウザ)なども御校のWebサーバーよりコンテンツデータを取得し、HTMLを構文解析し画面表示を行っていますが、これらはセキュリティポリシーには適合しているのでしょうか?
ご大層にはっておられるリンクを流し読みをする限り、そんな厳格に何かを定めているわけではないように思われる。
それ故、実際にOrarioがスマートフォンによるスクレイピングを行っているのであれば、
Webブラウザの一種とも言えなくはない為、これを不正と断ずるのは、「正しくない」だろう
京大のユーザが開発に携わったかを証明できない以上、彼にとっては不正なのかもしれないが、
ここでそれをOrarioは不正アクセスと断ずる論理性が私(匿名で失礼)にはわからない。
他にもこの部分
Orarioアプリでは「Webオートメーション(Webスクレイピング)」と呼ばれる技術を用いています。この技術により、利用者様のスマートフォン(にインストールされているOrarioアプリ)に学生アカウント(大学ID・パスワード)を入力すると、自動で当該利用者様の教務用ページから時間割の生成に必要な情報のみを取得し、Orarioアプリの時間割テーブルに当該利用者様の時間割を生成・表示することができるという仕組みとなっています。
全く信用できない。少なくとも先月以前、OrarioからKULASISへのアクセスパターンを解析した限りでは、そんな風なアクセスパターンには見えなかった。嘘を書くのもいい加減にしろ。
Webスクレイピング技術に関して、なぜアクセスパターンが問題になるかが一つ疑問である。
下記のOrarioが出しているPDF(http://www.orario.jp/wp-content/uploads/2017/04/Orario%E3%81%AE%E5%AE%89%E5%85%A8%E6%80%A7%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A6%8B%E8%A7%A3.pdf)にあるように、簡単にいうならばID/Passwordを利用したPOST通信を行い、その返答値をスクレイピング(切り貼り)している。
それをアクセスパターンを解析で一体何が取れるのか?という部分が、この辺りが分かる自称専門家の私(匿名で失礼)にもさっぱりわからない。
もっというと、「そんな風なアクセスパターンには見えない」、というならば、セキュリティの観点上公開すべきではないだろうか、
逆に一体アクセスパターンを見て私(匿名で失礼)も何を行っているのかが気になるところである。
ただでさえ、不正アクセスという言葉をつかって攻撃しているわけだから、
アクセスパターンを公開して断罪すべきだし、セキュリティ観点からみても他大学との共有はすべきで、
学生に対してもその証拠を出して止めさせるべきだろう、というのが個人的見解である。
学生の求める「単位」をつかって脅しをかけている時点で、お察しだが……。
そもそも上記で述べた開発時のほぼ不正アクセスと考えられる通信についてを「アクセスパターン解析で見つけた」というのであれば理解ができるが、
現在すでにスクレイピングが確立している通信に関して、アクセスパターンでOrarioかどうかを判別するのが可能かというと何とも言えないと思う。
(ご丁寧にOrarioが通信用のUserAgentにOrarioの文字を含めているなら別だが……
(もちろん、アクセスログを見て、ログインページからWebスクレイピングしたいページへ遷移するまでの時間を取るとあまりに短すぎる、という話ならやれるかもしれないが……。
たとえKULASISが京都大学がオリジナルで開発した大学教務事務パッケージだとしてもそうだろうと考えている。
同様に日立や富士通も同じような大学教務事務パッケージがあるが、
基本ログ処理がザルでろくにuser-agentの確認もできない大学も多く存在したりすることを知ってる自分としては、
本当だろうか?嘘を書くのもいい加減にしろ? と思う。
UIが糞(システムのスマートフォン対応がノロい)だからアプリが流行るということに気づくべき。
富士通、日立にしてもそうだが、APIを提供したほうがいいのではなかろうか。
とくにKULASISだったか何だったは、京都大学謹製と聞いている(違ったら失礼
少なくとも他の大学教務事務パッケージではなかったと記憶している。
であれば、京都大学がAPIを提供し大学側で専門家を集めてOrarioを超えるものを作ってはどうか?
実際大学でこういうことをやろうにも、問題になってくるのは予算で。
教務、事務、学務、図書館、など様々な縦割りが存在し、それぞれがそれぞれの予算でそれぞれのシステムを入れている。
これが実に糞で。
一つの大きなシステムを入れ替えるとなると、横との連携をとって全ての組織の号令をとらなければならない。
ここまで問題になってくるとやはりその辺りの対応の遅さが問題なのではないかと考えている。
大学がアホ → 学生に良い物を提供したいという思いがあるならもっとフットワーク軽くしろ
教授がアホ → 曖昧な表現で、素人を先導しようとするのが見え見えで気に入らない
Orarioアホ → コメントにもあるけどやり方が汚いのは確かだから甘んじて受け入れろ
以上です
昨今話題になってるヤマトや佐川関連のブックマークが上位を占めるかと思いきや、まったく違った。
(2016年12月29日10:54時点、本文、新着順で検索)
Amazonの検索結果 (絞り込み: 3 users 以上) 約 3,423 件中 1 - 40 件目 (0.26 秒)
(以下略)
ECサイトを連想させるトピックがほとんどなくて、AmazonがB2B向けサービスを充実させていることに驚いた。
Amazonって表向きは物流業界に革命と問題を起こしている要因に挙げられているけど、EC以外のインパクトがどれだけ大きいのか門外漢なので分からない。
↑でブクマ付けた人、何が起きるのか教えて
Web対応させるには別のエンジニアグループが必要だろうから、ライン違うし気持ちもわかるのだが。
かのバファロ先生の無線LAN親機でも同じ始末である。で、設定ツールというから何かと思えば、結局デフォルトゲートウェイのWebサーバーに遷移させるだけだった。
みたいな。
いらん!ちゅーねん。
元々海外にいたのだが別にたまたまバファロを例に出したけど、日本のメーカーの作るIT機器(プリンタとかも)は、無用なものが多すぎる。
ただこれと同時にマジョリティのそれほどパソコン詳しくない人たちにはここまでしてあげないと、使ってくれない、買ってくれないんだろうなーとも思ってる。
いやはや。
私の持てる知識を絞り出してなんとか完成しました。
**************************************************************************************
完成したサイトがこちらです。
LapyNetニュース
**************************************************************************************
私は普段webとは関係ない仕事してます。なんとか休日を利用して、
メインのコードはこんな感じ
----------------------------------------------------------------------------------------------------------------------
App::uses('Sanitize', 'Utility'); class RssfeedsController extends AppController { public $helpers = array('Html','Form','Session','Number','Cache'); public $uses = array( 'Rssfeed', 'Tweet', 'Wadai', 'Rank', 'Oracle' ); ************************************************************************************** public function index() { $title_for_layout = "LapyNetニュース"; $content = "Hello World!!"; $this->set(compact('title_for_layout','content')); if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' = > array( 'and' = > array( 'Rssfeed.time' = > $today, )), 'order' = > 'tweets desc', 'limit' = > '50' ); $this- >set('posts',$this- >Rssfeed- >find('all',$params)); $paramz = array( 'order' = > 'Rssfeed.id desc', 'limit' = > '10' ); $this->set('posts2',$this->Rssfeed->find('all',$paramz)); $paramz = $this- >Rssfeed- >query('SELECT id,title FROM rssfeeds order by id desc limit 10'); $this->set('posts2', $paramz); $parapara = $this- >Oracle- >query('SELECT id,title FROM oracles order by id desc limit 10'); $this- >set('postx', $parapara); $funking = $this- >Rank- >query('SELECT id,frank FROM ranks where creation=(select max(creation) from ranks)'); $this- >set('funking', $funking); } ************************************************************************************** public function mizuno() { $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '30' ); $recent_posts = $this->Oracle->find('all',$parapara); return $recent_posts; } ************************************************************************************** public function wadai() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 4 )), 'order' => 'tweets desc', 'limit' => '100' ); $this->set('posts',$this->Rssfeed->find('all',$params)); $this->set("title_for_layout","2CHニュース-LapyNetニュース"); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postyy',$this->Rssfeed->find('all',$paramz)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '10' ); $this->set('postyx',$this->Oracle->find('all',$parapara)); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function hot() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 3 )), 'order' => 'tweets desc', 'limit' => '20' ); $title_for_layout = "LapyNetニュース"; $this->set("title_for_layout","ニュース-LapyNetニュース"); $this->set('posts',$this->Rssfeed->find('all',$params)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '10' ); $this->set('postxx',$this->Oracle->find('all',$parapara)); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postsxxx',$this->Rssfeed->find('all',$paramz)); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function newnew() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 2 )), 'order' => 'tweets desc', 'limit' => '20' ); $this->set("title_for_layout","エンタメニュース-LapyNetニュース"); $this->set('posts',$this->Rssfeed->find('all',$params)); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postszz',$this->Rssfeed->find('all',$paramz)); $paramz = $this->Oracle->query('SELECT id,title FROM rssfeeds order by id desc limit 10'); $this->set('postszz', $paramz); $parapara = $this->Oracle->query('SELECT id,title FROM oracles order by id desc limit 10'); $this->set('postzy', $parapara); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function top() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 1 )), 'order' => 'tweets desc', 'limit' => '20' ); $this->set('posts',$this->Rssfeed->find('all',$params)); $param = array( 'conditions' => array('times > current_timestamp + interval -600 minute and Kubetu = 4'), 'order' => 'tweets desc', 'limit' => '30' ); $this->set('posts2',$this->Rssfeed->find('all',$param)); } ************************************************************************************** public function view($id = null ) { $this->Rssfeed->id = $id; //驥崎ヲ√↑荳譁・i縺励> $user = AuthComponent::user(); $TwimStatus = ClassRegistry::init('Twim.TwimStatus'); $TwimStatus->getDataSource()->setToken(AuthComponent::user()); $statuses = $TwimStatus->tweet(); $rairai = $this->Rssfeed->read(title,$id); $alcol = $this->Rssfeed->read(); $this->set('post', $alcol); $this->set('post2', $user); $this->set('post3', $statuses); $this->set("title_for_layout",$rairai[Rssfeed][title]."-LapyNetニュース"); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '20' ); $this->set('postszz',$this->Rssfeed->find('all',$paramz)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '30' ); $this->set('postzy',$this->Oracle->find('all',$parapara)); } ************************************************************************************** public function add() { if($this->request->isPost()){ if($this->Tweet->save($this->data)) { $this->Session->setFlash('seikou'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); }else{ $this->Session->setFlash('sipai'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); } } } ************************************************************************************** public function delete($id = null) { $this->Rssfeed->id = $id; $this->set('set', $this->Rssfeed->read()); $this->redirect(array('controller'=>'tweets','action'=>'delete',$this->data['tweet']['rssfeed_id'])); } ************************************************************************************** public function oracle() { if($this->request->is('post')) { $user = AuthComponent::user(); $TwimStatus = ClassRegistry::init('Twim.TwimStatus'); $TwimStatus->getDataSource()->setToken(AuthComponent::user()); $contents1 = $this->request->data['Rssfeed']['contents']; $contents2 = $this->request->data; $statuses = $TwimStatus->tweet($contents1); if($this->Rssfeed->save($contents2)) { $this->Session->setFlash('成功です。'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); $this->redirect($this->referer()); }else{ $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); $this->Session->setFlash('失敗です。'); } } } ************************************************************************************** public function makelist() { $rssfeeds = $this->paginate(); if ($this->request->is('requested')) { return $rssfeeds; } else { $this->set('rssfeeds', $rssfeeds); } } } ---------------------------------------------------------------------------------------------------------------------- rssフィードはこんな感じです。 ---------------------------------------------------------------------------------------------------------------------- #!/usr/bin/php <?php header('Content-type: text/html; charset=UTF-8'); require_once ('/var/www/html/s/magpierss/rss_fetch.inc'); define('MAGPIE_CACHE_AGE', 60*5); define('MAGPIE_CACHE_DIR', '/var/www/html/s/cache/'); define('MAGPIE_OUTPUT_ENCODING','UTF-8'); $urls = array( '*********************************'); $items = getRssList($urls); echo '<ul>'; foreach ($items as $item) { $href = mb_convert_encoding($item['link'], "UTF-8", "auto"); $title = mb_convert_encoding($item['title'], "UTF-8", "auto"); $description = mb_convert_encoding($item['description'], "UTF-8", "auto"); $megami = mb_convert_encoding($description, "UTF-8", "auto"); ************************************************************************************** $all = 'http://urls.api.twitter.com/1/urls/count.json?url='.$href; $Rits = file_get_contents($all); $Olfe = mb_convert_encoding($Rits, 'UTF-8', 'auto'); $data = json_decode($Olfe); $tweets = $data->count; ************************************************************************************** $checkman = db_check_urls($href); $checkman2 = db_check_pr($title); $nowtimes = date('Ymd'); if($checkman == 0 &amp;&amp; $checkman2 == 0){ #$hrefs = urlencode($href); db_put_urls($nowtimes,$href,$title,$description,$tweets); echo "<li><a href=$href>$title</a><br>$megami<p>$tweets</p><p>$checkman</p></li>"; }else{ } } echo '</ul>'; ************************************************************************************** function getRssList($urls) { $rssitems = array(); foreach ($urls as $url) { $obj = fetch_rss($url); $rssitems = array_merge($rssitems, $obj->items); } return $rssitems; } ************************************************************************************** function db_check_pr($japanese){ $moji = mb_substr($japanese,0,2); if($moji == 'PR'){ return 1; }else{ return 0; } } ************************************************************************************** function db_check_urls($href){ require '/var/www/html/s/database_conf.php'; try { $db = new PDO($dsn, $dbUser, $dbPass); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'SELECT count(*) AS count FROM rssfeeds WHERE urls = :language'; $prepare = $db->prepare($sql); $languages = array($href); foreach ($languages as $language) { $prepare->bindValue(':language', $language, PDO::PARAM_STR); $prepare->execute(); $result = $prepare->fetchColumn(); if ($result > 0) { return true; }else{ return false; } } } catch (PDOException $e) { echo 'エラーが発生しました。内容: ' . h($e->getMessage()); } function h($var) { return htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); } } ************************************************************************************** function db_put_urls($nowtimes,$href,$title,$description,$tweets){ require '/var/www/html/s/database_conf.php'; try { $db = new PDO($dsn, $dbUser, $dbPass); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sikibetu = 5; $moto = "アニゲー速報VIP"; $sql = 'insert into rssfeeds (id, time,urls,title,contents,tweets,times,kubetu,teikyo) values (?, ?, ?, ?, ?, ?, ?, ?, ?)'; $prepare = $db->prepare($sql); $prepare->bindValue(1, 0, PDO::PARAM_STR); $prepare->bindValue(2, $nowtimes, PDO::PARAM_STR); $prepare->bindValue(3, $href, PDO::PARAM_STR); $prepare->bindValue(4, $title, PDO::PARAM_STR); $prepare->bindValue(5, $description, PDO::PARAM_STR); $prepare->bindValue(6, $tweets, PDO::PARAM_STR); $prepare->bindValue(7, 'cast( now() as datetime)', PDO::PARAM_STR); $prepare->bindValue(8, $sikibetu, PDO::PARAM_STR); $prepare->bindValue(9, $moto, PDO::PARAM_STR); $prepare->execute(); } catch (PDOException $e) { echo 'エラーが発生しました。内容: ' . h($e->getMessage()); } } ?>
---------------------------------------------------------------------------------------------------------------------
**************************************************************************************
参考にした書籍
CakePHP2 実践入門 (WEB+DB PRESS plus)
CakePHP2 実践入門 (WEB+DB PRESS plus)
作者: 安藤祐介,岸田健一郎,新原雅司,市川快,渡辺一宏,鈴木則夫
発売日: 2012/09/29
購入: 5人 クリック: 165回
Webアプリ開発を加速する CakePHP2定番レシピ119
Webアプリ開発を加速する CakePHP2定番レシピ119
**************************************************************************************
一番難しいところはtwitterログインとwebサイト連結でした。
ツイート数でランキングしてます、ネットの話題を見つけられます。
ホームページビルダーを使用しています。
今のホームページビルダーは昔と違って高機能ですね。
テンプレートも何種類もあって今はすごいです。
に分かれています。
今更cakephpを使っている人は少ないかもしれませんが、
twitterアカウントあるといつでも参加できますので、
みんな大好きPostgreSQL。
複数DBマルチテナントシステムを構築するなら忘れてはいけないコネクションプーリング。
大量コネクションを扱うなら都度forkやpre-fork式ではちょっと辛い、イベントベースが好ましい。
もうお分かりですね。pgbouncer1.6の話題です。
PostgreSQL界隈では有名なコネクションプーリングの実装が2つあります。 pgpool-II と pgbouncer。
ざっくり言うと高機能の pgpool-II に対して、軽量・大規模向けの pgbouncer という棲み分けがあると言えるでしょう。
pgpool-II は最近は日本の トレジャーデータ社の Prestogres ( https://github.com/treasure-data/prestogres ) という痺れるようなプロジェクトのベースとして採用されていることで名前を聞いたことのある方もいるのではないでしょうか。
pgbouncer は少し古いですが LastFM( http://www.lastfm.jp/user/Russ/journal/2008/02/21/zd_postgres_connection_pools:_pgpool_vs._pgbouncer )の事例が有名でしょう。Instagram も使ってますネ。
pgbouncerは現行のバージョンは1.5系で、最新は1.5.5です。1.6系は8月1日にリリースされ、複数DBマルチテナントシステムに向けた大規模な機能強化が行われています。
この1.6系では複数DBマルチテナントシステム開発者にとって嬉しい機能がたくさん搭載される予定です。本番運用に投入する前に一足お先にリリースノートを読んで夢を感じましょう。
本バージョン、2013年ぐらいからリリースノートは準備されているのにさっぱりリリースされなくて関係者をやきもきさせていました。(想像)
本記事では以下のリリースノートをもとにザックリ読み解いたものです。
http://pgbouncer.github.io/2015/08/pgbouncer-1-6/
・接続ユーザーやパスワードハッシュをDBからロードできるようになった
・プーリングモードの設定をデータベース毎、ユーザー毎に設定できるようになった
・データベース毎、ユーザー毎にコネクションの最大接続数を制御できるようになった
・新しいコネクション確立を避けるための DISABLE/ENABLE コマンドが追加された
・新しい推奨のDNSバックエンド c-ares が追加された
・設定ファイルに include ディレクティブを追加した
新しく以下のパラメータが追加された
1.5までのpgbouncerは userlist.txt というテキストに静的に接続ユーザを書かなければいけませんでした。
これは動的に接続先ユーザーが増えるようなマルチテナントシステムを構築するのに不向きという事です。
タイトルがすべてを物語ってます。柔軟にできますねぇ('∀`)
ただ、私にはちょっと有用な利用シーンが思いつかなかったです。
たとえば分析用ユーザーではトランザクションなんて使わないので statement モードにしてコネクションの消費を抑えたりできるという事でしょうか。
max_db_connections と max_user_connections という設定が追加されます。
テナント毎にユーザーを分けているような複数DBマルチテナントシステムにとって必須といえる機能です。
特定のユーザーのリクエストにコネクションをすべて占有されてしまい、他のユーザーにサービスできないという事態を避けることができるようになるでしょう。
特定のデータベースの新しいコネクション確立を抑止・再開することができます。
c-ares は名前解決の非同期化を行うためのライブラリです。c-aresは名前解決をブロックしないし、いろいろな方式の名前解決に対応している唯一のプロダクトとのこと。
名前解決をブロッキングしてしまうようではpgbouncerのような大規模向けシステムでは役に立たないのだというpgbouncerの強い意志を感じる。
というか、ドキュメントを見る限り pgbouncer は名前解決にかなりこだわりを持っているらしい。それだけそこが重要ということでしょう
(個人的には困ったことがないのでそこまでだわる理由はよくわからない。)。
UNIXドメインソケットで接続しているクライアントと、TCPまたはUNIXドメインソケットで接続しているサーバーでremote_pidを取得できるようになりました。
tcp serverの場合、pid はキャンセルキーから取得できる。(?ドキュメントから意味が読み取れず)
キャンセルキーとは何でしょうね。ちょっとリリースノートからは判断できませんでした。
pg_cancel_backend とかに使えるPIDだよという事なのでしょうか。
DBの数なんてもはや何台あるかわからない。ホスト名の解決はもはやDNSで行っておるよという皆様にとって必須の機能。
…なのでしょうが、ちょっとこの機能が必要となるようなシステムとはどんなものなのか、私も未経験なのでよくわからないです。
この設定は application_name_add_host=on にすることで有効となる。
今や接続元アプリケーション名がWebだとかBatchだとか区別できるだけで問題が解決するような時代ではない。
どのホスト(ポート)レベルで区別しないと。という事なんだろう。
「おお、Webサーバーから死ぬほど重いクエリが飛んでる、今すぐ調べないと!で、どのWebサーバーよ?100台あるんだぜ」みたいなときに助かりますね。
設定ファイルが大規模化してくると、切り出して整理したいという要望はどうしてもでてくるもの。
データベース毎、ユーザー毎に設定できる項目が増えてきたので必要になったという事でしょう。
以降はバグフィックスとかクリーンアップだとかで自分はあまり興味がないので各自読むように。
本番運用に突撃するPostgreSQL界の猛者の報告待ってます。
中小企業勤務のど素人です。平均年齢40歳くらいの昭和からある非IT企業です。
前任者が退職して、他に出来る人がいないという理由で、自社HPのインフラを担当することになりました
個人でレンタルサーバーのVPS契約してLAMP環境構築して、ごく単純なWEBサービスを公開していますが、
ググってでてきた手順を見よう見まねでやったので、基本を理解できてないので、怖いです。
WEBサーバーもDBサーバーもファイルサーバーも一緒の1つのサーバーです。
会社のサービスは、今までは会社にサーバーを置いてやってました。
リプレースが大変なのと、AWSはWEBサービスの業界標準のようなので、迷うことなくAWSにしていきたいです。
一人でやるのは怖いので、無理ですといったのですが、押しつけられました。
中小企業勤務のど素人です。平均年齢40歳くらいの昭和からある非IT企業です。
前任者が退職して、他に出来る人がいないという理由で、自社HPのインフラを担当することになりました
個人でレンタルサーバーのVPS契約してLAMP環境構築して、ごく単純なWEBサービスを公開していますが、
ググってでてきた手順を見よう見まねでやったので、基本を理解できてないので、怖いです。
WEBサーバーもDBサーバーもファイルサーバーも一緒の1つのサーバーです。
会社のサービスは、今までは会社にサーバーを置いてやってました。
リプレースが大変なのと、AWSはWEBサービスの業界標準のようなので、迷うことなくAWSにしていきたいです。
一人でやるのは怖いので、無理ですといったのですが、押しつけられました。
文系出身だけど前々からWebサービスつくってみたくて勉強がてら一人でWebサービス作ってみました。
作りたいって思うなら実際に作ってみるのが一番いいってじっちゃんがいってた。
やってみて感じたこととか先輩エンジニアの人たちに教えて欲しいこととかを書いていきたいと思います。
じっちゃん、僕にもできたよ!
EDM JACK
簡単に説明するとクラブミュージックを淡々と紹介していくサイト
・26歳
・フリーター(ほぼニート)→知人の会社で営業職→今年の4月にWeb業界へ転職。
・営業職だったころにあいた時間にドットインストールとかでHTML/CSSの勉強をしてた。
大学を中退してからフリーターになって、その頃から自分でWebサービスとかつくって運営してる人ってかっこいいな〜とか思ってた。
Facebookの映画とか見たときは完全に感化されっぱなしだった。
でもいつか作れたらいいな〜って思ってただけでなにもしてなかった。
最近いろいろ環境が変わって少し休みをもらえたので奮起して勉強がてら作ってみることにしたのです。
漠然と「Webサービス作りたい」って思ってたからまずどんなWebサービスを作るか考えました。
やっぱり好きなことじゃないと続かないと思ったので
自分が好きなクラブミュージックをまとめるサイトを作ることにしました。
ジャンルはDJ KAO●Iとかミーハーな感じの曲じゃなくてEDMってやつ。
EDMといえば今月日本でもUltra Music Festivalが開催されるね!やったね!Hardwellに会えるね!
まずはプログラミングとやらを勉強することにしました。ドットインストールは偉大です。お世話になりました。
ここでHTML/CSSとPHPを勉強しました。でもPHPでゼロからコードを書いて作ろうとすると重大な問題があることに気が付きました。
時間がかかりすぎる。
今回はとりあえず自分でなにかWebサービスを作ってみるということを経験したかったのでWordPressを使うことにしました。
でもさすがにレンタルサーバーを借りてWordPress入れましたっていうんじゃ先輩エンジニアの人たちに怒られちゃうと思ったので、
WordPressを入れるサーバーの環境構築は自分で頑張ってやってみることにしました。
なのでWeb業界ではアイドル的存在のAWSっていうやつで頑張ることにしました。
ここでもドットインストールにお世話になりました。ほんとなんでもチュートリアルがあってすごい。
最初はWebサーバーにApacheを入れていたんですが、なんか重たい感じがしていろいろ調べているとNginxがナウい感じだったので
Nginxでインスタンスを立て直すことしました。環境的にはこんな感じ。
Nginx 1.4.7
MySQL 5.6.13
ドットインストールでUnixコマンドとかを勉強したとはいってもNginxの設定周りをいじるのは結構大変でした。
でもNginx使うからにはチューニングしてから使わないとApache先生に怒られちゃうので、
チューニングテストをしたらTransfer Rateが17[Kbytes/sec] くらいから15000 [Kbytes/sec]くらいになった。
無事にサーバーが立てられたのでWordPressを突っ込んでテーマとかいろいろいじりました。
シェアボタンをつけたりFacebookのLikeBoxを入れたりでちょっとテーマいじった程度。
あ、カテゴリとタグにpickupってつけたら自動で投稿が目立つようにした。これは自分でテーマファイルいじって書いた。
入れたプラグインはこんな感じ。Jetpackはモバイルテーマのみを有効化してる。
アイキャッチ画像が多いからPhotonも有効化してもいいかなって悩んでる。
Akismet
All In One SEO Pack
Batch Category Import
Favicon Rotator
Font Awesome Icons
Mobile Theme Featured images for Jetpack
NextScripts: Social Networks Auto-Poster
Remote Images Grabber
Video Thumbnails
Wordpress Popular Posts
WordPress Related Posts
WordPressなのであとはたらたらと僕がオススメする曲を更新していくだけ。
EC2のt2.microだけど、Nginxのおかげなのか特に問題はなし。
今はYoutubeかSoundcloudのURLをそのまま投稿に入れて、アーティスト名とかDJ名でカテゴリ分けしてる。
せっかくだからドメイン代とかAWS代だけでも回収できればいいなってことでAdSenseも入れてみたw
実際に作り始めてから1週間程度でここまでつくることが出来ました。
ドットインストールがなかったらここまで速くつくれなかった。ありがとうございます田口さん。
元々非エンジニアでもやる気になればそれっぽいのが作れて感動しました。
でもなんかOGPの設定がうまくできず、Facebookとかでシェアしようとするとたまに全然関係ない画像が表示されてしまう。
テーマファイルに直接書いてもプラグインでOGP設定してもよくわからなかった。
Facebookのデバッガーつかってキャッシュクリアしてもできたりできなかったり。
将来的にはSoundcloudとMixcloudを足して2で割ったサイトになればいいな。
キュレーター制度とかも入れてみて、僕だけじゃなくていろんなEDM好きやDJがおすすめの曲を投稿できるようにしていきたい。
WordPressで構築しちゃったけどできるだけプラグインに頼らずに自分でPHP書いて実装できるように頑張らなきゃ。
本とかは一冊も読まずにここまで作れたけどPHPエンジニアならこれは読んどけよ若造ってのがあったら教えてください。
EDMは素晴らしいよ!クラブ好きな人もそうでない人もきっと好きになる曲が沢山あるから聞いてみてね!
EDM JACK